@onairos/react-native 3.7.1 โ†’ 3.7.3

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.
Files changed (241) hide show
  1. package/lib/commonjs/api/index.js +219 -9
  2. package/lib/commonjs/assets/icons/spotify.png +0 -0
  3. package/lib/commonjs/assets/images/spotify.png +0 -0
  4. package/lib/commonjs/components/BodyText.js +27 -9
  5. package/lib/commonjs/components/BrandMark.js +111 -10
  6. package/lib/commonjs/components/CodeInput.js +116 -9
  7. package/lib/commonjs/components/EmailInput.js +30 -8
  8. package/lib/commonjs/components/GoogleButton.js +56 -9
  9. package/lib/commonjs/components/HeadingGroup.js +43 -9
  10. package/lib/commonjs/components/LLMDataInputModal.js +664 -14
  11. package/lib/commonjs/components/ModalHeader.js +99 -9
  12. package/lib/commonjs/components/ModalSheet.js +47 -9
  13. package/lib/commonjs/components/Onairos.js +380 -14
  14. package/lib/commonjs/components/OnairosButton.js +313 -13
  15. package/lib/commonjs/components/OnairosSignInButton.js +130 -12
  16. package/lib/commonjs/components/Overlay.js +465 -13
  17. package/lib/commonjs/components/PersonaImage.js +137 -10
  18. package/lib/commonjs/components/PersonaLoadingScreen.js +318 -12
  19. package/lib/commonjs/components/PersonalizationConsentScreen.js +467 -13
  20. package/lib/commonjs/components/PinCreationScreen.js +403 -12
  21. package/lib/commonjs/components/PinInput.js +464 -9
  22. package/lib/commonjs/components/PlatformConnectorsStep.js +1311 -23
  23. package/lib/commonjs/components/PlatformList.js +137 -10
  24. package/lib/commonjs/components/PlatformToggle.js +180 -9
  25. package/lib/commonjs/components/PrimaryButton.js +180 -10
  26. package/lib/commonjs/components/SignInMatchAnimation.js +197 -9
  27. package/lib/commonjs/components/SignInStep.js +345 -12
  28. package/lib/commonjs/components/UniversalOnboarding.js +2780 -30
  29. package/lib/commonjs/components/VerificationStep.js +176 -11
  30. package/lib/commonjs/components/WelcomeScreen.js +461 -22
  31. package/lib/commonjs/components/icons/Basicproficon.js +37 -8
  32. package/lib/commonjs/components/icons/Basicprofile.js +21 -8
  33. package/lib/commonjs/components/icons/Checkbox.js +21 -8
  34. package/lib/commonjs/components/icons/Checkmark.js +27 -8
  35. package/lib/commonjs/components/icons/Contentanalysis.js +21 -8
  36. package/lib/commonjs/components/icons/Contenticon.js +39 -8
  37. package/lib/commonjs/components/icons/EnochE.js +41 -8
  38. package/lib/commonjs/components/icons/Personalityicon.js +30 -8
  39. package/lib/commonjs/components/icons/Personalityprofile.js +21 -8
  40. package/lib/commonjs/components/icons/Personalitytraits.js +21 -8
  41. package/lib/commonjs/components/icons/Userpreferences.js +21 -8
  42. package/lib/commonjs/components/icons/index.js +84 -17
  43. package/lib/commonjs/components/onboarding/OAuthWebView.js +1754 -18
  44. package/lib/commonjs/components/onboarding/OnboardingHeader.js +74 -10
  45. package/lib/commonjs/components/onboarding/PinInput.js +283 -10
  46. package/lib/commonjs/components/onboarding/PlatformConnector.js +249 -11
  47. package/lib/commonjs/config/PLATFORM_APIS.md +849 -0
  48. package/lib/commonjs/config/api.js +56 -7
  49. package/lib/commonjs/constants/index.js +120 -7
  50. package/lib/commonjs/context/AuthContext.js +345 -10
  51. package/lib/commonjs/hooks/useConnectedAccounts.js +111 -9
  52. package/lib/commonjs/hooks/useConnections.js +102 -8
  53. package/lib/commonjs/hooks/useCredentials.js +178 -10
  54. package/lib/commonjs/hooks/useUserConnections.js +148 -10
  55. package/lib/commonjs/index.js +439 -34
  56. package/lib/commonjs/services/apiClient.js +298 -8
  57. package/lib/commonjs/services/biometricPinService.js +180 -8
  58. package/lib/commonjs/services/chatGPTConversationExtractor.js +155 -8
  59. package/lib/commonjs/services/chatGPTConversationService.js +275 -9
  60. package/lib/commonjs/services/claudeConversationExtractor.js +103 -8
  61. package/lib/commonjs/services/claudeConversationService.js +158 -9
  62. package/lib/commonjs/services/connectedAccountsService.js +310 -10
  63. package/lib/commonjs/services/googleAuthService.js +252 -11
  64. package/lib/commonjs/services/hingeDataExtractor.js +105 -8
  65. package/lib/commonjs/services/hingeDataService.js +150 -9
  66. package/lib/commonjs/services/imageCompressionService.js +260 -7
  67. package/lib/commonjs/services/instagramDataExtractor.js +126 -8
  68. package/lib/commonjs/services/instagramDataService.js +163 -9
  69. package/lib/commonjs/services/jwtStorageService.js +276 -7
  70. package/lib/commonjs/services/linkedinDOMExtractor.js +245 -7
  71. package/lib/commonjs/services/linkedinProfileService.js +222 -9
  72. package/lib/commonjs/services/linkedinScrapingService.js +230 -8
  73. package/lib/commonjs/services/llmDataStorage.js +294 -8
  74. package/lib/commonjs/services/mobileTrainingService.js +186 -8
  75. package/lib/commonjs/services/netflixDataExtractor.js +120 -8
  76. package/lib/commonjs/services/netflixDataService.js +198 -9
  77. package/lib/commonjs/services/pinEncryptionService.js +84 -8
  78. package/lib/commonjs/services/pinStorageUtils.js +105 -7
  79. package/lib/commonjs/services/platformAuthService.js +1484 -12
  80. package/lib/commonjs/services/sephoraDataExtractor.js +140 -8
  81. package/lib/commonjs/services/sephoraDataService.js +200 -9
  82. package/lib/commonjs/services/spotifyDataExtractor.js +148 -8
  83. package/lib/commonjs/services/spotifyDataService.js +241 -9
  84. package/lib/commonjs/services/storageService.js +404 -8
  85. package/lib/commonjs/services/telegramDataExtractor.js +115 -8
  86. package/lib/commonjs/services/telegramDataService.js +499 -9
  87. package/lib/commonjs/services/trainingApiHelpers.js +73 -7
  88. package/lib/commonjs/services/userConnectionsService.js +340 -10
  89. package/lib/commonjs/services/youtubeMigrationService.js +416 -10
  90. package/lib/commonjs/theme/index.js +250 -7
  91. package/lib/commonjs/types/ambient.d.js +2 -1
  92. package/lib/commonjs/types/declarations.d.js +2 -1
  93. package/lib/commonjs/types/index.js +6 -1
  94. package/lib/commonjs/types/node-fix.d.js +2 -1
  95. package/lib/commonjs/types/node-override.d.js +2 -1
  96. package/lib/commonjs/types/opacity.d.js +2 -1
  97. package/lib/commonjs/types.js +14 -1
  98. package/lib/commonjs/utils/Portal.js +98 -8
  99. package/lib/commonjs/utils/api.js +130 -9
  100. package/lib/commonjs/utils/assetRegistry.js +210 -35
  101. package/lib/commonjs/utils/auth.js +112 -9
  102. package/lib/commonjs/utils/connectorTests.js +613 -29
  103. package/lib/commonjs/utils/crypto.js +62 -8
  104. package/lib/commonjs/utils/debugHelper.js +64 -1
  105. package/lib/commonjs/utils/encryption.js +76 -7
  106. package/lib/commonjs/utils/eventUtils.js +288 -1
  107. package/lib/commonjs/utils/haptics.js +66 -9
  108. package/lib/commonjs/utils/imagePreloader.js +6 -1
  109. package/lib/commonjs/utils/networkDiagnostics.js +226 -8
  110. package/lib/commonjs/utils/onairosApi.js +350 -9
  111. package/lib/commonjs/utils/programmaticFlow.js +117 -9
  112. package/lib/commonjs/utils/retryHelper.js +220 -1
  113. package/lib/commonjs/utils/secureStorage.js +349 -10
  114. package/lib/commonjs/utils/webviewScripts/chatgpt.js +551 -1
  115. package/lib/commonjs/utils/webviewScripts/claude.js +376 -1
  116. package/lib/commonjs/utils/webviewScripts/hinge.js +411 -1
  117. package/lib/commonjs/utils/webviewScripts/index.js +698 -15
  118. package/lib/commonjs/utils/webviewScripts/instagram.js +454 -1
  119. package/lib/commonjs/utils/webviewScripts/linkedin.js +880 -1
  120. package/lib/commonjs/utils/webviewScripts/netflix.js +382 -1
  121. package/lib/commonjs/utils/webviewScripts/sephora.js +516 -1
  122. package/lib/commonjs/utils/webviewScripts/spotify.js +419 -1
  123. package/lib/commonjs/utils/webviewScripts/telegram.js +678 -1
  124. package/lib/module/api/index.js +211 -1
  125. package/lib/module/assets/icons/spotify.png +0 -0
  126. package/lib/module/assets/images/spotify.png +0 -0
  127. package/lib/module/components/BodyText.js +20 -1
  128. package/lib/module/components/BrandMark.js +104 -1
  129. package/lib/module/components/CodeInput.js +109 -1
  130. package/lib/module/components/EmailInput.js +23 -1
  131. package/lib/module/components/GoogleButton.js +49 -1
  132. package/lib/module/components/HeadingGroup.js +36 -1
  133. package/lib/module/components/LLMDataInputModal.js +656 -7
  134. package/lib/module/components/ModalHeader.js +92 -1
  135. package/lib/module/components/ModalSheet.js +39 -1
  136. package/lib/module/components/Onairos.js +373 -1
  137. package/lib/module/components/OnairosButton.js +305 -1
  138. package/lib/module/components/OnairosSignInButton.js +121 -1
  139. package/lib/module/components/Overlay.js +456 -1
  140. package/lib/module/components/PersonaImage.js +129 -1
  141. package/lib/module/components/PersonaLoadingScreen.js +310 -1
  142. package/lib/module/components/PersonalizationConsentScreen.js +460 -1
  143. package/lib/module/components/PinCreationScreen.js +396 -1
  144. package/lib/module/components/PinInput.js +456 -1
  145. package/lib/module/components/PlatformConnectorsStep.js +1302 -6
  146. package/lib/module/components/PlatformList.js +129 -1
  147. package/lib/module/components/PlatformToggle.js +173 -1
  148. package/lib/module/components/PrimaryButton.js +172 -1
  149. package/lib/module/components/SignInMatchAnimation.js +189 -1
  150. package/lib/module/components/SignInStep.js +338 -1
  151. package/lib/module/components/UniversalOnboarding.js +2770 -1
  152. package/lib/module/components/VerificationStep.js +168 -1
  153. package/lib/module/components/WelcomeScreen.js +453 -1
  154. package/lib/module/components/icons/Basicproficon.js +30 -1
  155. package/lib/module/components/icons/Basicprofile.js +14 -1
  156. package/lib/module/components/icons/Checkbox.js +14 -1
  157. package/lib/module/components/icons/Checkmark.js +20 -1
  158. package/lib/module/components/icons/Contentanalysis.js +14 -1
  159. package/lib/module/components/icons/Contenticon.js +32 -1
  160. package/lib/module/components/icons/EnochE.js +34 -1
  161. package/lib/module/components/icons/Personalityicon.js +23 -1
  162. package/lib/module/components/icons/Personalityprofile.js +14 -1
  163. package/lib/module/components/icons/Personalitytraits.js +14 -1
  164. package/lib/module/components/icons/Userpreferences.js +14 -1
  165. package/lib/module/components/icons/index.js +13 -1
  166. package/lib/module/components/onboarding/OAuthWebView.js +1746 -1
  167. package/lib/module/components/onboarding/OnboardingHeader.js +66 -1
  168. package/lib/module/components/onboarding/PinInput.js +274 -1
  169. package/lib/module/components/onboarding/PlatformConnector.js +240 -1
  170. package/lib/module/config/PLATFORM_APIS.md +849 -0
  171. package/lib/module/config/api.js +47 -1
  172. package/lib/module/constants/index.js +114 -1
  173. package/lib/module/context/AuthContext.js +335 -1
  174. package/lib/module/hooks/useConnectedAccounts.js +106 -1
  175. package/lib/module/hooks/useConnections.js +95 -1
  176. package/lib/module/hooks/useCredentials.js +171 -6
  177. package/lib/module/hooks/useUserConnections.js +140 -1
  178. package/lib/module/index.js +172 -1
  179. package/lib/module/services/apiClient.js +295 -1
  180. package/lib/module/services/biometricPinService.js +169 -1
  181. package/lib/module/services/chatGPTConversationExtractor.js +149 -1
  182. package/lib/module/services/chatGPTConversationService.js +268 -1
  183. package/lib/module/services/claudeConversationExtractor.js +97 -1
  184. package/lib/module/services/claudeConversationService.js +151 -1
  185. package/lib/module/services/connectedAccountsService.js +293 -1
  186. package/lib/module/services/googleAuthService.js +241 -1
  187. package/lib/module/services/hingeDataExtractor.js +99 -1
  188. package/lib/module/services/hingeDataService.js +143 -1
  189. package/lib/module/services/imageCompressionService.js +250 -1
  190. package/lib/module/services/instagramDataExtractor.js +120 -1
  191. package/lib/module/services/instagramDataService.js +156 -1
  192. package/lib/module/services/jwtStorageService.js +257 -1
  193. package/lib/module/services/linkedinDOMExtractor.js +234 -1
  194. package/lib/module/services/linkedinProfileService.js +210 -1
  195. package/lib/module/services/linkedinScrapingService.js +219 -1
  196. package/lib/module/services/llmDataStorage.js +277 -1
  197. package/lib/module/services/mobileTrainingService.js +173 -1
  198. package/lib/module/services/netflixDataExtractor.js +114 -1
  199. package/lib/module/services/netflixDataService.js +191 -1
  200. package/lib/module/services/pinEncryptionService.js +74 -6
  201. package/lib/module/services/pinStorageUtils.js +93 -1
  202. package/lib/module/services/platformAuthService.js +1461 -1
  203. package/lib/module/services/sephoraDataExtractor.js +134 -1
  204. package/lib/module/services/sephoraDataService.js +193 -1
  205. package/lib/module/services/spotifyDataExtractor.js +142 -1
  206. package/lib/module/services/spotifyDataService.js +234 -1
  207. package/lib/module/services/storageService.js +383 -1
  208. package/lib/module/services/telegramDataExtractor.js +109 -1
  209. package/lib/module/services/telegramDataService.js +493 -1
  210. package/lib/module/services/trainingApiHelpers.js +67 -1
  211. package/lib/module/services/userConnectionsService.js +329 -1
  212. package/lib/module/services/youtubeMigrationService.js +405 -1
  213. package/lib/module/theme/index.js +245 -1
  214. package/lib/module/types.js +10 -1
  215. package/lib/module/utils/Portal.js +90 -1
  216. package/lib/module/utils/api.js +118 -1
  217. package/lib/module/utils/assetRegistry.js +200 -34
  218. package/lib/module/utils/auth.js +100 -1
  219. package/lib/module/utils/connectorTests.js +600 -27
  220. package/lib/module/utils/crypto.js +54 -1
  221. package/lib/module/utils/debugHelper.js +54 -1
  222. package/lib/module/utils/encryption.js +67 -1
  223. package/lib/module/utils/eventUtils.js +270 -1
  224. package/lib/module/utils/haptics.js +59 -8
  225. package/lib/module/utils/imagePreloader.js +3 -1
  226. package/lib/module/utils/networkDiagnostics.js +217 -1
  227. package/lib/module/utils/onairosApi.js +333 -1
  228. package/lib/module/utils/programmaticFlow.js +111 -1
  229. package/lib/module/utils/retryHelper.js +211 -1
  230. package/lib/module/utils/secureStorage.js +330 -6
  231. package/lib/module/utils/webviewScripts/chatgpt.js +545 -1
  232. package/lib/module/utils/webviewScripts/claude.js +370 -1
  233. package/lib/module/utils/webviewScripts/hinge.js +405 -1
  234. package/lib/module/utils/webviewScripts/index.js +434 -1
  235. package/lib/module/utils/webviewScripts/instagram.js +448 -1
  236. package/lib/module/utils/webviewScripts/linkedin.js +874 -1
  237. package/lib/module/utils/webviewScripts/netflix.js +376 -1
  238. package/lib/module/utils/webviewScripts/sephora.js +510 -1
  239. package/lib/module/utils/webviewScripts/spotify.js +413 -1
  240. package/lib/module/utils/webviewScripts/telegram.js +672 -1
  241. package/package.json +2 -2
@@ -1,12 +1,1484 @@
1
- 'use strict';
2
- // Onairos SDK - Asset Registry (auto-generated)
3
- var __ONAIROS_REQ_REGISTRY__ = [
4
- require("react-native"),
5
- require("@react-native-google-signin/google-signin"),
6
- require("@react-native-async-storage/async-storage"),
7
- require("../config/api"),
8
- require("./apiKeyService"),
9
- require("./jwtStorageService")
10
- ];
11
- function __ONAIROS_REQ_FUNC__(i) { return __ONAIROS_REQ_REGISTRY__[i]; }
12
- Object[_0x5564(0x0)](exports,'__esModule',{'value':!![]}),exports['verifyEmailCode']=exports[_0x5564(0x1)]=exports['testApiConnectivity']=exports[_0x5564(0x2)]=exports[_0x5564(0x3)]=exports[_0x5564(0x4)]=exports[_0x5564(0x5)]=exports[_0x5564(0x6)]=exports[_0x5564(0x7)]=exports[_0x5564(0x8)]=exports[_0x5564(0x9)]=exports[_0x5564(0xa)]=exports[_0x5564(0xb)]=exports[_0x5564(0xc)]=exports[_0x5564(0xd)]=exports[_0x5564(0xe)]=void 0x0;var _reactNative=__ONAIROS_REQ_FUNC__(0x0),_googleSignin=__ONAIROS_REQ_FUNC__(0x1),_asyncStorage=_interopRequireDefault(__ONAIROS_REQ_FUNC__(0x2)),_api=__ONAIROS_REQ_FUNC__(0x3),_apiKeyService=__ONAIROS_REQ_FUNC__(0x4),_jwtStorageService=__ONAIROS_REQ_FUNC__(0x5);function _interopRequireDefault(_0x19f666){return _0x19f666&&_0x19f666[_0x5564(0xf)]?_0x19f666:{'default':_0x19f666};}function _0x1f2f(){const _0x3f3676=['defineProperty','testYouTubeRefreshToken','requestEmailVerification','refreshYouTubeTokens','reconnectYouTube','isOAuthCallback','initiateOAuth','initiateNativeAuth','initializePlatformAuthService','hasNativeSDK','forceYouTubeReconnectionWithRevoke','forceYouTubeReconnectionWithConsent','fixUserYouTubeConnection','exchangeCodeForToken','checkEmailVerificationStatus','__esModule','FTSNR','fHLSs','No\x20API\x20key\x20configured.\x20Please\x20initialize\x20the\x20SDK\x20with\x20a\x20valid\x20developer\x20API\x20key.','3.0.72','eRWIu','XcDXr','VCKDB','apiKey','Qjmkm','log','๐Ÿ”ง\x20Platform\x20auth\x20service\x20initialized','GtVTg','getApiHeaders','Bearer\x20','1030678346906-lovkuds2ouqmoc8eu5qpo98spa6edv4o.apps.googleusercontent.com','onairosevents://auth/callback','code','API_CONFIG','BASE_URL','demo_reddit_client_id','identity,read','/pinterest/authorize','boards:read,pins:read','demo_facebook_client_id','public_profile,email','/linkedin/authorize','openid\x20profile\x20email','/gmail/authorize','demo_gmail_client_id','https://www.googleapis.com/auth/gmail.readonly','/email/authorize','https://chat.openai.com','https://claude.ai/login','https://hinge.co','https://www.sephora.com','eQDjE','yCBOH','Network\x20error.\x20Please\x20check\x20your\x20connection\x20and\x20try\x20again.','Facebook\x20Login\x20completed\x20successfully','โ„น๏ธ\x20No\x20existing\x20permissions\x20to\x20revoke:','โš ๏ธ\x20Failed\x20to\x20fetch\x20YouTube\x20channel\x20info:','๐ŸŒ\x20[CONNECTIVITY]\x20Test\x201:\x20Checking\x20general\x20internet\x20(google.com)...','JpNIi','https://www.google.com','HEAD','reachable','โœ…\x20[CONNECTIVITY]\x20Google\x20is\x20reachable\x20-\x20internet\x20is\x20working','WrdCp','VMoyS','โŒ\x20[CONNECTIVITY]\x20Cannot\x20reach\x20Google\x20-\x20internet\x20may\x20be\x20down:','๐ŸŒ\x20[CONNECTIVITY]\x20Test\x202:\x20Checking\x20API\x20server...','sujcd','thyOB','โœ…\x20[CONNECTIVITY]\x20API\x20server\x20is\x20reachable','API\x20is\x20reachable','bfjIr','๐Ÿ”Œ\x20[CONNECTIVITY]\x20Running\x20comprehensive\x20network\x20diagnostics...','ZFvBZ','VHTVd','vDoqE','xXKXV','googleTest','wJjFd','error','โŒ\x20Error\x20requesting\x20email\x20verification:','vIWTN','vpbSk','hUPEM','message','TNdOd','LSDYc','zruDZ','OjJWo','/health','signal','text','api2Test','status','substring','IXnBn','kcHIG','name','ScDyG','ZSzzO','HBoWf','success','HTPls','syDwn','Network\x20error:\x20','yKZXq','data','NkkjR','user','jGUtQ','QjbfA','testApiConnectivity','โŒ\x20Sign-in\x20already\x20in\x20progress','โŒ\x20[CONNECTIVITY]\x20Cannot\x20reach\x20API\x20server:','โœ…\x20Found\x20existing\x20authentication\x20token\x20for\x20YouTube\x20auth','๐Ÿ”‘\x20Token\x20preview:','UOeen','email','yRuvl','aqFUg','๐Ÿ“ง\x20[OAUTH]\x20Email\x20platform\x20selected,\x20returning\x20mock\x20auth\x20URL','OdBDZ','IMILV','LKLbV','ZbBsz','AbortError','Network\x20request\x20failed','\x20\x20\x205.\x20iOS\x20simulator\x20network\x20sandbox\x20issue\x20-\x20try\x20on\x20physical\x20device','\x20\x20\x203.\x20DNS\x20resolution\x20failed','biqpS','jlqNu','๐Ÿ“ฑ\x20[OAUTH]\x20Platform:\x20','Platform','Version','hnkDE','asBgd','uWRkS','yaCaZ','VqFrl','JqRfG','๐Ÿ”‘\x20[OAUTH]\x20Using\x20User\x20JWT\x20for\x20authentication','PSHtV','โŒ\x20[OAUTH]\x20User\x20not\x20authenticated\x20-\x20cannot\x20initiate\x20','\x20OAuth','โŒ\x20[OAUTH]\x20Please\x20log\x20in\x20first\x20before\x20connecting\x20platforms','VlgOJ','๐Ÿ”—\x20[OAUTH]\x20About\x20to\x20make\x20fetch\x20request...','toISOString','๐Ÿ“ค\x20[OAUTH]\x20Request\x20body:','โฐ\x20[OAUTH]\x20Request\x20timeout\x20for\x20','\x20-\x20aborting','abort','stringify','๐Ÿ“ก\x20[OAUTH]\x20Response\x20status:\x20','โŒ\x20[OAUTH]\x20Error\x20initiating\x20OAuth\x20for\x20','\x20-\x20','๐Ÿ“‹\x20[OAUTH]\x20Response\x20data\x20for\x20','URL','url','๐Ÿ”—\x20[OAUTH]\x20Auth\x20URL\x20for\x20','\x20(key:\x20','bTtwH','CCfXO','xKLQI','yPgWi','โŒ\x20[OAUTH]\x20Request\x20timeout\x20for\x20','\x20-\x20the\x20server\x20took\x20too\x20long\x20to\x20respond','YeRZR','includes','gfWaL','JDiZx','fuUFI','qWFTI','LQdUj','1|0|3|5|2|4','split','TFfuQ','โŒ\x20[OAUTH]\x20Network\x20request\x20failed\x20for\x20','ykmMC','TAqGE','configure','GnUYa','openid','Falling\x20back\x20to\x20simulated\x20token\x20response','โœ…\x20YouTube\x20channel\x20found:','ID:','User\x20cancelled\x20Google\x20Sign-In','\x20\x20\x202.\x20API\x20server\x20(API\x20server)\x20is\x20unreachable','\x20\x20\x204.\x20SSL/TLS\x20certificate\x20issue','โœ…\x20Refresh\x20token\x20confirmed:','๐Ÿ”„\x20FORCING\x20fresh\x20YouTube\x20consent\x20for\x20refresh\x20token...','๐Ÿ‘ค\x20User:','KBtis','โœ…\x20Signed\x20out\x20-\x20consent\x20cache\x20cleared','โ„น๏ธ\x20Sign\x20out\x20not\x20needed:','uMUhS','profile','โœ…\x20Play\x20Services\x20available','๐Ÿ”\x20Initiating\x20sign-in\x20-\x20consent\x20screen\x20should\x20appear...','๐Ÿ“‹\x20FULL\x20userInfo\x20object\x20from\x20forceYouTubeReconnectionWithConsent:','๐Ÿ“‹\x20FULL\x20tokens\x20object\x20from\x20forceYouTubeReconnectionWithConsent:','๐Ÿ“‹\x20FULL\x20currentUser\x20object\x20from\x20forceYouTubeReconnectionWithConsent:','-\x20Access\x20token:','Missing','-\x20ID\x20token:','โœ…\x20SUCCESS:\x20Got\x20refresh\x20token\x20after\x20consent!','๐Ÿ”‘\x20Refresh\x20token\x20type:','refreshToken','https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true','RiFPg','WISaF','โš ๏ธ\x20No\x20YouTube\x20channel\x20found\x20for\x20user','No\x20Channel','jWLnJ','โš ๏ธ\x20Error\x20fetching\x20YouTube\x20channel\x20info:','๐Ÿ”\x20Creating\x20authentication\x20token\x20for\x20YouTube\x20connection...','temp_token_for_youtube_connection','youtube','signOut_and_configure','๐Ÿš€\x20[YOUTUBE\x20REAUTH]\x20Headers:','NO\x20AUTH\x20TOKEN','๐Ÿš€\x20[YOUTUBE\x20REAUTH]\x20Payload\x20Summary:','๐Ÿ“ก\x20[YOUTUBE\x20REAUTH]\x20Response\x20Status:','๐Ÿ“ก\x20[YOUTUBE\x20REAUTH]\x20Response\x20Status\x20Text:','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Refresh\x20token\x20sent:','Yes','๐ŸŽ‰\x20[YOUTUBE\x20REAUTH]\x20SUCCESS:\x20Temporary\x20YouTube\x20connection\x20established!','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Connection\x20Details:','AssPE','6|4|2|3|0|5|1','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Refresh\x20token\x20length:','๐ŸŽ‰\x20[YOUTUBE\x20REAUTH]\x20SUCCESS:\x20Full\x20YouTube\x20connection\x20with\x20refresh\x20tokens!','โœ…\x20[YOUTUBE\x20REAUTH]\x20Response\x20hasRefreshToken:','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Refresh\x20token\x20type:','serverAuthCode','โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20Backend\x20did\x20NOT\x20confirm\x20refresh\x20token\x20reception','โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20Expected\x20hasRefreshToken\x20or\x20refreshTokenReceived\x20in\x20response','๐Ÿ”„\x20[YOUTUBE\x20REAUTH]\x20Signaling\x20training\x20system\x20to\x20restart...','โœ…\x20[YOUTUBE\x20REAUTH]\x20Training\x20restart\x20signal\x20sent\x20successfully','โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20Training\x20restart\x20signal\x20failed:','โŒ\x20[YOUTUBE\x20REAUTH]\x20Backend\x20processing\x20FAILED:','โŒ\x20[YOUTUBE\x20REAUTH]\x20This\x20means\x20the\x20reauth\x20signal\x20was\x20not\x20processed','\x20\x20\x201.\x20Try\x20the\x20revoke\x20method:\x20forceYouTubeReconnectionWithRevoke()','๐Ÿ’ก\x20Solutions:','\x20\x20\x203.\x20Ensure\x20user\x20clicks\x20\x22Allow\x22\x20on\x20consent\x20screen','\x20\x20\x202.\x20Check\x20Google\x20Console\x20OAuth\x20configuration','โŒ\x20This\x20means\x20consent\x20screen\x20did\x20not\x20appear\x20or\x20user\x20denied\x20permissions','โŒ\x20Error\x20forcing\x20YouTube\x20consent:','๐Ÿ’ก\x20User\x20must\x20click\x20\x22Allow\x22\x20to\x20get\x20refresh\x20token','Bihwq','โŒ\x20Google\x20Play\x20Services\x20not\x20available','jWFsC','LRCls','XyhsF','ZxhvL','VmDUy','Error\x20exchanging\x20code\x20for\x20token:','nnaAb','_access_token_','random','_refresh_token_','toString','zgqJK','GoogleSignin','accessToken','clearCachedAccessToken','โœ…\x20Token\x20cache\x20cleared','sVCkT','snippet','title','aXchP','๐Ÿ”ง\x20Configuring\x20Google\x20Sign-In\x20for\x20forced\x20consent...','RHyBF','IkwIi','Ltnok','cRmCX','gOdNF','ltLsP','signIn','EPHPY','WDykT','PFWMa','getTokens','getCurrentUser','MhjEA','yTzhH','OVKWR','๐Ÿ”\x20Token\x20analysis:','TJuEz','...','iwBYu','dOgZm','-\x20ServerAuthCode\x20(userInfo):','-\x20ServerAuthCode\x20(currentUser):','oQwzo','HdCxf','CiBoX','NTiJM','VTFCC','startsWith','๐Ÿ”‘\x20Refresh\x20token\x20preview:','yLLTv','fcKbm','bHWqp','๐Ÿ“บ\x20Fetching\x20YouTube\x20channel\x20information...','FehvU','json','CeAiT','items','length','yrMVM','isApiKeyInitialized','getApiConfig','zJmdR','qrOCB','OHvvg','PmMDh','TOumP','qSvOX','nzniU','OvgtE','deTUE','VMgQK','Unknown\x20Channel','uJnUn','โŒ\x20Error\x20testing\x20YouTube\x20refresh\x20token:','TPduH','zoxyj','foOsP','0|3|1|2|4|5','.\x20Possible\x20causes:','iDrLG','zuRJQ','UzdOr','VJKwx','tOVvz','lqdTG','SXTEb','IfVvM','getJWT','trim','OTzSB','CfDxH','TvAzR','Token\x20exchange\x20failed\x20with\x20status\x20','Zwvtf','ewzSn','tsdXZ','rRBvY','idToken','WdHza','cjXLU','youtube-','pAHmq','JmVan','now','๐Ÿ“ค\x20Sending\x20comprehensive\x20payload\x20with\x20REFRESH\x20TOKEN\x20to\x20backend:','debugInfo','refreshTokenType','cCsoh','๐Ÿš€\x20[YOUTUBE\x20REAUTH]\x20=====\x20SENDING\x20REAUTH\x20SIGNAL\x20TO\x20BACKEND\x20=====','๐Ÿš€\x20[YOUTUBE\x20REAUTH]\x20Endpoint:\x20https://API\x20server/youtube/native-auth','PwLEj','SuhKq','nlpeF','/youtube/native-auth','eBEOW','OEryw','VypwN','statusText','headers','FJrZv','CCHnE','validation','GVaQv','isTemporaryMode','lQqlu','GBKHK','temporaryMode','LsgKw','enabled','NNeJJ','RgMzk','GQqMd','TGXey','๐Ÿ”„\x20[YOUTUBE\x20REAUTH]\x20YouTube\x20connected\x20in\x20temporary\x20mode','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Training\x20Ready:\x20Yes','โŒ\x20No\x20current\x20Google\x20user\x20found','RWOTG','lCBKx','XWLPi','Wxssz','fazFI','hasRefreshToken','rFRYd','PtQDw','warn','MfwrN','LGatd','augab','โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20User\x20may\x20need\x20to\x20manually\x20restart\x20training','vsgGX','wBKNR','TIYEg','PFdlO','Isocx','RDoXd','UNiTv','kcWMO','statusCodes','SIGN_IN_CANCELLED','โŒ\x20User\x20cancelled\x20sign-in\x20-\x20no\x20refresh\x20token\x20obtained','SEcDn','SKrCI','PLAY_SERVICES_NOT_AVAILABLE','ZVprV','Mpisf','TYBFX','code=','โœ…\x20Got\x20serverAuthCode\x20from\x20sign-in\x20response','๐Ÿ”„\x20FORCING\x20YouTube\x20consent\x20via\x20REVOKE\x20method...','OQTcX','โœ…\x20Signed\x20out\x20completely','fZrpN','ChQgN','โŒ\x20Still\x20no\x20refresh\x20token\x20after\x20revoke\x20method','rxTkL','hasPlayServices','XJYSz','nPHXi','bhYXs','ZUcNg','โœ…\x20Revoked\x20existing\x20permissions\x20-\x20fresh\x20consent\x20REQUIRED','ENkpa','XCFOg','mxcsd','bhzxo','signOut','nzsCS','FsiVs','โœ…\x20SUCCESS:\x20Got\x20refresh\x20token\x20after\x20REVOKE\x20+\x20consent!','RFnSI','FSMRn','ifnja','UhqOH','โŒ\x20Debug\x20tokens\x20failed:','huzZl','mgFlQ','๐Ÿ”„\x20Method\x202:\x20Trying\x20forced\x20consent\x20via\x20revoke...','๐Ÿ”ง\x20Fixing\x20YouTube\x20connection\x20for\x20user:\x20','dbvbx','\x20YouTube\x20connection\x20fixed\x20via\x20Method\x201!','BpPdI','Iakat','\x20YouTube\x20connection\x20fixed\x20via\x20Method\x202!','โŒ\x20Failed\x20to\x20fix\x20','\x20YouTube\x20connection\x20with\x20both\x20methods','โŒ\x20Re-authentication\x20also\x20failed:','Initiating\x20Facebook\x20Login\x20for\x20Instagram','โœ…\x20Successfully\x20refreshed\x20Google\x20tokens','AQCxC','๐Ÿ”„\x20Refresh\x20failed,\x20attempting\x20re-authentication...','bJgRu','nvsAN','โŒ\x20User\x20not\x20signed\x20in\x20to\x20Google,\x20cannot\x20refresh\x20tokens','meoiz','KQCxl','AWATF','โœ…\x20Re-authentication\x20successful','CYHUO','YyyTX','ivmEG','yAhGw','kuOXa','HVDDI','WwKQL','jKddd','USxpX','fleco','none','Present','PgdVQ','JeFky','jCgDI','XGTPi','pIcRK','oArOw','vrSUs','cWGVX','RdKlk','ujCIG','No\x20internet\x20connectivity\x20detected.\x20Check\x20your\x20network\x20connection.','โŒ\x20Error\x20verifying\x20email\x20code:','HSkiq','gSmgJ','lPAhE','โœ…\x20Signed\x20out\x20from\x20Google','โ„น๏ธ\x20Token\x20clearing\x20failed\x20or\x20not\x20needed:','zJaEB','โœ…\x20YouTube\x20reconnected\x20successfully\x20with\x20refresh\x20token','โš ๏ธ\x20Still\x20no\x20refresh\x20token\x20after\x20reconnection','YKRiS','YbZnn','IFyrn','zmMjv','๐Ÿ”„\x20Forcing\x20fresh\x20YouTube\x20reconnection\x20for\x20refresh\x20token...','Sfyru','aCmwy','PZTiP','jxNSE','hemBM','โœ…\x20Cleared\x20cached\x20access\x20token','RqExf','YBMIZ','OfboC','vnQoU','LEdVL','fGELA','kEKxf','kBhrM','RWrxP','HUNsk','cQEPm','qWbiM','DzhOK','โŒ\x20YouTube\x20reconnection\x20failed','COMTS','โ„น๏ธ\x20Sign\x20out\x20not\x20needed\x20or\x20failed:','โœ…\x20[YOUTUBE\x20AUTH]\x20Full\x20YouTube\x20connection\x20with\x20persistent\x20access','\x20\x20\x201.\x20No\x20internet\x20connection\x20on\x20device/simulator','โœ…\x20[YOUTUBE\x20REAUTH]\x20Training\x20will\x20work,\x20but\x20connection\x20expires\x20in\x20~1\x20hour','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Mode:\x20Temporary\x20(expires\x20~1\x20hour)','IBDhf','๐Ÿ”—\x20Initiating\x20native\x20Google\x20Sign-In\x20for\x20YouTube','CLtln','โŒ\x20[YOUTUBE\x20AUTH]\x20Username\x20is\x20required\x20for\x20YouTube\x20authentication','csqvK','EAljH','โœ…\x20Google\x20Sign-In\x20successful:','๐Ÿ“‹\x20FULL\x20userInfo\x20object:','๐Ÿ”‘\x20Got\x20Google\x20tokens','๐Ÿ“‹\x20FULL\x20tokens\x20object:','๐Ÿ“‹\x20FULL\x20currentUser\x20object:','-\x20tokens.idToken:','-\x20tokens.accessToken:','โœ…\x20Got\x20serverAuthCode\x20(refresh\x20token\x20mechanism)','UKbdg','โŒ\x20CRITICAL:\x20No\x20refresh\x20token\x20available\x20-\x20YouTube\x20connection\x20will\x20fail\x20when\x20token\x20expires','โš ๏ธ\x20Continuing\x20without\x20refresh\x20token\x20-\x20connection\x20may\x20fail\x20later','ekqTI','โœ…\x20Refresh\x20token\x20available\x20for\x20YouTube\x20connection','mOlEa','sNENo','tnCro','onairos_username','youtube_user','โ„น๏ธ\x20No\x20valid\x20authentication\x20token\x20found\x20for\x20YouTube\x20connection','โ„น๏ธ\x20NOTE:\x20SDK\x20does\x20not\x20create\x20users\x20during\x20YouTube\x20connection','๐Ÿ”—\x20Linking\x20YouTube\x20data\x20to\x20user:','๐Ÿ”‘\x20Using\x20auth\x20token\x20for\x20linking:','apple','-\x20hasAccessToken:','-\x20hasServerAuthCode:','-\x20channelName:','๐Ÿ“‹\x20COMPLETE\x20BACKEND\x20PAYLOAD:','๐Ÿ“ก\x20Backend\x20response\x20status:','โœ…\x20YouTube\x20connection\x20successful','๐Ÿ“‹\x20COMPLETE\x20BACKEND\x20RESPONSE:','temporary\x20access\x20token\x20mode','JBrTr','aVVKo','โš ๏ธ\x20[YOUTUBE\x20AUTH]\x20Backend\x20did\x20not\x20confirm\x20refresh\x20token','๐Ÿ”\x20[YOUTUBE\x20AUTH]\x20Response\x20data\x20keys:','โš ๏ธ\x20[YOUTUBE\x20AUTH]\x20Connection\x20may\x20fail\x20when\x20tokens\x20expire','โŒ\x20Google\x20Sign-In\x20error:','Google\x20Play\x20Services\x20not\x20available','instagram','UQxxV','TqbKz','wqhMk','OsopR','RRfBW','nqrNu','UCeGt','MGrCK','xeUyt','bAlNt','DXWUx','NlbiD','fvlGX','qKjzk','claIN','CSrgw','OVztU','yZNrY','๐Ÿ‘ค\x20Current\x20user\x20info:','REIbW','efaAc','vcfRK','bccmM','Present:\x20','UPQHd','kgBUT','jcoHP','QvyiX','IxdJM','wBFXE','voQrD','ejYRv','IYFUc','ykOoc','mCvTw','๐Ÿ’ก\x20User\x20needs\x20to\x20reconnect\x20with\x20proper\x20consent\x20screen','JMzDD','bzXYt','pIUff','dlWLY','YDgyk','aqIfF','kjGfC','xjZay','BSgcG','GUeih','kvqgf','โŒ\x20[CONNECTIVITY]\x20Connectivity\x20test\x20failed:','QGNqf','XVWqo','SUwRO','aaCjj','nTQWp','kSuKB','xQGuI','DFUyd','yQMcN','OKItC','aTqhT','FZGRy','default','getItem','qtphC','nIENP','GhFrD','acJtX','nIgOT','lqbAF','slFDc','XPgEa','uxmmn','UyEuu','MOHTT','DNoHe','OpIdX','EImOy','user-','UopRA','gsUeo','jLjTs','NoajL','tfapu','cntkN','WCTNW','๐Ÿ“ค\x20BACKEND\x20PAYLOAD\x20SUMMARY:','pFhtb','-\x20hasRefreshToken:','AbVPX','qnCnA','bbGvo','dfjfS','fkNgw','๐Ÿ“ค\x20Sending\x20YouTube\x20auth\x20to\x20backend\x20with\x20refresh\x20token:','osSwB','YGmDn','ncEeJ','oYTNZ','oXKlL','Google\x20Sign-In\x20already\x20in\x20progress','KvKdF','sTtST','AjucJ','OGcGN','ACipd','๐Ÿ”„\x20[YOUTUBE\x20AUTH]\x20YouTube\x20connected\x20in\x20temporary\x20mode','โ„น๏ธ\x20[YOUTUBE\x20AUTH]\x20User\x20can\x20reconnect\x20later\x20for\x20refresh\x20tokens\x20if\x20needed','kpfXr','hYoRY','cAXYZ','ZbkxH','leopX','xfpjD','QgGxK','uGqOU','YOVdT','keys','HSVFJ','vWuvS','๐Ÿ“‹\x20BACKEND\x20ERROR\x20RESPONSE:','MAlLC','ehvCx','AfQqU','DmAaO','EsrOp','WMcXz','hLKwn','IN_PROGRESS','TQSOl','pEOss','pzQJA','NwGuU','jkAvP','VGXOy','UplXm','dBUqc','โ„น๏ธ\x20User\x20should\x20authenticate\x20first\x20via\x20Google/Apple/Email\x20before\x20connecting\x20YouTube','rfeVn','cVBeS','NAxuM','ysGzB','Exchanging\x20code\x20for\x20token\x20for\x20platform:\x20','ScfEW','szoaQ','NURil','DdVWA','IJGqq','Token\x20exchange\x20successful\x20for\x20','EtwRP','obNHo','NAsSy','โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20Response\x20data:','Failed\x20to\x20send\x20verification\x20code','โŒ\x20Failed\x20to\x20get\x20fresh\x20tokens\x20from\x20Google\x20SDK','IbqLN','oZTuG','โœ…\x20YouTube\x20tokens\x20refreshed\x20successfully:','UhNWW','fYPLk','tKvvM','iwakz','iIDcH','yKWek','cxIkB','syZAJ','TVQcx','jETVO','lvmQf','/youtube/refresh-token','eWSag','QiMGi','gNwiq','XBFPf','YpIGC','yPCXM','โœ…\x20[TRAINING\x20RESTART]\x20Training\x20restart\x20successful:','โŒ\x20[TRAINING\x20RESTART]\x20Training\x20restart\x20failed:','tZbnh','โŒ\x20[TRAINING\x20RESTART]\x20Error\x20triggering\x20training\x20restart:','TYJWs','rqcQg','EcAnt','youtube_reauth','xETUZ','ZRUyX','Training\x20restart\x20failed:\x20','fIdDu','sLYRy','GDTnZ','๐Ÿงช\x20Testing\x20YouTube\x20refresh\x20token\x20functionality...','SqdSU','AcyWo','โœ…\x20YouTube\x20connection\x20fixed!\x20Testing\x20again...','๐Ÿ”\x20New\x20token\x20status:','โŒ\x20Failed\x20to\x20fix\x20YouTube\x20connection','โœ…\x20Refresh\x20token\x20already\x20available','wSFNo','efFdp','rJOUp','๐Ÿ”\x20Current\x20token\x20status:','dSNqy','gBLMH','PNDzn','oldTN','tfyqk','jYzFr','request','Verification\x20code\x20sent\x20to\x20your\x20email','vfCeQ','gxvTC','cGMhr','/email/verification','HkmjJ','VJDRc','eYKMj','auzLV','caThI','/email/authorize?action=verify','yLPSH','โŒ\x20Error\x20checking\x20email\x20verification\x20status:','โœ…\x20[YOUTUBE\x20REAUTH]\x20Backend\x20CONFIRMED\x20refresh\x20token\x20received','๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Full\x20refresh\x20token:','dnCvP','TTDqS','Email\x20verified\x20successfully','iOuRl','vxqpP','KiJtU','UamVE','MPFmd','dzRHy','nEaLE','iKoEo','ZqiSd','token','sjawZ','YHGhZ','nmrip','BNWVk','oxfvF','GGljK','MmVbO','DFtSy','cTIyQ','fPaGo','MSevW','Network\x20error','LSTOH','WmBBk','isPending','ruAEF','ZRUbJ','pGcRK','RFusP'];_0x1f2f=function(){return _0x3f3676;};return _0x1f2f();}const getDeveloperAuthHeaders=()=>{const _0xd4fd6a={'eRWIu':'SDK\x20not\x20initialized.\x20Developers\x20must\x20call\x20initializeApiKey()\x20before\x20using\x20auth\x20features.','XcDXr':function(_0xd649ef,_0x2aeab4){return _0xd649ef!==_0x2aeab4;},'VCKDB':function(_0x3e6888,_0x460665){return _0x3e6888!==_0x460665;},'Qjmkm':function(_0x484164,_0x5e7355){return _0x484164===_0x5e7355;},'cLNOT':_0x5564(0x10),'HmJLf':_0x5564(0x11),'GtVTg':_0x5564(0x12),'voKLP':_0x5564(0x13)};if(!(0x0,_apiKeyService['isApiKeyInitialized'])())throw new Error(_0xd4fd6a[_0x5564(0x14)]);const _0x530c73=(0x0,_apiKeyService['getApiConfig'])();if(!(_0xd4fd6a[_0x5564(0x15)](_0x530c73,null)&&_0xd4fd6a[_0x5564(0x16)](_0x530c73,void 0x0)&&_0x530c73[_0x5564(0x17)])){if(_0xd4fd6a[_0x5564(0x18)](_0xd4fd6a['cLNOT'],_0xd4fd6a['HmJLf']))_0x211a42[_0x5564(0x19)](_0x5564(0x1a)),_0x46196c();else throw new Error(_0xd4fd6a[_0x5564(0x1b)]);}return{...(0x0,_api[_0x5564(0x1c)])(),'Authorization':_0x5564(0x1d)+_0x530c73['apiKey'],'X-SDK-Version':_0xd4fd6a['voKLP'],'X-SDK-Platform':'react-native'};},WEB_CLIENT_ID=_0x5564(0x1e),IOS_CLIENT_ID=_0x5564(0x1e),OAUTH_CONFIG={'instagram':{'authUrl':'https://api.instagram.com/oauth/authorize','clientId':'demo_instagram_client_id','redirectUri':_0x5564(0x1f),'scope':'user_profile,user_media','responseType':_0x5564(0x20),'hasNativeSDK':![]},'youtube':{'authUrl':_api[_0x5564(0x21)][_0x5564(0x22)]+'/youtube/authorize','clientId':'1030678346906-lovkuds2ouqmoc8eu5qpo98spa6edv4o.apps.googleusercontent.com','redirectUri':'onairosevents://auth/callback','scope':'https://www.googleapis.com/auth/youtube.readonly','responseType':_0x5564(0x20),'hasNativeSDK':!![]},'reddit':{'authUrl':_api[_0x5564(0x21)][_0x5564(0x22)]+'/reddit/authorize','clientId':_0x5564(0x23),'redirectUri':_0x5564(0x1f),'scope':_0x5564(0x24),'responseType':_0x5564(0x20),'hasNativeSDK':![]},'pinterest':{'authUrl':_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x25),'clientId':'demo_pinterest_client_id','redirectUri':_0x5564(0x1f),'scope':_0x5564(0x26),'responseType':'code','hasNativeSDK':![]},'facebook':{'authUrl':'https://www.facebook.com/v12.0/dialog/oauth','clientId':_0x5564(0x27),'redirectUri':_0x5564(0x1f),'scope':_0x5564(0x28),'responseType':'code','hasNativeSDK':![]},'linkedin':{'authUrl':_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x29),'clientId':'','redirectUri':_0x5564(0x1f),'scope':_0x5564(0x2a),'responseType':_0x5564(0x20),'hasNativeSDK':![]},'gmail':{'authUrl':_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x2b),'clientId':_0x5564(0x2c),'redirectUri':_0x5564(0x1f),'scope':_0x5564(0x2d),'responseType':_0x5564(0x20),'hasNativeSDK':![]},'email':{'hasNativeSDK':![],'authUrl':_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x2e)},'chatgpt':{'authUrl':_0x5564(0x2f),'clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'claude':{'authUrl':_0x5564(0x30),'clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'gemini':{'authUrl':'https://gemini.google.com','clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'grok':{'authUrl':'https://x.com/i/grok','clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'hinge':{'authUrl':_0x5564(0x31),'clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'instagram_webview':{'authUrl':'https://www.instagram.com','clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'sephora':{'authUrl':_0x5564(0x32),'clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]},'telegram':{'authUrl':'https://web.telegram.org/k/','clientId':'','redirectUri':'','scope':'','responseType':'','hasNativeSDK':![]}},hasNativeSDK=_0x526418=>{const _0x42f1f6={'eQDjE':function(_0x2dffbc,_0x2a538f){return _0x2dffbc===_0x2a538f;},'yCBOH':function(_0x44e704,_0x438139){return _0x44e704===_0x438139;}};var _0x29139a;return(_0x42f1f6[_0x5564(0x33)](_0x29139a=OAUTH_CONFIG[_0x526418],null)||_0x42f1f6[_0x5564(0x34)](_0x29139a,void 0x0)?void 0x0:_0x29139a['hasNativeSDK'])||![];};exports[_0x5564(0x9)]=hasNativeSDK;const testApiConnectivity=async()=>{const _0x3ebf40={'vIWTN':_0x5564(0x35),'LSDYc':_0x5564(0x36),'sghat':_0x5564(0x37),'yKZXq':_0x5564(0x38),'QjbfA':function(_0xd68939,_0x4b66ef){return _0xd68939===_0x4b66ef;},'VHTVd':function(_0x1271d2,_0x4fb5e0){return _0x1271d2===_0x4fb5e0;},'NkkjR':function(_0x434105,_0x26d7aa){return _0x434105===_0x26d7aa;},'jGUtQ':function(_0xd2ff06,_0x428245){return _0xd2ff06===_0x428245;},'NsWpQ':function(_0x124f34,_0x219f32){return _0x124f34===_0x219f32;},'ZFvBZ':_0x5564(0x39),'vDoqE':_0x5564(0x3a),'NuQFr':function(_0x1b9299,_0x3dd326,_0x207ffa){return _0x1b9299(_0x3dd326,_0x207ffa);},'xXKXV':_0x5564(0x3b),'YeKkL':_0x5564(0x3c),'dnGMZ':'no-cors','XEMEy':_0x5564(0x3d),'wJjFd':_0x5564(0x3e),'vpbSk':_0x5564(0x3f),'hUPEM':_0x5564(0x40),'TNdOd':_0x5564(0x41),'zruDZ':_0x5564(0x42),'CnBKQ':function(_0x58aaae,_0x4f89bb,_0x21e6d5){return _0x58aaae(_0x4f89bb,_0x21e6d5);},'OjJWo':function(_0x4d6856,_0x59ffb4,_0x17116f){return _0x4d6856(_0x59ffb4,_0x17116f);},'IXnBn':function(_0x2d3993,_0x4c8ece){return _0x2d3993===_0x4c8ece;},'fhWoy':_0x5564(0x43),'VDVSX':_0x5564(0x44),'kcHIG':_0x5564(0x45),'ScDyG':'โŒ\x20[CONNECTIVITY]\x20Cannot\x20reach\x20API\x20server:','ZSzzO':function(_0x22a1c2,_0x5dc69a){return _0x22a1c2!==_0x5dc69a;},'HBoWf':_0x5564(0x46),'hewdt':'Internet\x20works\x20but\x20API\x20server\x20is\x20unreachable.\x20The\x20server\x20may\x20be\x20blocking\x20requests\x20from\x20this\x20device/simulator.','HTPls':'No\x20internet\x20connectivity\x20detected.\x20Check\x20your\x20network\x20connection.','syDwn':_0x5564(0x47)},_0x5b1fef={'googleTest':null,'api2Test':null};try{var _0xeb41b3,_0xbf6c2f;console['log'](_0x5564(0x48)),console[_0x5564(0x19)](_0x3ebf40[_0x5564(0x49)]);try{if(_0x3ebf40[_0x5564(0x4a)]('JpNIi',_0x3ebf40[_0x5564(0x4b)])){const _0x1d1cac=await _0x3ebf40['NuQFr'](fetch,_0x3ebf40[_0x5564(0x4c)],{'method':_0x3ebf40['YeKkL'],'mode':_0x3ebf40['dnGMZ']});_0x5b1fef[_0x5564(0x4d)]={'success':!![],'status':_0x3ebf40['XEMEy']},console[_0x5564(0x19)](_0x3ebf40[_0x5564(0x4e)]);}else return _0x35cbcd[_0x5564(0x4f)](_0x5564(0x50),_0x114deb),{'success':![],'error':_0x3ebf40[_0x5564(0x51)]};}catch(_0x3ecd22){_0x3ebf40[_0x5564(0x52)]!==_0x3ebf40[_0x5564(0x53)]?(_0x5b1fef[_0x5564(0x4d)]={'success':![],'error':_0x3ecd22[_0x5564(0x54)]},console[_0x5564(0x4f)](_0x3ebf40[_0x5564(0x55)],_0x3ecd22[_0x5564(0x54)])):(_0x4a86ca[_0x5564(0x19)](_0x3ebf40[_0x5564(0x56)]),_0x4bb11b(!![]));}console[_0x5564(0x19)](_0x3ebf40[_0x5564(0x57)]);try{const _0x4a0f44=new AbortController(),_0x52b8c5=_0x3ebf40['CnBKQ'](setTimeout,()=>_0x4a0f44['abort'](),0x7530),_0x4488d5=await _0x3ebf40[_0x5564(0x58)](fetch,_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x59),{'method':'GET','signal':_0x4a0f44[_0x5564(0x5a)]});clearTimeout(_0x52b8c5);const _0x506086=await _0x4488d5[_0x5564(0x5b)]()['catch'](()=>'Unable\x20to\x20read\x20response');_0x5b1fef[_0x5564(0x5c)]={'success':_0x4488d5['ok'],'status':_0x4488d5[_0x5564(0x5d)],'statusText':_0x4488d5['statusText'],'response':_0x506086[_0x5564(0x5e)](0x0,0xc8)},_0x4488d5['ok']?_0x3ebf40[_0x5564(0x5f)](_0x3ebf40['fhWoy'],_0x3ebf40['VDVSX'])?_0x52b342[_0x5564(0x19)](_0x3ebf40['sghat'],_0x1dc568):console['log'](_0x3ebf40[_0x5564(0x60)]):console[_0x5564(0x19)]('โš ๏ธ\x20[CONNECTIVITY]\x20API\x20server\x20responded\x20with\x20status:\x20'+_0x4488d5[_0x5564(0x5d)]);}catch(_0x4f8694){_0x5b1fef[_0x5564(0x5c)]={'success':![],'error':_0x4f8694[_0x5564(0x54)],'name':_0x4f8694[_0x5564(0x61)]},console[_0x5564(0x4f)](_0x3ebf40[_0x5564(0x62)],_0x4f8694[_0x5564(0x54)]);}if(_0x3ebf40[_0x5564(0x63)](_0xeb41b3=_0x5b1fef['api2Test'],null)&&_0x3ebf40[_0x5564(0x63)](_0xeb41b3,void 0x0)&&_0xeb41b3['success'])return{'success':!![],'message':_0x3ebf40[_0x5564(0x64)],'details':_0x5b1fef};else return _0x3ebf40[_0x5564(0x63)](_0xbf6c2f=_0x5b1fef[_0x5564(0x4d)],null)&&_0x3ebf40[_0x5564(0x63)](_0xbf6c2f,void 0x0)&&_0xbf6c2f[_0x5564(0x65)]?{'success':![],'message':_0x3ebf40['hewdt'],'details':_0x5b1fef}:{'success':![],'message':_0x3ebf40[_0x5564(0x66)],'details':_0x5b1fef};}catch(_0x339a1a){if(_0x3ebf40['VHTVd'](_0x3ebf40[_0x5564(0x67)],_0x3ebf40['syDwn']))return console['error']('โŒ\x20[CONNECTIVITY]\x20Connectivity\x20test\x20failed:',_0x339a1a[_0x5564(0x54)]),{'success':![],'message':_0x5564(0x68)+_0x339a1a[_0x5564(0x54)],'details':{'error':_0x339a1a[_0x5564(0x54)],'results':_0x5b1fef}};else{var _0x4e3fd4,_0x15cf85;_0x5d5209[_0x5564(0x19)](_0x3ebf40[_0x5564(0x69)],_0x55dae8[_0x5564(0x5d)]),_0x45f476=(_0x3ebf40['QjbfA'](_0x4e3fd4=_0x4e15d2[_0x5564(0x6a)],null)||_0x3ebf40[_0x5564(0x4a)](_0x4e3fd4,void 0x0)||_0x3ebf40[_0x5564(0x6b)](_0x4e3fd4=_0x4e3fd4[_0x5564(0x6c)],null)||_0x3ebf40[_0x5564(0x6d)](_0x4e3fd4,void 0x0)?void 0x0:_0x4e3fd4[_0x5564(0x61)])||(_0x3ebf40[_0x5564(0x6e)](_0x15cf85=_0x352d43['data'],null)||_0x15cf85===void 0x0||_0x3ebf40['VHTVd'](_0x15cf85=_0x15cf85[_0x5564(0x6c)],null)||_0x3ebf40['NsWpQ'](_0x15cf85,void 0x0)?void 0x0:_0x15cf85['email'])||'Unknown\x20Channel';}}};exports[_0x5564(0x6f)]=testApiConnectivity;const initiateOAuth=async(_0x214b85,_0x422073)=>{const _0x480332={'jlqNu':_0x5564(0x70),'JqRfG':'Verification\x20code\x20sent\x20to\x20your\x20email','VlgOJ':_0x5564(0x71),'qWFTI':_0x5564(0x72),'LQdUj':_0x5564(0x73),'biqpS':function(_0x5b0604,_0x36b654){return _0x5b0604===_0x36b654;},'PrxKn':_0x5564(0x74),'hnkDE':_0x5564(0x75),'asBgd':_0x5564(0x76),'uWRkS':_0x5564(0x77),'xEgWA':_0x5564(0x78),'yaCaZ':function(_0x17bf74,_0x5d417e){return _0x17bf74!==_0x5d417e;},'VqFrl':_0x5564(0x79),'PSHtV':function(_0x47a1f2,_0x16b96a){return _0x47a1f2===_0x16b96a;},'rRoSX':_0x5564(0x7a),'cRhqu':function(_0x82328c,_0x3f6998,_0x1029de){return _0x82328c(_0x3f6998,_0x1029de);},'bTtwH':function(_0x139dd1,_0x4ab8a2){return _0x139dd1!==_0x4ab8a2;},'CCfXO':_0x5564(0x7b),'xKLQI':_0x5564(0x7c),'yPgWi':function(_0x37835e,_0x100229){return _0x37835e===_0x100229;},'sFWto':_0x5564(0x7d),'YeRZR':function(_0xdf8d38,_0x1b676c){return _0xdf8d38!==_0x1b676c;},'CmWjq':function(_0x52fc96,_0xdbde18){return _0x52fc96!==_0xdbde18;},'KigRA':_0x5564(0x7e),'gfWaL':function(_0x21eead,_0x2b1205){return _0x21eead===_0x2b1205;},'TFfuQ':'\x20\x20\x201.\x20No\x20internet\x20connection\x20on\x20device/simulator','ykmMC':'\x20\x20\x202.\x20API\x20server\x20(API\x20server)\x20is\x20unreachable','nSsaE':_0x5564(0x7f),'TAqGE':_0x5564(0x80)};try{if(_0x480332[_0x5564(0x81)]('YZDHa',_0x480332['PrxKn']))_0xa87524[_0x5564(0x4f)](_0x480332[_0x5564(0x82)]);else{console['log']('๐Ÿš€\x20[OAUTH]\x20Starting\x20OAuth\x20for\x20platform:\x20'+_0x214b85),console['log'](_0x5564(0x83)+_reactNative[_0x5564(0x84)]['OS']+',\x20Version:\x20'+_reactNative[_0x5564(0x84)][_0x5564(0x85)]);if(_0x480332[_0x5564(0x81)](_0x214b85,_0x480332[_0x5564(0x86)])){if(_0x480332[_0x5564(0x87)]!==_0x480332[_0x5564(0x88)])return console['log'](_0x480332['xEgWA']),_api[_0x5564(0x21)]['BASE_URL']+'/email/authorize?action=verify';else _0x34d2b8['log']('โš ๏ธ\x20[CONNECTIVITY]\x20API\x20server\x20responded\x20with\x20status:\x20'+_0x2ce974['status']);}let _0x1fb944;try{if(_0x480332[_0x5564(0x89)](_0x480332[_0x5564(0x8a)],_0x480332['VqFrl']))return{'success':!![],'message':_0x54ec51[_0x5564(0x54)]||_0x480332[_0x5564(0x8b)]};else _0x1fb944=await(0x0,_api['getUserAuthHeaders'])(),console[_0x5564(0x19)](_0x5564(0x8c));}catch(_0x4b330a){if(_0x480332[_0x5564(0x8d)](_0x480332['rRoSX'],_0x480332['rRoSX']))return console[_0x5564(0x4f)](_0x5564(0x8e)+_0x214b85+_0x5564(0x8f)),console[_0x5564(0x4f)](_0x5564(0x90)),null;else _0x2c10c8[_0x5564(0x5c)]={'success':![],'error':_0x61df08[_0x5564(0x54)],'name':_0x3f46ac['name']},_0x26ee78['error'](_0x480332[_0x5564(0x91)],_0x3c15e6[_0x5564(0x54)]);}const _0x5218b9=_api[_0x5564(0x21)]['BASE_URL']+'/'+_0x214b85+'/authorize';console[_0x5564(0x19)]('๐ŸŒ\x20[OAUTH]\x20Proxy\x20URL:\x20'+_0x5218b9),console[_0x5564(0x19)](_0x5564(0x92));const _0x203a4a={'platform':_0x214b85,'timestamp':new Date()[_0x5564(0x93)]()};console[_0x5564(0x19)](_0x5564(0x94),_0x203a4a);const _0x442932=new AbortController(),_0x9d8363=_0x480332['cRhqu'](setTimeout,()=>{console[_0x5564(0x19)](_0x5564(0x95)+_0x214b85+_0x5564(0x96)),_0x442932[_0x5564(0x97)]();},0x7530),_0xfa25d=await _0x480332['cRhqu'](fetch,_0x5218b9,{'method':'POST','headers':_0x1fb944,'body':JSON[_0x5564(0x98)](_0x203a4a),'signal':_0x442932['signal']});clearTimeout(_0x9d8363),console[_0x5564(0x19)](_0x5564(0x99)+_0xfa25d[_0x5564(0x5d)]+'\x20'+_0xfa25d['statusText']);if(!_0xfa25d['ok']){const _0x565e89=await _0xfa25d['text']();return console[_0x5564(0x4f)](_0x5564(0x9a)+_0x214b85+':\x20'+_0xfa25d[_0x5564(0x5d)]+_0x5564(0x9b)+_0x565e89),null;}const _0x2905b0=await _0xfa25d['json']();console[_0x5564(0x19)](_0x5564(0x9c)+_0x214b85+':',_0x2905b0);const _0x45fe48=_0x214b85+_0x5564(0x9d),_0x5421bb=_0x2905b0[_0x45fe48]||_0x2905b0[_0x5564(0x9e)]||null;return console['log'](_0x5564(0x9f)+_0x214b85+_0x5564(0xa0)+_0x45fe48+'):',_0x5421bb),_0x5421bb;}}catch(_0x2053d9){if(_0x480332[_0x5564(0xa1)](_0x480332[_0x5564(0xa2)],_0x480332[_0x5564(0xa3)])){var _0x4eba24;if(_0x480332[_0x5564(0xa4)](_0x2053d9[_0x5564(0x61)],_0x480332['sFWto']))console[_0x5564(0x4f)](_0x5564(0xa5)+_0x214b85+_0x5564(0xa6));else{if(_0x480332[_0x5564(0xa7)](_0x4eba24=_0x2053d9[_0x5564(0x54)],null)&&_0x480332['CmWjq'](_0x4eba24,void 0x0)&&_0x4eba24[_0x5564(0xa8)](_0x480332['KigRA'])){if(_0x480332[_0x5564(0xa9)](_0x5564(0xaa),_0x5564(0xab)))_0x5a7cb3[_0x5564(0x19)](_0x480332[_0x5564(0xac)]),_0x2f4e13[_0x5564(0x19)](_0x480332[_0x5564(0xad)],_0x494a7e[_0x5564(0x5e)](0x0,0x14)+'...');else{const _0xfa958=_0x5564(0xae)[_0x5564(0xaf)]('|');let _0x131fb4=0x0;while(!![]){switch(_0xfa958[_0x131fb4++]){case'0':console[_0x5564(0x4f)](_0x480332[_0x5564(0xb0)]);continue;case'1':console[_0x5564(0x4f)](_0x5564(0xb1)+_0x214b85+'.\x20Possible\x20causes:');continue;case'2':console['error']('\x20\x20\x204.\x20SSL/TLS\x20certificate\x20issue');continue;case'3':console[_0x5564(0x4f)](_0x480332[_0x5564(0xb2)]);continue;case'4':console[_0x5564(0x4f)](_0x480332['nSsaE']);continue;case'5':console[_0x5564(0x4f)](_0x480332[_0x5564(0xb3)]);continue;}break;}}}else console['error']('โŒ\x20[OAUTH]\x20Error\x20initiating\x20OAuth\x20for\x20'+_0x214b85+':',_0x2053d9);}return null;}else return _0x5a9310[_0x5564(0x4f)](_0x5564(0x8e)+_0x1112b8+'\x20OAuth'),_0x2c260c[_0x5564(0x4f)](_0x5564(0x90)),null;}};exports[_0x5564(0x6)]=initiateOAuth;const initializeGoogleSignIn=()=>{const _0x41b892={'GnUYa':'https://www.googleapis.com/auth/youtube.readonly','Buxbe':_0x5564(0x75)};_googleSignin['GoogleSignin'][_0x5564(0xb4)]({'webClientId':WEB_CLIENT_ID,'iosClientId':IOS_CLIENT_ID,'offlineAccess':!![],'forceCodeForRefreshToken':!![],'scopes':[_0x41b892[_0x5564(0xb5)],_0x5564(0xb6),'profile',_0x41b892['Buxbe']],'hostedDomain':'','accountName':''});},forceYouTubeReconnectionWithConsent=async _0x4e6a7e=>{const _0x375aca={'nnaAb':_0x5564(0xb7),'qrOCB':_0x5564(0xb8),'aXchP':_0x5564(0xb9),'oQwzo':function(_0x86f42,_0x270326){return _0x86f42!==_0x270326;},'zJmdR':function(_0x2accb8,_0x59da79){return _0x2accb8!==_0x59da79;},'tkwtm':_0x5564(0x13),'uJnUn':_0x5564(0xba),'PFWMa':function(_0x53b878,_0x568c04){return _0x53b878===_0x568c04;},'zoxyj':_0x5564(0x7d),'foOsP':function(_0x525ffa,_0x156d44){return _0x525ffa!==_0x156d44;},'iDrLG':_0x5564(0xbb),'FOSmi':_0x5564(0x80),'zuRJQ':'\x20\x20\x201.\x20No\x20internet\x20connection\x20on\x20device/simulator','UzdOr':_0x5564(0xbc),'VJKwx':'\x20\x20\x205.\x20iOS\x20simulator\x20network\x20sandbox\x20issue\x20-\x20try\x20on\x20physical\x20device','fCVEX':_0x5564(0xbd),'jWFsC':_0x5564(0xbe),'LRCls':_0x5564(0xbf),'XyhsF':_0x5564(0xc0),'VmDUy':_0x5564(0xc1),'zgqJK':_0x5564(0xc2),'sVCkT':_0x5564(0xc3),'DfUER':'โ„น๏ธ\x20No\x20token\x20cache\x20to\x20clear','RHyBF':'https://www.googleapis.com/auth/youtube.readonly','IkwIi':_0x5564(0xb6),'Ltnok':_0x5564(0xc4),'cRmCX':_0x5564(0x75),'gOdNF':_0x5564(0xc5),'NlZjm':_0x5564(0xc6),'ltLsP':'๐Ÿ“ฑ\x20User\x20should\x20see:\x20\x22Allow\x20[App]\x20to\x20access\x20your\x20YouTube\x20account\x20when\x20you\x27re\x20not\x20using\x20the\x20app?\x22','bPByZ':'โœ…\x20Sign-in\x20completed\x20-\x20checking\x20for\x20refresh\x20token...','EPHPY':'๐Ÿ‘ค\x20User\x20email:','WDykT':function(_0x21a5d4,_0x27d929){return _0x21a5d4===_0x27d929;},'MhjEA':_0x5564(0xc7),'yTzhH':_0x5564(0xc8),'OVKWR':_0x5564(0xc9),'TJuEz':_0x5564(0xca),'iwBYu':_0x5564(0xcb),'dOgZm':_0x5564(0xcc),'yPKox':'Present','nOJGe':function(_0x15d73b,_0x5259f3){return _0x15d73b!==_0x5259f3;},'HdCxf':function(_0x394ea9,_0x361c7f){return _0x394ea9===_0x361c7f;},'CiBoX':function(_0x464b1d,_0x5aa945){return _0x464b1d===_0x5aa945;},'NTiJM':function(_0x4bffd5,_0x40610c){return _0x4bffd5===_0x40610c;},'VTFCC':_0x5564(0xcd),'RbqLQ':_0x5564(0xce),'WDFdm':_0x5564(0xcf),'yLLTv':'Unknown\x20Channel','fcKbm':'xYcNZ','FehvU':_0x5564(0xd0),'CeAiT':function(_0x4c7a22,_0x994c24){return _0x4c7a22>_0x994c24;},'QcZGc':_0x5564(0xd1),'yrMVM':_0x5564(0xd2),'OHvvg':_0x5564(0xd3),'lqdTG':function(_0x229ff3,_0x1070eb){return _0x229ff3===_0x1070eb;},'PmMDh':function(_0x2adc33,_0x1c7457){return _0x2adc33===_0x1c7457;},'TOumP':_0x5564(0xd4),'ojahi':'tcjEi','qSvOX':_0x5564(0xd5),'nzniU':'โš ๏ธ\x20Failed\x20to\x20fetch\x20YouTube\x20channel\x20info:','OvgtE':function(_0x55e6b8,_0xd7531d){return _0x55e6b8===_0xd7531d;},'fICiG':function(_0x12806c,_0x162d05){return _0x12806c===_0x162d05;},'deTUE':function(_0x5abb52,_0x10d8d6){return _0x5abb52===_0x10d8d6;},'VMgQK':function(_0x8db845,_0x3ebb7f){return _0x8db845===_0x3ebb7f;},'TPduH':'lCkyw','tOVvz':_0x5564(0xd6),'OyGDg':function(_0x10973c,_0x400f40){return _0x10973c===_0x400f40;},'SXTEb':function(_0x2e3de8,_0x24be68){return _0x2e3de8===_0x24be68;},'IfVvM':function(_0x229aa4,_0x5799d4){return _0x229aa4===_0x5799d4;},'OTzSB':function(_0x2681c6,_0x40b7c9){return _0x2681c6!==_0x40b7c9;},'CfDxH':'TvAzR','Zwvtf':_0x5564(0xd7),'ewzSn':_0x5564(0xd8),'tsdXZ':_0x5564(0xd9),'rRBvY':function(_0x506876,_0x21c052){return _0x506876===_0x21c052;},'WdHza':function(_0x3ac350,_0x458c00){return _0x3ac350===_0x458c00;},'cjXLU':function(_0x4259ff,_0x2abfc5){return _0x4259ff===_0x2abfc5;},'pAHmq':function(_0x25d3cb,_0x4b4641){return _0x25d3cb===_0x4b4641;},'JEamh':function(_0x2fba4e,_0xd238b0){return _0x2fba4e===_0xd238b0;},'JmVan':function(_0x1c262d,_0x3272dd){return _0x1c262d===_0x3272dd;},'LvwtP':function(_0x7961cf,_0x21833d){return _0x7961cf*_0x21833d;},'ATCoU':_0x5564(0xda),'POFCS':function(_0x2c50c4,_0xb498a){return _0x2c50c4===_0xb498a;},'cCsoh':function(_0x135b26,_0x496f6e){return _0x135b26===_0x496f6e;},'PwLEj':_0x5564(0xdb),'SuhKq':_0x5564(0xdc),'fkuBE':_0x5564(0xdd),'nlpeF':function(_0x21aadd,_0x3fd563){return _0x21aadd===_0x3fd563;},'oUdGe':function(_0x39a553,_0xb59d91,_0x315f91){return _0x39a553(_0xb59d91,_0x315f91);},'eBEOW':function(_0x54ce0a,_0x150c53){return _0x54ce0a&&_0x150c53;},'OEryw':_0x5564(0xde),'VypwN':_0x5564(0xdf),'FJrZv':'โœ…\x20[YOUTUBE\x20REAUTH]\x20Backend\x20Response\x20SUCCESS:','CCHnE':function(_0x3f734d,_0x33d97a){return _0x3f734d===_0x33d97a;},'GVaQv':function(_0x4e5403,_0x4b959d){return _0x4e5403===_0x4b959d;},'lQqlu':function(_0x13433e,_0x20be36){return _0x13433e===_0x20be36;},'GBKHK':function(_0x309365,_0x21e33c){return _0x309365===_0x21e33c;},'LsgKw':function(_0x36603f,_0x46c159){return _0x36603f===_0x46c159;},'NNeJJ':function(_0x943a27,_0x9fd312){return _0x943a27===_0x9fd312;},'RgMzk':_0x5564(0xe0),'GQqMd':_0x5564(0xe1),'TGXey':'โœ…\x20[YOUTUBE\x20REAUTH]\x20Training\x20will\x20work,\x20but\x20connection\x20expires\x20in\x20~1\x20hour','mboEt':_0x5564(0xe2),'SRACV':_0x5564(0xe3),'nKGfr':'๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Mode:\x20Temporary\x20(expires\x20~1\x20hour)','brmth':_0x5564(0xe4),'RWOTG':_0x5564(0xe5),'lCBKx':'๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20Full\x20refresh\x20token:','XWLPi':_0x5564(0xe6),'Wxssz':_0x5564(0xe7),'fazFI':_0x5564(0xe8),'rkSIy':_0x5564(0xe9),'LJyMJ':_0x5564(0xea),'rFRYd':'โœ…\x20[YOUTUBE\x20REAUTH]\x20Backend\x20CONFIRMED\x20refresh\x20token\x20received','PtQDw':_0x5564(0xeb),'RrFxT':'โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20Response\x20data:','TJzVI':_0x5564(0xec),'MfwrN':_0x5564(0xed),'syEQC':function(_0x2e3ffd,_0x4623e2,_0x20d987){return _0x2e3ffd(_0x4623e2,_0x20d987);},'LGatd':_0x5564(0xee),'augab':_0x5564(0xef),'vsgGX':_0x5564(0xf0),'wBKNR':_0x5564(0xf1),'TIYEg':_0x5564(0xf2),'PFdlO':_0x5564(0xf3),'Isocx':_0x5564(0xf4),'RDoXd':_0x5564(0xf5),'UNiTv':_0x5564(0xf6),'kcWMO':_0x5564(0xf7),'SEcDn':_0x5564(0xf8),'SKrCI':_0x5564(0x70),'cZYqp':function(_0x52727e,_0x3a0e32){return _0x52727e===_0x3a0e32;},'ZVprV':'ZENRD','Mpisf':_0x5564(0xf9),'TYBFX':_0x5564(0xfa)};try{var _0x202815,_0x545b,_0x229cb8;console[_0x5564(0x19)](_0x375aca[_0x5564(0xfb)]),console[_0x5564(0x19)](_0x375aca[_0x5564(0xfc)],_0x4e6a7e);try{if(_0x375aca[_0x5564(0xfd)]!==_0x5564(0xfe))await _googleSignin['GoogleSignin']['signOut'](),console[_0x5564(0x19)](_0x375aca[_0x5564(0xff)]);else return _0x4c787d[_0x5564(0x4f)](_0x5564(0x100),_0x4d5599),_0x1f4d30[_0x5564(0x19)](_0x375aca[_0x5564(0x101)]),{'access_token':_0x3e8aac+_0x5564(0x102)+_0x13b156[_0x5564(0x103)]()['toString'](0x24)[_0x5564(0x5e)](0x7),'refresh_token':_0x2fa5d0+_0x5564(0x104)+_0x52b2c5[_0x5564(0x103)]()[_0x5564(0x105)](0x24)[_0x5564(0x5e)](0x7),'expires_in':0xe10};}catch(_0x19a89f){console[_0x5564(0x19)](_0x375aca[_0x5564(0x106)],_0x19a89f);}try{const _0x3467d8=await _googleSignin[_0x5564(0x107)]['getTokens']();_0x3467d8[_0x5564(0x108)]&&(await _googleSignin[_0x5564(0x107)][_0x5564(0x109)](_0x3467d8[_0x5564(0x108)]),console[_0x5564(0x19)](_0x5564(0x10a)));}catch(_0x364387){_0x375aca[_0x5564(0x10b)]===_0x375aca[_0x5564(0x10b)]?console[_0x5564(0x19)](_0x375aca['DfUER']):(_0xf1d56f=_0x14259b['items'][0x0][_0x5564(0x10c)][_0x5564(0x10d)],_0x2710bf=_0x2f6c28['items'][0x0]['id'],_0x4163b6[_0x5564(0x19)](_0x375aca['qrOCB'],_0x570120,_0x375aca[_0x5564(0x10e)],_0x5eade9));}console['log'](_0x5564(0x10f)),_googleSignin['GoogleSignin'][_0x5564(0xb4)]({'webClientId':WEB_CLIENT_ID,'iosClientId':IOS_CLIENT_ID,'offlineAccess':!![],'forceCodeForRefreshToken':!![],'scopes':[_0x375aca[_0x5564(0x110)],_0x375aca[_0x5564(0x111)],_0x375aca[_0x5564(0x112)],_0x375aca[_0x5564(0x113)]],'hostedDomain':'','accountName':''}),await _googleSignin[_0x5564(0x107)]['hasPlayServices'](),console[_0x5564(0x19)](_0x375aca[_0x5564(0x114)]),console[_0x5564(0x19)](_0x375aca['NlZjm']),console[_0x5564(0x19)](_0x375aca[_0x5564(0x115)]);const _0x246cbb=await _googleSignin['GoogleSignin'][_0x5564(0x116)]();console[_0x5564(0x19)](_0x375aca['bPByZ']),console['log'](_0x375aca[_0x5564(0x117)],_0x375aca[_0x5564(0x118)](_0x202815=_0x246cbb['data'],null)||_0x375aca[_0x5564(0x119)](_0x202815,void 0x0)||(_0x202815=_0x202815[_0x5564(0x6c)])===null||_0x202815===void 0x0?void 0x0:_0x202815['email']);const _0x530539=await _googleSignin[_0x5564(0x107)][_0x5564(0x11a)](),_0x336c7e=await _googleSignin[_0x5564(0x107)][_0x5564(0x11b)]();console[_0x5564(0x19)](_0x375aca[_0x5564(0x11c)]),console[_0x5564(0x19)](JSON[_0x5564(0x98)](_0x246cbb,null,0x2)),console['log'](_0x375aca[_0x5564(0x11d)]),console[_0x5564(0x19)](JSON[_0x5564(0x98)](_0x530539,null,0x2)),console[_0x5564(0x19)](_0x375aca[_0x5564(0x11e)]),console[_0x5564(0x19)](JSON[_0x5564(0x98)](_0x336c7e,null,0x2)),console['log'](_0x5564(0x11f)),console[_0x5564(0x19)](_0x375aca[_0x5564(0x120)],_0x530539[_0x5564(0x108)]?_0x530539[_0x5564(0x108)][_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121):_0x375aca[_0x5564(0x122)]),console['log'](_0x375aca[_0x5564(0x123)],_0x530539['idToken']?_0x375aca['yPKox']:_0x375aca[_0x5564(0x122)]),console[_0x5564(0x19)](_0x5564(0x124),_0x375aca['oQwzo'](_0x545b=_0x246cbb[_0x5564(0x6a)],null)&&_0x375aca['nOJGe'](_0x545b,void 0x0)&&_0x545b['serverAuthCode']?_0x246cbb[_0x5564(0x6a)][_0x5564(0xea)]['substring'](0x0,0x14)+_0x5564(0x121):_0x375aca[_0x5564(0x122)]),console[_0x5564(0x19)](_0x5564(0x125),_0x336c7e!==null&&_0x375aca[_0x5564(0x126)](_0x336c7e,void 0x0)&&_0x336c7e[_0x5564(0xea)]?_0x336c7e[_0x5564(0xea)][_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121):_0x375aca[_0x5564(0x122)]);const _0x273642=(_0x375aca[_0x5564(0x119)](_0x229cb8=_0x246cbb[_0x5564(0x6a)],null)||_0x375aca[_0x5564(0x127)](_0x229cb8,void 0x0)?void 0x0:_0x229cb8[_0x5564(0xea)])||(_0x375aca[_0x5564(0x128)](_0x336c7e,null)||_0x375aca[_0x5564(0x129)](_0x336c7e,void 0x0)?void 0x0:_0x336c7e[_0x5564(0xea)]);if(_0x273642){var _0x266679,_0x53a32b,_0x51ccb6,_0x56ac36,_0x517f06,_0x3505a9;console[_0x5564(0x19)](_0x375aca[_0x5564(0x12a)]),console[_0x5564(0x19)](_0x375aca['RbqLQ'],_0x273642[_0x5564(0x12b)]('4/')?_0x5564(0xea):_0x375aca['WDFdm']),console[_0x5564(0x19)](_0x5564(0x12c),_0x273642[_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121));let _0x33638c=_0x375aca[_0x5564(0x12d)],_0x368227=null;try{if(_0x375aca[_0x5564(0x12e)]!==_0x5564(0x12f)){console[_0x5564(0x19)](_0x5564(0x130));const _0x427e13=await fetch(_0x375aca[_0x5564(0x131)],{'headers':{'Authorization':_0x5564(0x1d)+_0x530539[_0x5564(0x108)],'Accept':'application/json'}});if(_0x427e13['ok']){const _0x5249bc=await _0x427e13[_0x5564(0x132)]();if(_0x5249bc['items']&&_0x375aca[_0x5564(0x133)](_0x5249bc[_0x5564(0x134)][_0x5564(0x135)],0x0)){if(_0x375aca['CiBoX'](_0x375aca['QcZGc'],_0x375aca[_0x5564(0x136)])){if(!(0x0,_0x4f8470[_0x5564(0x137)])())throw new _0x326c4d('SDK\x20not\x20initialized.\x20Developers\x20must\x20call\x20initializeApiKey()\x20before\x20using\x20auth\x20features.');const _0x4b3600=(0x0,_0x596e1a[_0x5564(0x138)])();if(!(_0x375aca['oQwzo'](_0x4b3600,null)&&_0x375aca[_0x5564(0x139)](_0x4b3600,void 0x0)&&_0x4b3600[_0x5564(0x17)]))throw new _0x4f7b4e(_0x5564(0x12));return{...(0x0,_0x1c5592[_0x5564(0x1c)])(),'Authorization':_0x5564(0x1d)+_0x4b3600[_0x5564(0x17)],'X-SDK-Version':_0x375aca['tkwtm'],'X-SDK-Platform':'react-native'};}else _0x33638c=_0x5249bc[_0x5564(0x134)][0x0][_0x5564(0x10c)][_0x5564(0x10d)],_0x368227=_0x5249bc[_0x5564(0x134)][0x0]['id'],console[_0x5564(0x19)](_0x375aca[_0x5564(0x13a)],_0x33638c,_0x5564(0xb9),_0x368227);}else{var _0x17cf34,_0x3ac609;console[_0x5564(0x19)](_0x375aca[_0x5564(0x13b)]),_0x33638c=((_0x17cf34=_0x246cbb['data'])===null||_0x375aca['lqdTG'](_0x17cf34,void 0x0)||(_0x17cf34=_0x17cf34[_0x5564(0x6c)])===null||_0x17cf34===void 0x0?void 0x0:_0x17cf34[_0x5564(0x61)])||(_0x375aca[_0x5564(0x119)](_0x3ac609=_0x246cbb[_0x5564(0x6a)],null)||_0x375aca[_0x5564(0x129)](_0x3ac609,void 0x0)||(_0x3ac609=_0x3ac609[_0x5564(0x6c)])===null||_0x375aca[_0x5564(0x13c)](_0x3ac609,void 0x0)?void 0x0:_0x3ac609[_0x5564(0x75)])||_0x375aca[_0x5564(0x13d)];}}else{if(_0x375aca[_0x5564(0x139)](_0x375aca['ojahi'],_0x375aca[_0x5564(0x13e)])){var _0x17271b,_0x1a18bc;console[_0x5564(0x19)](_0x375aca[_0x5564(0x13f)],_0x427e13[_0x5564(0x5d)]),_0x33638c=(_0x375aca[_0x5564(0x129)](_0x17271b=_0x246cbb[_0x5564(0x6a)],null)||_0x375aca[_0x5564(0x127)](_0x17271b,void 0x0)||_0x375aca[_0x5564(0x140)](_0x17271b=_0x17271b['user'],null)||_0x375aca[_0x5564(0x127)](_0x17271b,void 0x0)?void 0x0:_0x17271b['name'])||(_0x375aca['fICiG'](_0x1a18bc=_0x246cbb['data'],null)||_0x1a18bc===void 0x0||_0x375aca[_0x5564(0x141)](_0x1a18bc=_0x1a18bc[_0x5564(0x6c)],null)||_0x375aca[_0x5564(0x142)](_0x1a18bc,void 0x0)?void 0x0:_0x1a18bc[_0x5564(0x75)])||_0x5564(0x143);}else _0x5a962f[_0x5564(0x19)](_0x375aca[_0x5564(0x144)]);}}else _0x41f145[_0x5564(0x4f)](_0x5564(0x145),_0x4e1602);}catch(_0x4903e0){if(_0x375aca[_0x5564(0x146)]!==_0x375aca[_0x5564(0x146)]){var _0x1a3b05;if(_0x375aca[_0x5564(0x119)](_0xd64e11[_0x5564(0x61)],_0x375aca[_0x5564(0x147)]))_0x2713ff[_0x5564(0x4f)]('โŒ\x20[OAUTH]\x20Request\x20timeout\x20for\x20'+_0x853a60+'\x20-\x20the\x20server\x20took\x20too\x20long\x20to\x20respond');else{if(_0x375aca[_0x5564(0x148)](_0x1a3b05=_0x13b026[_0x5564(0x54)],null)&&_0x1a3b05!==void 0x0&&_0x1a3b05[_0x5564(0xa8)](_0x5564(0x7e))){const _0xaa974f=_0x5564(0x149)[_0x5564(0xaf)]('|');let _0x49d890=0x0;while(!![]){switch(_0xaa974f[_0x49d890++]){case'0':_0x5edf49[_0x5564(0x4f)](_0x5564(0xb1)+_0x5aae60+_0x5564(0x14a));continue;case'1':_0x5330ac[_0x5564(0x4f)](_0x375aca[_0x5564(0x14b)]);continue;case'2':_0x10b2c8[_0x5564(0x4f)](_0x375aca['FOSmi']);continue;case'3':_0x392601[_0x5564(0x4f)](_0x375aca[_0x5564(0x14c)]);continue;case'4':_0xf51e74['error'](_0x375aca[_0x5564(0x14d)]);continue;case'5':_0x3aeb95['error'](_0x375aca[_0x5564(0x14e)]);continue;}break;}}else _0x2f51ca[_0x5564(0x4f)]('โŒ\x20[OAUTH]\x20Error\x20initiating\x20OAuth\x20for\x20'+_0x24bcf1+':',_0x2d3145);}return null;}else{var _0x4eae46,_0x5c403d;console[_0x5564(0x19)](_0x375aca[_0x5564(0x14f)],_0x4903e0),_0x33638c=(_0x375aca[_0x5564(0x150)](_0x4eae46=_0x246cbb[_0x5564(0x6a)],null)||_0x4eae46===void 0x0||_0x375aca[_0x5564(0x127)](_0x4eae46=_0x4eae46[_0x5564(0x6c)],null)||_0x375aca['OyGDg'](_0x4eae46,void 0x0)?void 0x0:_0x4eae46[_0x5564(0x61)])||((_0x5c403d=_0x246cbb[_0x5564(0x6a)])===null||_0x375aca[_0x5564(0x151)](_0x5c403d,void 0x0)||_0x375aca[_0x5564(0x152)](_0x5c403d=_0x5c403d['user'],null)||_0x375aca[_0x5564(0x141)](_0x5c403d,void 0x0)?void 0x0:_0x5c403d[_0x5564(0x75)])||_0x375aca[_0x5564(0x12d)];}}let _0x170309=await(0x0,_jwtStorageService[_0x5564(0x153)])();if(!_0x170309||_0x170309[_0x5564(0x154)]()[_0x5564(0x135)]<0x14){if(_0x375aca[_0x5564(0x155)](_0x375aca[_0x5564(0x156)],_0x5564(0x157))){_0x1da883[_0x5564(0x4f)]('Error\x20exchanging\x20code\x20for\x20token:\x20'+_0x3045cd['status']);throw new _0x2ed877(_0x5564(0x158)+_0xcc5cc[_0x5564(0x5d)]);}else console[_0x5564(0x19)](_0x375aca[_0x5564(0x159)]),_0x170309=_0x375aca[_0x5564(0x15a)];}const _0x380a77={'session':{'username':_0x4e6a7e,'platform':_0x375aca[_0x5564(0x15b)],'timestamp':new Date()[_0x5564(0x93)](),'channelName':_0x33638c,'channelId':_0x368227,'forceConsent':!![]},'googleUser':_0x375aca[_0x5564(0x15c)](_0x266679=_0x246cbb[_0x5564(0x6a)],null)||_0x375aca['rRBvY'](_0x266679,void 0x0)?void 0x0:_0x266679['user'],'accessToken':_0x530539[_0x5564(0x108)],'idToken':_0x530539[_0x5564(0x15d)],'refreshToken':_0x273642,'serverAuthCode':_0x273642,'refresh_token':_0x273642,'server_auth_code':_0x273642,'authCode':_0x273642,'userAccountInfo':{'username':_0x4e6a7e,'email':_0x375aca[_0x5564(0x15e)](_0x53a32b=_0x246cbb[_0x5564(0x6a)],null)||_0x53a32b===void 0x0||_0x375aca['VMgQK'](_0x53a32b=_0x53a32b[_0x5564(0x6c)],null)||_0x375aca[_0x5564(0x15f)](_0x53a32b,void 0x0)?void 0x0:_0x53a32b[_0x5564(0x75)],'authToken':_0x170309,'channelName':_0x33638c,'channelId':_0x368227,'userIdentifier':_0x170309?'user-'+_0x170309[_0x5564(0x5e)](0x0,0xa):_0x5564(0x160)+(_0x375aca[_0x5564(0x129)](_0x51ccb6=_0x246cbb[_0x5564(0x6a)],null)||_0x375aca[_0x5564(0x161)](_0x51ccb6,void 0x0)||_0x375aca['JEamh'](_0x51ccb6=_0x51ccb6[_0x5564(0x6c)],null)||_0x375aca['JmVan'](_0x51ccb6,void 0x0)?void 0x0:_0x51ccb6[_0x5564(0x75)]),'googleId':(_0x56ac36=_0x246cbb[_0x5564(0x6a)])===null||_0x56ac36===void 0x0||_0x375aca[_0x5564(0x162)](_0x56ac36=_0x56ac36[_0x5564(0x6c)],null)||_0x375aca[_0x5564(0x13c)](_0x56ac36,void 0x0)?void 0x0:_0x56ac36['id'],'refreshToken':_0x273642,'serverAuthCode':_0x273642},'tokenExpiry':new Date(Date[_0x5564(0x163)]()+_0x375aca['LvwtP'](0xe10,0x3e8))['toISOString'](),'requestRefreshToken':!![],'debugInfo':{'hasRefreshToken':!![],'refreshTokenType':_0x273642['startsWith']('4/')?'serverAuthCode':_0x375aca['WDFdm'],'configuredForRefresh':!![],'forcedConsent':!![],'consentMethod':_0x375aca['ATCoU'],'refreshTokenValue':_0x273642}};console['log'](_0x5564(0x164),{'hasAccessToken':!!_0x380a77[_0x5564(0x108)],'hasRefreshToken':!!_0x380a77[_0x5564(0xcf)],'hasServerAuthCode':!!_0x380a77[_0x5564(0xea)],'refreshTokenType':_0x380a77[_0x5564(0x165)][_0x5564(0x166)],'userEmail':_0x375aca['POFCS'](_0x517f06=_0x246cbb[_0x5564(0x6a)],null)||_0x517f06===void 0x0||_0x375aca[_0x5564(0x167)](_0x517f06=_0x517f06[_0x5564(0x6c)],null)||_0x375aca['OvgtE'](_0x517f06,void 0x0)?void 0x0:_0x517f06[_0x5564(0x75)],'forcedConsent':!![]}),console['log'](_0x5564(0x168)),console[_0x5564(0x19)](_0x5564(0x169)),console[_0x5564(0x19)]('\uD83D\uDE80 [YOUTUBE REAUTH] Method: POST'),console[_0x5564(0x19)](_0x375aca[_0x5564(0x16a)],{'Content-Type':'application/json','Authorization':_0x170309?_0x170309['substring'](0x0,0x14)+_0x5564(0x121):_0x375aca[_0x5564(0x16b)]}),console['log'](_0x375aca['fkuBE'],{'hasAccessToken':!!_0x380a77[_0x5564(0x108)],'hasRefreshToken':!!_0x380a77['refreshToken'],'hasServerAuthCode':!!_0x380a77['serverAuthCode'],'refreshTokenType':_0x380a77[_0x5564(0x165)][_0x5564(0x166)],'userEmail':_0x375aca[_0x5564(0x16c)](_0x3505a9=_0x246cbb[_0x5564(0x6a)],null)||_0x375aca[_0x5564(0x152)](_0x3505a9,void 0x0)||(_0x3505a9=_0x3505a9[_0x5564(0x6c)])===null||_0x3505a9===void 0x0?void 0x0:_0x3505a9['email'],'channelName':_0x33638c,'forcedConsent':!![],'requestRefreshToken':!![]}),console[_0x5564(0x19)]('๐Ÿš€\x20[YOUTUBE\x20REAUTH]\x20FULL\x20PAYLOAD:',JSON['stringify'](_0x380a77,null,0x2));const _0x273530=await _0x375aca['oUdGe'](fetch,_api['API_CONFIG']['BASE_URL']+_0x5564(0x16d),{'method':'POST','headers':{'Content-Type':'application/json',..._0x375aca[_0x5564(0x16e)](_0x170309,{'Authorization':_0x170309})},'body':JSON[_0x5564(0x98)](_0x380a77)});console[_0x5564(0x19)](_0x375aca[_0x5564(0x16f)],_0x273530[_0x5564(0x5d)]),console[_0x5564(0x19)](_0x375aca[_0x5564(0x170)],_0x273530[_0x5564(0x171)]),console[_0x5564(0x19)]('๐Ÿ“ก\x20[YOUTUBE\x20REAUTH]\x20Response\x20Headers:',_0x273530[_0x5564(0x172)]);if(_0x273530['ok']){var _0x38e1b2,_0x590187;const _0xcb8f50=await _0x273530['json']();console[_0x5564(0x19)](_0x375aca[_0x5564(0x173)],JSON['stringify'](_0xcb8f50,null,0x2));const _0x2e8572=(_0x375aca[_0x5564(0x174)](_0x38e1b2=_0xcb8f50[_0x5564(0x175)],null)||_0x375aca[_0x5564(0x176)](_0x38e1b2,void 0x0)?void 0x0:_0x38e1b2[_0x5564(0x177)])===!![]||_0x375aca[_0x5564(0x178)](_0x375aca[_0x5564(0x179)](_0x590187=_0xcb8f50[_0x5564(0x17a)],null)||_0x375aca[_0x5564(0x17b)](_0x590187,void 0x0)?void 0x0:_0x590187[_0x5564(0x17c)],!![])||_0x375aca[_0x5564(0x17d)](_0xcb8f50[_0x5564(0x177)],!![])||_0xcb8f50['message']&&_0xcb8f50['message'][_0x5564(0xa8)]('temporary\x20access\x20token\x20mode');if(_0x2e8572){const _0x5524f6='3|1|2|4|6|5|0'[_0x5564(0xaf)]('|');let _0x27bc31=0x0;while(!![]){switch(_0x5524f6[_0x27bc31++]){case'0':console[_0x5564(0x19)](_0x375aca[_0x5564(0x17e)],_0x273642?_0x375aca[_0x5564(0x17f)]:'No');continue;case'1':console['log'](_0x375aca[_0x5564(0x180)]);continue;case'2':console[_0x5564(0x19)](_0x375aca['mboEt']);continue;case'3':console[_0x5564(0x19)](_0x5564(0x181));continue;case'4':console[_0x5564(0x19)](_0x375aca['SRACV']);continue;case'5':console[_0x5564(0x19)](_0x5564(0x182));continue;case'6':console[_0x5564(0x19)](_0x375aca['nKGfr']);continue;}break;}}else{if(_0xcb8f50['hasRefreshToken']||_0xcb8f50['refreshTokenReceived']){if(_0x375aca[_0x5564(0x118)](_0x375aca['brmth'],'KJVfE'))return _0x1bd2dc[_0x5564(0x4f)](_0x5564(0x183)),![];else{const _0x18492d=_0x375aca[_0x5564(0x184)][_0x5564(0xaf)]('|');let _0x4ba2d2=0x0;while(!![]){switch(_0x18492d[_0x4ba2d2++]){case'0':console[_0x5564(0x19)](_0x375aca[_0x5564(0x185)],_0x273642);continue;case'1':console[_0x5564(0x19)](_0x375aca[_0x5564(0x186)],_0x273642[_0x5564(0x135)]);continue;case'2':console[_0x5564(0x19)](_0x375aca[_0x5564(0x187)]);continue;case'3':console[_0x5564(0x19)]('๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20REFRESH\x20TOKEN\x20SENT\x20TO\x20BACKEND:');continue;case'4':console[_0x5564(0x19)](_0x375aca[_0x5564(0x188)],_0xcb8f50[_0x5564(0x189)]);continue;case'5':console[_0x5564(0x19)](_0x375aca['rkSIy'],_0x273642[_0x5564(0x12b)]('4/')?_0x375aca['LJyMJ']:_0x375aca['WDFdm']);continue;case'6':console['log'](_0x375aca[_0x5564(0x18a)]);continue;}break;}}}else return console['warn'](_0x375aca[_0x5564(0x18b)]),console[_0x5564(0x18c)](_0x375aca['RrFxT'],_0xcb8f50),console[_0x5564(0x18c)](_0x375aca['TJzVI']),![];}console[_0x5564(0x19)](_0x375aca[_0x5564(0x18d)]);try{await _0x375aca['syEQC'](triggerTrainingRestart,_0x4e6a7e,_0x170309),console[_0x5564(0x19)](_0x375aca[_0x5564(0x18e)]);}catch(_0x306aef){console['warn'](_0x375aca[_0x5564(0x18f)],_0x306aef),console[_0x5564(0x18c)](_0x5564(0x190));}return!![];}else{const _0x405d5a=await _0x273530['text']();return console[_0x5564(0x4f)](_0x375aca[_0x5564(0x191)],_0x273530['status'],_0x405d5a),console['error'](_0x375aca[_0x5564(0x192)]),![];}}else{const _0x4f66ee='5|6|1|0|4|3|2'[_0x5564(0xaf)]('|');let _0x17b26d=0x0;while(!![]){switch(_0x4f66ee[_0x17b26d++]){case'0':console['error'](_0x375aca[_0x5564(0x193)]);continue;case'1':console[_0x5564(0x4f)](_0x375aca[_0x5564(0x194)]);continue;case'2':return![];case'3':console[_0x5564(0x4f)](_0x375aca[_0x5564(0x195)]);continue;case'4':console[_0x5564(0x4f)](_0x375aca[_0x5564(0x196)]);continue;case'5':console['error']('โŒ\x20CRITICAL:\x20No\x20refresh\x20token\x20even\x20after\x20consent\x20screen');continue;case'6':console['error'](_0x375aca[_0x5564(0x197)]);continue;}break;}}}catch(_0x3686de){console[_0x5564(0x4f)](_0x375aca[_0x5564(0x198)],_0x3686de);if(_0x375aca[_0x5564(0x15e)](_0x3686de[_0x5564(0x20)],_googleSignin[_0x5564(0x199)][_0x5564(0x19a)]))console['error'](_0x5564(0x19b)),console[_0x5564(0x4f)](_0x375aca[_0x5564(0x19c)]);else{if(_0x3686de['code']===_googleSignin[_0x5564(0x199)]['IN_PROGRESS'])console[_0x5564(0x4f)](_0x375aca[_0x5564(0x19d)]);else _0x375aca[_0x5564(0x17b)](_0x3686de[_0x5564(0x20)],_googleSignin['statusCodes'][_0x5564(0x19e)])&&(_0x375aca['cZYqp'](_0x375aca[_0x5564(0x19f)],_0x375aca[_0x5564(0x1a0)])?_0x33c0aa['log'](_0x375aca['fCVEX'],_0x5f5bcb[_0x5564(0x166)]):console[_0x5564(0x4f)](_0x375aca[_0x5564(0x1a1)]));}return![];}};exports[_0x5564(0xb)]=forceYouTubeReconnectionWithConsent;const forceYouTubeReconnectionWithRevoke=async _0xa3aae8=>{const _0x891be9={'SPHFF':'auth/callback','ZUcNg':_0x5564(0x1a2),'kRdjM':_0x5564(0x1a3),'bhzxo':_0x5564(0x12c),'huzZl':'error','rxTkL':_0x5564(0x1a4),'XJYSz':function(_0xe53af5,_0x3091ad){return _0xe53af5===_0x3091ad;},'bhYXs':_0x5564(0x1a5),'FsiVs':function(_0x295b4e,_0x2bbd55){return _0x295b4e===_0x2bbd55;},'ENkpa':'XCFOg','mxcsd':_0x5564(0x37),'IpaiR':_0x5564(0x1a6),'aQQJk':'๐Ÿ”\x20Signing\x20in\x20after\x20revoke\x20-\x20consent\x20screen\x20MUST\x20appear...','nzsCS':function(_0x9447bd,_0x1238f8){return _0x9447bd===_0x1238f8;},'RFnSI':function(_0x1714ab,_0x1e77c5){return _0x1714ab!==_0x1e77c5;},'FSMRn':_0x5564(0x1a7),'ifnja':_0x5564(0x1a8),'UhqOH':_0x5564(0x1a9),'mgFlQ':'โŒ\x20Error\x20with\x20revoke\x20method:'};try{var _0x2f8d57;console[_0x5564(0x19)](_0x891be9[_0x5564(0x1aa)]),console[_0x5564(0x19)](_0x5564(0xbf),_0xa3aae8),initializeGoogleSignIn(),await _googleSignin[_0x5564(0x107)][_0x5564(0x1ab)]();try{if(_0x891be9[_0x5564(0x1ac)](_0x5564(0x1ad),_0x891be9[_0x5564(0x1ae)]))return _0x206c77[_0x5564(0xa8)](_0x891be9['SPHFF'])||_0x16b4d0['includes'](_0x891be9[_0x5564(0x1af)]);else await _googleSignin[_0x5564(0x107)]['revokeAccess'](),console[_0x5564(0x19)](_0x5564(0x1b0));}catch(_0x3d95b0){_0x891be9['FsiVs'](_0x891be9[_0x5564(0x1b1)],_0x5564(0x1b2))?console['log'](_0x891be9[_0x5564(0x1b3)],_0x3d95b0):(_0x17e5a0=_0x34cea7[_0x5564(0x6a)][_0x5564(0xea)],_0x3e79f0[_0x5564(0x19)](_0x891be9['kRdjM']),_0x5825c3['log'](_0x891be9[_0x5564(0x1b4)],_0x1e8872[_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121)));}await _googleSignin[_0x5564(0x107)][_0x5564(0x1b5)](),console['log'](_0x891be9['IpaiR']),console[_0x5564(0x19)](_0x891be9['aQQJk']);const _0x3622c3=await _googleSignin[_0x5564(0x107)][_0x5564(0x116)](),_0x50a7ba=await _googleSignin[_0x5564(0x107)]['getTokens'](),_0x110af0=await _googleSignin['GoogleSignin']['getCurrentUser'](),_0x34b49b=(_0x891be9[_0x5564(0x1b6)](_0x2f8d57=_0x3622c3['data'],null)||_0x891be9[_0x5564(0x1b7)](_0x2f8d57,void 0x0)?void 0x0:_0x2f8d57['serverAuthCode'])||(_0x110af0===null||_0x110af0===void 0x0?void 0x0:_0x110af0[_0x5564(0xea)]);return _0x34b49b?(console[_0x5564(0x19)](_0x5564(0x1b8)),console[_0x5564(0x19)](_0x891be9[_0x5564(0x1b4)],_0x34b49b[_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121)),!![]):_0x891be9[_0x5564(0x1b9)](_0x891be9[_0x5564(0x1ba)],_0x891be9[_0x5564(0x1bb)])?(console[_0x5564(0x4f)](_0x891be9[_0x5564(0x1bc)]),![]):(_0xf669ad[_0x5564(0x4f)](_0x5564(0x1bd),_0x4ce888),{'hasRefreshToken':![],'refreshTokenType':_0x891be9[_0x5564(0x1be)]});}catch(_0x1481ec){return console[_0x5564(0x4f)](_0x891be9[_0x5564(0x1bf)],_0x1481ec),![];}};exports['forceYouTubeReconnectionWithRevoke']=forceYouTubeReconnectionWithRevoke;const fixUserYouTubeConnection=async _0x45e213=>{const _0x87c34f={'dbvbx':function(_0x40a2bb,_0x32e53a){return _0x40a2bb(_0x32e53a);},'BpPdI':_0x5564(0x1c0),'Iakat':function(_0x3a17e6,_0xc4a9fe){return _0x3a17e6(_0xc4a9fe);}};console[_0x5564(0x19)](_0x5564(0x1c1)+_0x45e213),console[_0x5564(0x19)]('๐Ÿ”„\x20Method\x201:\x20Trying\x20forced\x20consent\x20via\x20configuration...');let _0x588273=await _0x87c34f[_0x5564(0x1c2)](forceYouTubeReconnectionWithConsent,_0x45e213);if(_0x588273)return console[_0x5564(0x19)]('โœ…\x20'+_0x45e213+_0x5564(0x1c3)),!![];console[_0x5564(0x19)](_0x87c34f[_0x5564(0x1c4)]),_0x588273=await _0x87c34f[_0x5564(0x1c5)](forceYouTubeReconnectionWithRevoke,_0x45e213);if(_0x588273)return console['log']('โœ…\x20'+_0x45e213+_0x5564(0x1c6)),!![];return console[_0x5564(0x4f)](_0x5564(0x1c7)+_0x45e213+_0x5564(0x1c8)),![];};exports[_0x5564(0xc)]=fixUserYouTubeConnection;const refreshGoogleTokens=async()=>{const _0x1bb0ff={'fleco':_0x5564(0x1c9),'WwKQL':function(_0x1e7437,_0x50c4f3,_0x4f3b21){return _0x1e7437(_0x50c4f3,_0x4f3b21);},'yAhGw':_0x5564(0x36),'kuOXa':function(_0x3d02b8,_0x486c8a){return _0x3d02b8(_0x486c8a);},'HVDDI':_0x5564(0x1ca),'sLiSq':'๐Ÿ”„\x20Attempting\x20to\x20refresh\x20Google\x20tokens...','meoiz':_0x5564(0x1cb),'xHgju':'โŒ\x20Failed\x20to\x20refresh\x20Google\x20tokens:','KQCxl':function(_0x4fd977,_0x28a553){return _0x4fd977!==_0x28a553;},'AWATF':_0x5564(0x1cc),'FusBL':_0x5564(0x1cd),'CYHUO':function(_0x178c15,_0x487238){return _0x178c15===_0x487238;},'YyyTX':_0x5564(0x1ce),'ivmEG':_0x5564(0x1cf)};try{console[_0x5564(0x19)](_0x1bb0ff['sLiSq']);const _0x5697aa=await _googleSignin[_0x5564(0x107)][_0x5564(0x11b)]();if(!_0x5697aa)return console[_0x5564(0x19)](_0x5564(0x1d0)),null;const _0x9ad0da=await _googleSignin[_0x5564(0x107)]['getTokens']();return console[_0x5564(0x19)](_0x1bb0ff[_0x5564(0x1d1)]),{'accessToken':_0x9ad0da[_0x5564(0x108)],'idToken':_0x9ad0da['idToken']};}catch(_0x3bf72c){console[_0x5564(0x4f)](_0x1bb0ff['xHgju'],_0x3bf72c);try{if(_0x1bb0ff[_0x5564(0x1d2)](_0x1bb0ff[_0x5564(0x1d3)],_0x1bb0ff[_0x5564(0x1d3)]))return _0x2f8aae[_0x5564(0x4f)](_0x1bb0ff['fleco'],_0xf028c3),null;else{console['log'](_0x1bb0ff['FusBL']);const _0x5fd9aa=await _googleSignin[_0x5564(0x107)][_0x5564(0x116)](),_0x1421c3=await _googleSignin[_0x5564(0x107)][_0x5564(0x11a)]();return console[_0x5564(0x19)](_0x5564(0x1d4)),{'accessToken':_0x1421c3[_0x5564(0x108)],'idToken':_0x1421c3[_0x5564(0x15d)]};}}catch(_0x2f1626){if(_0x1bb0ff[_0x5564(0x1d5)](_0x1bb0ff[_0x5564(0x1d6)],_0x1bb0ff[_0x5564(0x1d7)])){const _0x270534={'jKddd':_0x1bb0ff[_0x5564(0x1d8)],'USxpX':function(_0x55a989,_0x597ef4){return _0x1bb0ff[_0x5564(0x1d9)](_0x55a989,_0x597ef4);}};return _0x27d234['log'](_0x1bb0ff[_0x5564(0x1da)]),new _0x399e7b(_0x573681=>{_0x1bb0ff[_0x5564(0x1db)](_0x39e0ed,()=>{_0x191f18['log'](_0x270534[_0x5564(0x1dc)]),_0x270534[_0x5564(0x1dd)](_0x573681,!![]);},0x3e8);});}else return console['error'](_0x1bb0ff[_0x5564(0x1de)],_0x2f1626),null;}}},debugYouTubeTokens=async()=>{const _0x4f8f7e={'YqTio':'๐Ÿ”\x20YouTube\x20Token\x20Debug:','PgdVQ':'Missing','JeFky':function(_0x4046dd,_0x3f80ce){return _0x4046dd!==_0x3f80ce;},'jCgDI':function(_0x3b8185,_0x12878e){return _0x3b8185===_0x12878e;},'XGTPi':function(_0x319314,_0x1ce7d3){return _0x319314===_0x1ce7d3;},'pIcRK':function(_0x1bb49a,_0x1455f0){return _0x1bb49a===_0x1455f0;},'oArOw':function(_0x521771,_0x1bdc2d){return _0x521771!==_0x1bdc2d;},'vrSUs':function(_0x18ea6e,_0x98ebb3){return _0x18ea6e!==_0x98ebb3;},'cWGVX':_0x5564(0xea),'RdKlk':_0x5564(0x1df),'ujCIG':_0x5564(0x1bd)};try{var _0x2e6fc4;const _0x29e29a=await _googleSignin[_0x5564(0x107)][_0x5564(0x11a)](),_0x45b8a1=await _googleSignin[_0x5564(0x107)][_0x5564(0x11b)]();return console['log'](_0x4f8f7e['YqTio'],{'accessToken':_0x29e29a[_0x5564(0x108)]?_0x29e29a[_0x5564(0x108)][_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121):_0x4f8f7e['PgdVQ'],'idToken':_0x29e29a[_0x5564(0x15d)]?_0x5564(0x1e0):_0x4f8f7e[_0x5564(0x1e1)],'serverAuthCode':_0x4f8f7e[_0x5564(0x1e2)](_0x45b8a1,null)&&_0x4f8f7e['JeFky'](_0x45b8a1,void 0x0)&&_0x45b8a1[_0x5564(0xea)]?_0x45b8a1[_0x5564(0xea)][_0x5564(0x5e)](0x0,0x14)+'...':_0x4f8f7e['PgdVQ'],'userEmail':(_0x4f8f7e[_0x5564(0x1e3)](_0x45b8a1,null)||_0x4f8f7e[_0x5564(0x1e4)](_0x45b8a1,void 0x0)||_0x4f8f7e[_0x5564(0x1e5)](_0x2e6fc4=_0x45b8a1[_0x5564(0x6c)],null)||_0x4f8f7e[_0x5564(0x1e3)](_0x2e6fc4,void 0x0)?void 0x0:_0x2e6fc4[_0x5564(0x75)])||_0x4f8f7e['PgdVQ']}),{'hasRefreshToken':!!(_0x4f8f7e[_0x5564(0x1e6)](_0x45b8a1,null)&&_0x4f8f7e[_0x5564(0x1e2)](_0x45b8a1,void 0x0)&&_0x45b8a1[_0x5564(0xea)]),'refreshTokenType':_0x4f8f7e[_0x5564(0x1e7)](_0x45b8a1,null)&&_0x45b8a1!==void 0x0&&_0x45b8a1['serverAuthCode']?_0x4f8f7e[_0x5564(0x1e8)]:_0x4f8f7e[_0x5564(0x1e9)]};}catch(_0x6f8a0d){return console['error'](_0x4f8f7e[_0x5564(0x1ea)],_0x6f8a0d),{'hasRefreshToken':![],'refreshTokenType':_0x5564(0x4f)};}},reconnectYouTube=async _0x1efc5e=>{const _0x290426={'zmMjv':'โŒ\x20[TRAINING\x20RESTART]\x20Error\x20triggering\x20training\x20restart:','jxNSE':_0x5564(0x1eb),'fGELA':_0x5564(0x1ec),'kEKxf':_0x5564(0x35),'vnQoU':function(_0x42b219,_0x1fa561){return _0x42b219===_0x1fa561;},'YbZnn':_0x5564(0x1ed),'IFyrn':_0x5564(0x1ee),'Sfyru':'SescP','aCmwy':_0x5564(0x1ef),'PZTiP':_0x5564(0x1f0),'hemBM':'โ„น๏ธ\x20Already\x20signed\x20out\x20or\x20sign\x20out\x20failed:','RqExf':_0x5564(0x1f1),'YBMIZ':function(_0x497f00,_0x364017,_0x1e33e){return _0x497f00(_0x364017,_0x1e33e);},'OfboC':_0x5564(0xd9),'RrRxO':_0x5564(0x1f2),'TXfUO':_0x5564(0x1f3),'kBhrM':function(_0x50ba45){return _0x50ba45();},'RWrxP':_0x5564(0xbd),'HUNsk':_0x5564(0x1f4),'cQEPm':function(_0x136c47,_0x311287){return _0x136c47===_0x311287;},'qWbiM':_0x5564(0x1f5),'COMTS':'โŒ\x20YouTube\x20reconnection\x20error:'};try{if(_0x290426['vnQoU'](_0x290426[_0x5564(0x1f6)],_0x290426[_0x5564(0x1f7)])){_0x52d90b[_0x5564(0x4f)](_0x290426[_0x5564(0x1f8)],_0x45aa71);throw _0x2e901b;}else{console[_0x5564(0x19)](_0x5564(0x1f9));try{if(_0x290426[_0x5564(0x1fa)]!==_0x290426[_0x5564(0x1fb)])await _googleSignin['GoogleSignin'][_0x5564(0x1b5)](),console[_0x5564(0x19)](_0x290426[_0x5564(0x1fc)]);else return{'success':![],'message':_0x290426[_0x5564(0x1fd)],'details':_0xb99a4c};}catch(_0x334838){console[_0x5564(0x19)](_0x290426[_0x5564(0x1fe)],_0x334838);}try{const _0xd0943d=await _googleSignin['GoogleSignin'][_0x5564(0x11a)]();_0xd0943d[_0x5564(0x108)]&&(await _googleSignin[_0x5564(0x107)]['clearCachedAccessToken'](_0xd0943d['accessToken']),console[_0x5564(0x19)](_0x5564(0x1ff)));}catch(_0x2f6e9b){console['log'](_0x290426[_0x5564(0x200)],_0x2f6e9b);}const _0x25e2f5=await _0x290426[_0x5564(0x201)](initiateNativeAuth,_0x290426[_0x5564(0x202)],_0x1efc5e);if(_0x25e2f5){if(_0x290426[_0x5564(0x203)](_0x290426['RrRxO'],_0x5564(0x204)))return _0x3367e7['error'](_0x290426[_0x5564(0x205)],_0x11ce93),{'success':![],'error':_0x290426[_0x5564(0x206)]};else{console[_0x5564(0x19)](_0x290426['TXfUO']);const _0x5c44e3=await _0x290426[_0x5564(0x207)](debugYouTubeTokens);return _0x5c44e3[_0x5564(0x189)]?console[_0x5564(0x19)](_0x290426[_0x5564(0x208)],_0x5c44e3[_0x5564(0x166)]):console[_0x5564(0x18c)](_0x290426[_0x5564(0x209)]),!![];}}else{if(_0x290426[_0x5564(0x20a)](_0x290426[_0x5564(0x20b)],_0x5564(0x20c)))_0x511af6['log'](_0x5564(0xc2),_0x4220dc);else return console[_0x5564(0x4f)](_0x5564(0x20d)),![];}}}catch(_0x15b45f){return console['error'](_0x290426[_0x5564(0x20e)],_0x15b45f),![];}};exports['reconnectYouTube']=reconnectYouTube;const initiateNativeAuth=async(_0x216bba,_0x49ab0d)=>{const _0x37403c={'nqrNu':'โœ…\x20YouTube\x20channel\x20found:','sDFde':_0x5564(0xb9),'xeUyt':function(_0x1dccee,_0x36118b){return _0x1dccee===_0x36118b;},'fvlGX':_0x5564(0x12),'claIN':_0x5564(0x20f),'xjZay':'โœ…\x20[YOUTUBE\x20AUTH]\x20Backend\x20confirmed\x20refresh\x20token\x20received','BSgcG':_0x5564(0x210),'nTQWp':_0x5564(0xef),'kSuKB':'โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20User\x20may\x20need\x20to\x20manually\x20restart\x20training','ZbkxH':'\x20\x20\x202.\x20API\x20server\x20(API\x20server)\x20is\x20unreachable','leopX':'\x20\x20\x204.\x20SSL/TLS\x20certificate\x20issue','xfpjD':_0x5564(0x211),'QgGxK':'\x20\x20\x203.\x20DNS\x20resolution\x20failed','uGqOU':_0x5564(0x7f),'lyDKb':_0x5564(0x181),'XPiEA':_0x5564(0x212),'MAlLC':_0x5564(0x213),'ehvCx':_0x5564(0x182),'AfQqU':_0x5564(0xe0),'DmAaO':_0x5564(0xe1),'VGXOy':_0x5564(0x36),'UplXm':function(_0x1245f3,_0x4a5e1a){return _0x1245f3(_0x4a5e1a);},'osSwB':function(_0x4d1577,_0x555910,_0x2056aa){return _0x4d1577(_0x555910,_0x2056aa);},'TqbKz':function(_0x243bbc,_0x541623){return _0x243bbc===_0x541623;},'wqhMk':'youtube','OsopR':function(_0x2cc380,_0x106782){return _0x2cc380!==_0x106782;},'RRfBW':_0x5564(0x214),'YRBDS':_0x5564(0x215),'UCeGt':_0x5564(0x216),'MGrCK':_0x5564(0x217),'bAlNt':'bRnuH','DXWUx':function(_0x1e57c0){return _0x1e57c0();},'NlbiD':_0x5564(0x218),'lygVj':_0x5564(0x219),'qKjzk':'๐Ÿ”„\x20Signed\x20out\x20to\x20force\x20fresh\x20consent','CSrgw':_0x5564(0x21a),'OVztU':function(_0x193b2e,_0x4bd863){return _0x193b2e===_0x4bd863;},'Bnrsj':_0x5564(0x21b),'yZNrY':_0x5564(0x21c),'DOCNU':_0x5564(0x21d),'REIbW':_0x5564(0x21e),'efaAc':'๐Ÿ”\x20REFRESH\x20TOKEN\x20EXTRACTION:','vcfRK':'-\x20userInfo.data?.serverAuthCode:','bccmM':function(_0x468d08,_0x2a6cd9){return _0x468d08!==_0x2a6cd9;},'NqWHZ':function(_0x5f3350,_0x170c58){return _0x5f3350!==_0x170c58;},'kgBUT':_0x5564(0xcb),'UPQHd':'-\x20currentUser?.serverAuthCode:','jcoHP':_0x5564(0x21f),'QvyiX':_0x5564(0x220),'IxdJM':function(_0xad72d0,_0xaa51a1){return _0xad72d0!==_0xaa51a1;},'wBFXE':_0x5564(0x221),'voQrD':'๐Ÿ”‘\x20Refresh\x20token\x20preview:','ejYRv':function(_0x12b6bd,_0x3fb3be){return _0x12b6bd!==_0x3fb3be;},'IYFUc':_0x5564(0x1a3),'ykOoc':_0x5564(0x222),'mCvTw':_0x5564(0x223),'JMzDD':'๐Ÿ’ก\x20Check\x20Google\x20Sign-In\x20configuration:\x20offlineAccess,\x20forceCodeForRefreshToken','bzXYt':_0x5564(0x224),'pIUff':function(_0x46970b,_0x3d2aae){return _0x46970b!==_0x3d2aae;},'BgJZB':_0x5564(0x225),'dlWLY':_0x5564(0x226),'cntkN':_0x5564(0xea),'YDgyk':_0x5564(0xcf),'FZGRy':_0x5564(0x143),'aqIfF':function(_0xcebf77,_0x4344ad){return _0xcebf77===_0x4344ad;},'kjGfC':_0x5564(0x227),'MWAhI':_0x5564(0x228),'GUeih':function(_0x19dfd7,_0x438222){return _0x19dfd7>_0x438222;},'QGNqf':_0x5564(0xd3),'XVWqo':function(_0x5519f4,_0x44a68a){return _0x5519f4===_0x44a68a;},'SUwRO':function(_0x28ac2f,_0x392912){return _0x28ac2f===_0x392912;},'aaCjj':'No\x20Channel','RrMGD':_0x5564(0x229),'xQGuI':_0x5564(0x38),'DFUyd':function(_0xdba058,_0x1f64b8){return _0xdba058===_0x1f64b8;},'yQMcN':function(_0x211c9e,_0x2edd7d){return _0x211c9e===_0x2edd7d;},'YDEHl':_0x5564(0xd6),'OKItC':function(_0x5c32f7,_0x21d83f){return _0x5c32f7===_0x21d83f;},'aTqhT':function(_0x3e0e06,_0x3c429b){return _0x3e0e06===_0x3c429b;},'qtphC':_0x5564(0x22a),'nIENP':function(_0x3a084e,_0x328765){return _0x3a084e||_0x328765;},'GhFrD':function(_0x287077,_0x26f5f8){return _0x287077===_0x26f5f8;},'acJtX':function(_0x298a6d,_0x1772fa){return _0x298a6d===_0x1772fa;},'nIgOT':_0x5564(0x22b),'lqbAF':_0x5564(0x22c),'SOrSs':_0x5564(0x22d),'slFDc':'โ„น๏ธ\x20User\x20should\x20authenticate\x20first\x20via\x20Google/Apple/Email\x20before\x20connecting\x20YouTube','XPgEa':_0x5564(0x72),'uxmmn':_0x5564(0x22e),'VYStE':_0x5564(0x22f),'UyEuu':'No\x20token','muMgu':'๐Ÿ“บ\x20YouTube\x20channel\x20name:','MOHTT':function(_0x351b14,_0x11bd5c){return _0x351b14===_0x11bd5c;},'DNoHe':function(_0x62a9be,_0x5b833c){return _0x62a9be===_0x5b833c;},'OpIdX':function(_0x959bfd,_0x94f26){return _0x959bfd===_0x94f26;},'EImOy':function(_0x26afec,_0x24677a){return _0x26afec===_0x24677a;},'usKXw':function(_0x34f8dc,_0x5bf3f2){return _0x34f8dc===_0x5bf3f2;},'UopRA':function(_0x31cf0e,_0x4a7877){return _0x31cf0e===_0x4a7877;},'FruDJ':function(_0x5f294d,_0x12848c){return _0x5f294d===_0x12848c;},'gsUeo':function(_0x3bfe09,_0x533408){return _0x3bfe09!==_0x533408;},'jLjTs':function(_0x4e165f,_0x6c0bae){return _0x4e165f!==_0x6c0bae;},'NoajL':_0x5564(0x230),'tfapu':function(_0x191c16,_0x48a195){return _0x191c16+_0x48a195;},'ynpJH':function(_0x454ae8,_0x5b2a4a){return _0x454ae8*_0x5b2a4a;},'WCTNW':'none','pFhtb':_0x5564(0x231),'TNRDh':_0x5564(0x232),'AbVPX':'-\x20refreshTokenType:','qnCnA':'-\x20userEmail:','bbGvo':function(_0x71c6ae,_0x25d633){return _0x71c6ae===_0x25d633;},'dfjfS':_0x5564(0x233),'fkNgw':_0x5564(0x234),'YGmDn':_0x5564(0x235),'ncEeJ':'๐Ÿ“ก\x20Backend\x20response\x20headers:','uqgkP':function(_0x5d4b75,_0x54c704){return _0x5d4b75!==_0x54c704;},'oYTNZ':'oXKlL','KvKdF':_0x5564(0x236),'zyEyJ':_0x5564(0x237),'sTtST':function(_0x4798fc,_0x3d7c45){return _0x4798fc===_0x3d7c45;},'AjucJ':function(_0x27ccf4,_0x49d00e){return _0x27ccf4===_0x49d00e;},'OGcGN':function(_0x260ccc,_0x5ef6b2){return _0x260ccc===_0x5ef6b2;},'ACipd':_0x5564(0x238),'WraLe':'โœ…\x20[YOUTUBE\x20AUTH]\x20Training\x20will\x20work,\x20but\x20connection\x20expires\x20in\x20~1\x20hour','kpfXr':function(_0x4db549,_0x124452){return _0x4db549!==_0x124452;},'hYoRY':_0x5564(0x239),'cAXYZ':_0x5564(0x23a),'pVPLk':_0x5564(0x23b),'YOVdT':_0x5564(0x23c),'HSVFJ':_0x5564(0x23d),'vWuvS':'โŒ\x20YouTube\x20auth\x20failed:','EsrOp':_0x5564(0x23e),'WMcXz':_0x5564(0xba),'hLKwn':function(_0x2e7862,_0x890bd3){return _0x2e7862===_0x890bd3;},'TQSOl':'Google\x20Sign-In\x20already\x20in\x20progress','pEOss':_0x5564(0x23f),'pzQJA':_0x5564(0x240),'NwGuU':_0x5564(0x241),'jkAvP':_0x5564(0x1ca)};if(_0x37403c[_0x5564(0x242)](_0x216bba,_0x37403c[_0x5564(0x243)])){if(_0x37403c[_0x5564(0x244)](_0x37403c[_0x5564(0x245)],_0x37403c[_0x5564(0x245)]))_0x1bedb1=_0x5aa84c[_0x5564(0x134)][0x0]['snippet'][_0x5564(0x10d)],_0x2db9c4=_0x237a85['items'][0x0]['id'],_0x3149ac[_0x5564(0x19)](_0x37403c[_0x5564(0x246)],_0x31189b,_0x37403c['sDFde'],_0x5f452c);else{console[_0x5564(0x19)](_0x37403c['YRBDS']);if(!_0x49ab0d||_0x49ab0d['trim']()===''){if(_0x37403c[_0x5564(0x242)](_0x37403c['UCeGt'],_0x37403c[_0x5564(0x247)]))return console[_0x5564(0x4f)](_0x37403c[_0x5564(0x248)]),![];else{var _0x1cd63e;return(_0x37403c[_0x5564(0x249)](_0x1cd63e=_0x10a737[_0x32f256],null)||_0x1cd63e===void 0x0?void 0x0:_0x1cd63e[_0x5564(0x9)])||![];}}try{if(_0x37403c[_0x5564(0x24a)]===_0x37403c[_0x5564(0x24a)]){var _0x1bde7d,_0x39196b,_0x5e9a91,_0xb67fa5,_0x2d67cb,_0x365bf4,_0x17d918,_0x33739c,_0x2eef64,_0x593e19;_0x37403c[_0x5564(0x24b)](initializeGoogleSignIn),await _googleSignin['GoogleSignin'][_0x5564(0x1ab)]();try{if(_0x37403c[_0x5564(0x249)](_0x37403c[_0x5564(0x24c)],_0x37403c['lygVj']))throw new _0x2b79fe(_0x37403c[_0x5564(0x24d)]);else await _googleSignin[_0x5564(0x107)][_0x5564(0x1b5)](),console[_0x5564(0x19)](_0x37403c[_0x5564(0x24e)]);}catch(_0x5630e){console[_0x5564(0x19)](_0x37403c[_0x5564(0x24f)],_0x5630e);}const _0x278cc9=await _googleSignin[_0x5564(0x107)][_0x5564(0x116)]();console[_0x5564(0x19)](_0x37403c[_0x5564(0x250)],_0x37403c[_0x5564(0x242)](_0x1bde7d=_0x278cc9['data'],null)||_0x37403c[_0x5564(0x242)](_0x1bde7d,void 0x0)||_0x37403c['xeUyt'](_0x1bde7d=_0x1bde7d[_0x5564(0x6c)],null)||_0x37403c[_0x5564(0x251)](_0x1bde7d,void 0x0)?void 0x0:_0x1bde7d['email']),console[_0x5564(0x19)](_0x37403c['Bnrsj']),console[_0x5564(0x19)](JSON[_0x5564(0x98)](_0x278cc9,null,0x2));const _0x330d30=await _googleSignin[_0x5564(0x107)][_0x5564(0x11a)]();console[_0x5564(0x19)](_0x37403c[_0x5564(0x252)]),console[_0x5564(0x19)](_0x37403c['DOCNU']),console[_0x5564(0x19)](JSON['stringify'](_0x330d30,null,0x2));const _0x1817ec=await _googleSignin['GoogleSignin'][_0x5564(0x11b)]();console['log'](_0x5564(0x253),_0x37403c[_0x5564(0x242)](_0x1817ec,null)||_0x37403c[_0x5564(0x251)](_0x1817ec,void 0x0)||(_0x39196b=_0x1817ec[_0x5564(0x6c)])===null||_0x37403c[_0x5564(0x251)](_0x39196b,void 0x0)?void 0x0:_0x39196b[_0x5564(0x75)]),console['log'](_0x37403c[_0x5564(0x254)]),console[_0x5564(0x19)](JSON['stringify'](_0x1817ec,null,0x2));let _0x3cb8cd=null;console[_0x5564(0x19)](_0x37403c[_0x5564(0x255)]),console[_0x5564(0x19)](_0x37403c[_0x5564(0x256)],_0x37403c[_0x5564(0x257)](_0x5e9a91=_0x278cc9[_0x5564(0x6a)],null)&&_0x37403c['NqWHZ'](_0x5e9a91,void 0x0)&&_0x5e9a91['serverAuthCode']?_0x5564(0x258)+_0x278cc9[_0x5564(0x6a)][_0x5564(0xea)][_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121):_0x37403c['kgBUT']),console[_0x5564(0x19)](_0x37403c[_0x5564(0x259)],_0x37403c[_0x5564(0x257)](_0x1817ec,null)&&_0x37403c[_0x5564(0x257)](_0x1817ec,void 0x0)&&_0x1817ec['serverAuthCode']?_0x5564(0x258)+_0x1817ec[_0x5564(0xea)][_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121):_0x37403c[_0x5564(0x25a)]),console[_0x5564(0x19)](_0x37403c[_0x5564(0x25b)],_0x330d30[_0x5564(0x15d)]?_0x5564(0x258)+_0x330d30[_0x5564(0x15d)]['substring'](0x0,0x14)+'...':_0x37403c['kgBUT']),console[_0x5564(0x19)](_0x37403c[_0x5564(0x25c)],_0x330d30[_0x5564(0x108)]?_0x5564(0x258)+_0x330d30['accessToken'][_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121):_0x37403c[_0x5564(0x25a)]);if(_0x37403c[_0x5564(0x25d)](_0x1817ec,null)&&_0x37403c[_0x5564(0x25d)](_0x1817ec,void 0x0)&&_0x1817ec[_0x5564(0xea)])_0x3cb8cd=_0x1817ec[_0x5564(0xea)],console[_0x5564(0x19)](_0x37403c[_0x5564(0x25e)]),console[_0x5564(0x19)](_0x37403c[_0x5564(0x25f)],_0x3cb8cd[_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121));else _0x37403c[_0x5564(0x260)](_0xb67fa5=_0x278cc9[_0x5564(0x6a)],null)&&_0x37403c['bccmM'](_0xb67fa5,void 0x0)&&_0xb67fa5[_0x5564(0xea)]&&(_0x3cb8cd=_0x278cc9['data'][_0x5564(0xea)],console[_0x5564(0x19)](_0x37403c[_0x5564(0x261)]),console[_0x5564(0x19)](_0x5564(0x12c),_0x3cb8cd[_0x5564(0x5e)](0x0,0x14)+_0x5564(0x121)));!_0x3cb8cd?_0x37403c['ykOoc']===_0x37403c[_0x5564(0x262)]?(console[_0x5564(0x4f)](_0x37403c[_0x5564(0x263)]),console['error'](_0x5564(0x264)),console[_0x5564(0x4f)](_0x37403c[_0x5564(0x265)]),console[_0x5564(0x18c)](_0x37403c[_0x5564(0x266)])):_0x285482['log'](_0x37403c[_0x5564(0x24f)],_0x48bc56):_0x37403c[_0x5564(0x267)](_0x37403c['BgJZB'],_0x37403c['BgJZB'])?_0x45eb5a[_0x5564(0x4f)](_0x5564(0x9a)+_0x27a23f+':',_0x548bb4):(console['log'](_0x37403c[_0x5564(0x268)]),console[_0x5564(0x19)](_0x5564(0xce),_0x3cb8cd['startsWith']('4/')?_0x37403c['cntkN']:_0x37403c[_0x5564(0x269)]));let _0x38b828=_0x37403c['FZGRy'],_0x332690=null;try{console[_0x5564(0x19)](_0x5564(0x130));const _0x4cefee=await _0x37403c['osSwB'](fetch,_0x5564(0xd0),{'headers':{'Authorization':_0x5564(0x1d)+_0x330d30[_0x5564(0x108)],'Accept':'application/json'}});if(_0x4cefee['ok']){if(_0x37403c[_0x5564(0x26a)](_0x37403c[_0x5564(0x26b)],_0x37403c['MWAhI']))_0x46cbf8[_0x5564(0x19)](_0x37403c[_0x5564(0x26c)]),_0x5e0d19[_0x5564(0x19)](_0x37403c[_0x5564(0x26d)]);else{const _0x31ca79=await _0x4cefee[_0x5564(0x132)]();if(_0x31ca79[_0x5564(0x134)]&&_0x37403c[_0x5564(0x26e)](_0x31ca79[_0x5564(0x134)][_0x5564(0x135)],0x0)){if(_0x37403c['aqIfF']('tlPiA',_0x5564(0x26f)))return _0x4e8dd2['error'](_0x5564(0x270),_0x38aa10[_0x5564(0x54)]),{'success':![],'message':'Network\x20error:\x20'+_0x589924[_0x5564(0x54)],'details':{'error':_0x3a679a[_0x5564(0x54)],'results':_0x1a212b}};else _0x38b828=_0x31ca79[_0x5564(0x134)][0x0][_0x5564(0x10c)][_0x5564(0x10d)],_0x332690=_0x31ca79['items'][0x0]['id'],console['log'](_0x37403c[_0x5564(0x246)],_0x38b828,_0x37403c['sDFde'],_0x332690);}else{var _0x1349a9,_0x163993;console['log'](_0x37403c[_0x5564(0x271)]),_0x38b828=(_0x37403c[_0x5564(0x272)](_0x1349a9=_0x278cc9[_0x5564(0x6a)],null)||_0x37403c[_0x5564(0x251)](_0x1349a9,void 0x0)||_0x37403c['aqIfF'](_0x1349a9=_0x1349a9[_0x5564(0x6c)],null)||_0x37403c[_0x5564(0x273)](_0x1349a9,void 0x0)?void 0x0:_0x1349a9['name'])||(_0x37403c[_0x5564(0x249)](_0x163993=_0x278cc9[_0x5564(0x6a)],null)||_0x163993===void 0x0||(_0x163993=_0x163993[_0x5564(0x6c)])===null||_0x163993===void 0x0?void 0x0:_0x163993[_0x5564(0x75)])||_0x37403c[_0x5564(0x274)];}}}else{if('GWbvY'===_0x37403c['RrMGD'])_0xc57e20['warn'](_0x37403c[_0x5564(0x275)],_0x2391d6),_0x5375eb[_0x5564(0x18c)](_0x37403c[_0x5564(0x276)]);else{var _0x18971c,_0x59e8f4;console[_0x5564(0x19)](_0x37403c[_0x5564(0x277)],_0x4cefee[_0x5564(0x5d)]),_0x38b828=(_0x37403c[_0x5564(0x26a)](_0x18971c=_0x278cc9[_0x5564(0x6a)],null)||_0x37403c[_0x5564(0x242)](_0x18971c,void 0x0)||(_0x18971c=_0x18971c[_0x5564(0x6c)])===null||_0x37403c[_0x5564(0x278)](_0x18971c,void 0x0)?void 0x0:_0x18971c[_0x5564(0x61)])||(_0x37403c[_0x5564(0x272)](_0x59e8f4=_0x278cc9['data'],null)||_0x37403c[_0x5564(0x279)](_0x59e8f4,void 0x0)||_0x37403c[_0x5564(0x279)](_0x59e8f4=_0x59e8f4[_0x5564(0x6c)],null)||_0x59e8f4===void 0x0?void 0x0:_0x59e8f4[_0x5564(0x75)])||'Unknown\x20Channel';}}}catch(_0x553ceb){var _0x5c5706,_0x176b56;console[_0x5564(0x19)](_0x37403c['YDEHl'],_0x553ceb),_0x38b828=((_0x5c5706=_0x278cc9[_0x5564(0x6a)])===null||_0x37403c[_0x5564(0x27a)](_0x5c5706,void 0x0)||_0x37403c[_0x5564(0x249)](_0x5c5706=_0x5c5706[_0x5564(0x6c)],null)||_0x37403c[_0x5564(0x272)](_0x5c5706,void 0x0)?void 0x0:_0x5c5706['name'])||(_0x37403c[_0x5564(0x272)](_0x176b56=_0x278cc9['data'],null)||_0x37403c[_0x5564(0x27b)](_0x176b56,void 0x0)||_0x37403c[_0x5564(0x27b)](_0x176b56=_0x176b56[_0x5564(0x6c)],null)||_0x176b56===void 0x0?void 0x0:_0x176b56['email'])||_0x37403c[_0x5564(0x27c)];}let _0x46a82a=await(0x0,_jwtStorageService[_0x5564(0x153)])();const _0x25d372=await _asyncStorage[_0x5564(0x27d)][_0x5564(0x27e)](_0x37403c[_0x5564(0x27f)]),_0x40fd22=_0x37403c[_0x5564(0x280)](_0x25d372,_0x49ab0d)||(_0x37403c[_0x5564(0x278)](_0x2d67cb=_0x278cc9[_0x5564(0x6a)],null)||_0x37403c[_0x5564(0x281)](_0x2d67cb,void 0x0)||(_0x2d67cb=_0x2d67cb[_0x5564(0x6c)])===null||_0x37403c[_0x5564(0x282)](_0x2d67cb,void 0x0)?void 0x0:_0x2d67cb['email'])||_0x37403c[_0x5564(0x283)];!_0x46a82a||_0x46a82a[_0x5564(0x154)]()[_0x5564(0x135)]<0x14?(console[_0x5564(0x19)](_0x37403c[_0x5564(0x284)]),console['log'](_0x37403c['SOrSs']),console[_0x5564(0x19)](_0x37403c[_0x5564(0x285)])):(console[_0x5564(0x19)](_0x37403c[_0x5564(0x286)]),console[_0x5564(0x19)](_0x5564(0x73),_0x46a82a['substring'](0x0,0x14)+_0x5564(0x121)));console['log'](_0x37403c[_0x5564(0x287)],_0x40fd22),console[_0x5564(0x19)](_0x37403c['VYStE'],_0x46a82a?_0x46a82a[_0x5564(0x5e)](0x0,0x14)+'...':_0x37403c[_0x5564(0x288)]),console[_0x5564(0x19)](_0x37403c['muMgu'],_0x38b828);const _0x4cd6e9={'session':{'username':_0x40fd22,'platform':_0x5564(0xd9),'timestamp':new Date()[_0x5564(0x93)](),'channelName':_0x38b828,'channelId':_0x332690},'googleUser':_0x37403c[_0x5564(0x289)](_0x365bf4=_0x278cc9[_0x5564(0x6a)],null)||_0x37403c[_0x5564(0x28a)](_0x365bf4,void 0x0)?void 0x0:_0x365bf4[_0x5564(0x6c)],'accessToken':_0x330d30[_0x5564(0x108)],'idToken':_0x330d30[_0x5564(0x15d)],'refreshToken':_0x3cb8cd,'serverAuthCode':_0x3cb8cd,'refresh_token':_0x3cb8cd,'server_auth_code':_0x3cb8cd,'authCode':_0x3cb8cd,'userAccountInfo':{'username':_0x40fd22,'email':_0x37403c[_0x5564(0x27a)](_0x17d918=_0x278cc9['data'],null)||_0x37403c[_0x5564(0x28b)](_0x17d918,void 0x0)||(_0x17d918=_0x17d918['user'])===null||_0x37403c[_0x5564(0x28c)](_0x17d918,void 0x0)?void 0x0:_0x17d918[_0x5564(0x75)],'authToken':_0x46a82a,'channelName':_0x38b828,'channelId':_0x332690,'userIdentifier':_0x46a82a?_0x5564(0x28d)+_0x46a82a[_0x5564(0x5e)](0x0,0xa):_0x5564(0x160)+((_0x33739c=_0x278cc9[_0x5564(0x6a)])===null||_0x37403c['usKXw'](_0x33739c,void 0x0)||_0x37403c[_0x5564(0x28e)](_0x33739c=_0x33739c[_0x5564(0x6c)],null)||_0x37403c['DNoHe'](_0x33739c,void 0x0)?void 0x0:_0x33739c[_0x5564(0x75)]),'googleId':_0x37403c[_0x5564(0x289)](_0x2eef64=_0x278cc9[_0x5564(0x6a)],null)||_0x37403c[_0x5564(0x282)](_0x2eef64,void 0x0)||_0x37403c[_0x5564(0x27b)](_0x2eef64=_0x2eef64[_0x5564(0x6c)],null)||_0x37403c['FruDJ'](_0x2eef64,void 0x0)?void 0x0:_0x2eef64['id'],'appleUserId':_0x37403c[_0x5564(0x28f)](_0x46a82a,null)&&_0x37403c[_0x5564(0x290)](_0x46a82a,void 0x0)&&_0x46a82a[_0x5564(0xa8)](_0x37403c[_0x5564(0x291)])?_0x46a82a[_0x5564(0xaf)]('.')[0x1]:null,'refreshToken':_0x3cb8cd,'serverAuthCode':_0x3cb8cd},'tokenExpiry':new Date(_0x37403c[_0x5564(0x292)](Date['now'](),_0x37403c['ynpJH'](0xe10,0x3e8)))['toISOString'](),'requestRefreshToken':!![],'debugInfo':{'hasRefreshToken':!!_0x3cb8cd,'refreshTokenType':_0x3cb8cd?_0x3cb8cd[_0x5564(0x12b)]('4/')?_0x37403c[_0x5564(0x293)]:_0x5564(0xcf):_0x37403c[_0x5564(0x294)],'configuredForRefresh':!![],'forcedConsent':!![],'refreshTokenValue':_0x3cb8cd}};console[_0x5564(0x19)](_0x5564(0x295)),console[_0x5564(0x19)](_0x37403c[_0x5564(0x296)],!!_0x4cd6e9['accessToken']),console[_0x5564(0x19)](_0x5564(0x297),!!_0x4cd6e9[_0x5564(0xcf)]),console['log'](_0x37403c['TNRDh'],!!_0x4cd6e9['serverAuthCode']),console[_0x5564(0x19)](_0x37403c[_0x5564(0x298)],_0x4cd6e9[_0x5564(0x165)][_0x5564(0x166)]),console[_0x5564(0x19)](_0x37403c[_0x5564(0x299)],(_0x593e19=_0x278cc9[_0x5564(0x6a)])===null||_0x37403c[_0x5564(0x272)](_0x593e19,void 0x0)||(_0x593e19=_0x593e19[_0x5564(0x6c)])===null||_0x37403c[_0x5564(0x29a)](_0x593e19,void 0x0)?void 0x0:_0x593e19[_0x5564(0x75)]),console['log'](_0x37403c[_0x5564(0x29b)],_0x38b828),console[_0x5564(0x19)](_0x37403c[_0x5564(0x29c)]),console['log'](JSON[_0x5564(0x98)](_0x4cd6e9,null,0x2)),console[_0x5564(0x19)](_0x5564(0x29d),!!_0x3cb8cd);const _0x154bc4=await _0x37403c[_0x5564(0x29e)](fetch,_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x16d),{'method':'POST','headers':{'Content-Type':'application/json',..._0x46a82a&&{'Authorization':_0x46a82a}},'body':JSON['stringify'](_0x4cd6e9)});console[_0x5564(0x19)](_0x37403c[_0x5564(0x29f)],_0x154bc4[_0x5564(0x5d)]),console[_0x5564(0x19)](_0x37403c[_0x5564(0x2a0)],_0x154bc4['headers']);if(_0x154bc4['ok']){if(_0x37403c['uqgkP'](_0x37403c[_0x5564(0x2a1)],_0x5564(0x2a2)))_0x55d33c['log'](_0x5564(0x2a3));else{var _0x4104d8,_0x278a71;const _0x51c583=await _0x154bc4[_0x5564(0x132)]();console[_0x5564(0x19)](_0x37403c[_0x5564(0x2a4)]),console['log'](_0x37403c['zyEyJ']),console[_0x5564(0x19)](JSON[_0x5564(0x98)](_0x51c583,null,0x2));const _0x5061ad=_0x37403c[_0x5564(0x2a5)]((_0x4104d8=_0x51c583[_0x5564(0x175)])===null||_0x37403c[_0x5564(0x2a6)](_0x4104d8,void 0x0)?void 0x0:_0x4104d8[_0x5564(0x177)],!![])||(_0x37403c[_0x5564(0x2a7)](_0x278a71=_0x51c583[_0x5564(0x17a)],null)||_0x278a71===void 0x0?void 0x0:_0x278a71[_0x5564(0x17c)])===!![]||_0x51c583['isTemporaryMode']===!![]||_0x51c583[_0x5564(0x54)]&&_0x51c583[_0x5564(0x54)][_0x5564(0xa8)](_0x37403c[_0x5564(0x2a8)]);if(_0x5061ad)console['log'](_0x5564(0x2a9)),console[_0x5564(0x19)](_0x37403c['WraLe']),console[_0x5564(0x19)](_0x5564(0x2aa));else{if(_0x51c583['hasRefreshToken']||_0x51c583['refreshTokenReceived']){if(_0x37403c[_0x5564(0x2ab)](_0x37403c[_0x5564(0x2ac)],_0x37403c[_0x5564(0x2ad)]))console[_0x5564(0x19)](_0x37403c[_0x5564(0x26c)]),console[_0x5564(0x19)](_0x37403c[_0x5564(0x26d)]);else{const _0x3a2ce0='0|3|1|4|2|5'[_0x5564(0xaf)]('|');let _0x59373=0x0;while(!![]){switch(_0x3a2ce0[_0x59373++]){case'0':_0x2ffdf3[_0x5564(0x4f)](_0x5564(0xb1)+_0x591e7c+_0x5564(0x14a));continue;case'1':_0xdc1e41[_0x5564(0x4f)](_0x37403c[_0x5564(0x2ae)]);continue;case'2':_0x5807dd[_0x5564(0x4f)](_0x37403c[_0x5564(0x2af)]);continue;case'3':_0x31013f[_0x5564(0x4f)](_0x37403c[_0x5564(0x2b0)]);continue;case'4':_0x1b0494['error'](_0x37403c[_0x5564(0x2b1)]);continue;case'5':_0x592562[_0x5564(0x4f)](_0x37403c[_0x5564(0x2b2)]);continue;}break;}}}else console[_0x5564(0x18c)](_0x37403c['pVPLk']),console['warn'](_0x37403c[_0x5564(0x2b3)],Object[_0x5564(0x2b4)](_0x51c583)),console[_0x5564(0x18c)](_0x37403c[_0x5564(0x2b5)]);}return!![];}}else{const _0x4c4937=await _0x154bc4[_0x5564(0x5b)]();return console[_0x5564(0x4f)](_0x37403c[_0x5564(0x2b6)],_0x154bc4[_0x5564(0x5d)]),console[_0x5564(0x4f)](_0x5564(0x2b7)),console['error'](_0x4c4937),![];}}else _0x5e2b3b['log'](_0x37403c['lyDKb']),_0x31fbd4[_0x5564(0x19)](_0x37403c['XPiEA']),_0x39ea68[_0x5564(0x19)](_0x5564(0xe2)),_0x48ded4[_0x5564(0x19)](_0x5564(0xe3)),_0x172eee[_0x5564(0x19)](_0x37403c[_0x5564(0x2b8)]),_0xbeaee0['log'](_0x37403c[_0x5564(0x2b9)]),_0x30e410[_0x5564(0x19)](_0x37403c[_0x5564(0x2ba)],_0x501e31?_0x37403c[_0x5564(0x2bb)]:'No');}catch(_0x12e523){console[_0x5564(0x4f)](_0x37403c[_0x5564(0x2bc)],_0x12e523);if(_0x12e523[_0x5564(0x20)]===_googleSignin[_0x5564(0x199)][_0x5564(0x19a)])console[_0x5564(0x19)](_0x37403c[_0x5564(0x2bd)]);else{if(_0x37403c[_0x5564(0x2be)](_0x12e523[_0x5564(0x20)],_googleSignin[_0x5564(0x199)][_0x5564(0x2bf)]))console[_0x5564(0x19)](_0x37403c[_0x5564(0x2c0)]);else _0x37403c[_0x5564(0x249)](_0x12e523[_0x5564(0x20)],_googleSignin[_0x5564(0x199)][_0x5564(0x19e)])&&console['log'](_0x37403c[_0x5564(0x2c1)]);}return![];}}}if(_0x37403c[_0x5564(0x28b)](_0x216bba,_0x37403c[_0x5564(0x2c2)])){if(_0x37403c[_0x5564(0x2a5)](_0x37403c[_0x5564(0x2c3)],_0x37403c['NwGuU']))return console['log'](_0x37403c[_0x5564(0x2c4)]),new Promise(_0x31bbb6=>{_0x37403c[_0x5564(0x29e)](setTimeout,()=>{console[_0x5564(0x19)](_0x37403c[_0x5564(0x2c5)]),_0x37403c[_0x5564(0x2c6)](_0x31bbb6,!![]);},0x3e8);});else _0x3bbe08[_0x5564(0x18c)](_0x5564(0x1f4));}return![];};exports[_0x5564(0x7)]=initiateNativeAuth;const isOAuthCallback=_0x5ac043=>{const _0x21aea1={'iBHvk':'auth/callback','dBUqc':'code='};return _0x5ac043[_0x5564(0xa8)](_0x21aea1['iBHvk'])||_0x5ac043[_0x5564(0xa8)](_0x21aea1[_0x5564(0x2c7)]);};exports[_0x5564(0x5)]=isOAuthCallback;const exchangeCodeForToken=async(_0x5dd16a,_0x1a61e3)=>{const _0x4dde23={'uYjEM':_0x5564(0x22c),'szoaQ':_0x5564(0x22d),'NURil':_0x5564(0x2c8),'NAsSy':'SDK\x20not\x20initialized.\x20Developers\x20must\x20call\x20initializeApiKey()\x20before\x20using\x20auth\x20features.','ScfEW':function(_0x3c9c5d,_0x9b64df){return _0x3c9c5d!==_0x9b64df;},'pFeoB':_0x5564(0x2c9),'DdVWA':_0x5564(0x2ca),'IJGqq':_0x5564(0x2cb),'EtwRP':function(_0x5ce320,_0x11af61){return _0x5ce320===_0x11af61;},'obNHo':_0x5564(0x2cc)};console[_0x5564(0x19)](_0x5564(0x2cd)+_0x1a61e3);try{if(_0x4dde23[_0x5564(0x2ce)](_0x4dde23['pFeoB'],_0x4dde23['pFeoB']))_0x26b6dd[_0x5564(0x19)](_0x4dde23['uYjEM']),_0x30f720[_0x5564(0x19)](_0x4dde23[_0x5564(0x2cf)]),_0x1df475[_0x5564(0x19)](_0x4dde23[_0x5564(0x2d0)]);else{const _0x3e9bf2=_api['API_CONFIG'][_0x5564(0x22)]+'/'+_0x1a61e3+'/token',_0x5a0679=await fetch(_0x3e9bf2,{'method':'POST','headers':{'Content-Type':'application/json'},'body':JSON[_0x5564(0x98)]({'code':_0x5dd16a,'platform':_0x1a61e3})});if(!_0x5a0679['ok']){if(_0x4dde23[_0x5564(0x2d1)]!==_0x4dde23[_0x5564(0x2d2)]){console[_0x5564(0x4f)]('Error\x20exchanging\x20code\x20for\x20token:\x20'+_0x5a0679[_0x5564(0x5d)]);throw new Error(_0x5564(0x158)+_0x5a0679[_0x5564(0x5d)]);}else _0x492fb0[_0x5564(0x4f)](_0x5564(0xa5)+_0x2e032b+_0x5564(0xa6));}const _0x1740d5=await _0x5a0679[_0x5564(0x132)]();return console[_0x5564(0x19)](_0x5564(0x2d3)+_0x1a61e3),_0x1740d5;}}catch(_0xda21b5){if(_0x4dde23[_0x5564(0x2d4)](_0x4dde23['obNHo'],_0x4dde23[_0x5564(0x2d5)]))return console[_0x5564(0x4f)](_0x5564(0x100),_0xda21b5),console[_0x5564(0x19)](_0x5564(0xb7)),{'access_token':_0x1a61e3+'_access_token_'+Math[_0x5564(0x103)]()[_0x5564(0x105)](0x24)['substring'](0x7),'refresh_token':_0x1a61e3+_0x5564(0x104)+Math['random']()[_0x5564(0x105)](0x24)[_0x5564(0x5e)](0x7),'expires_in':0xe10};else throw new _0x1a219b(_0x4dde23[_0x5564(0x2d6)]);}};function _0x5564(_0x1f2fa9,_0x5564c9){_0x1f2fa9=_0x1f2fa9-0x0;const _0x2e28a1=_0x1f2f();let _0x167348=_0x2e28a1[_0x1f2fa9];return _0x167348;}exports[_0x5564(0xd)]=exchangeCodeForToken;const refreshYouTubeTokens=async()=>{const _0x350984={'iwakz':_0x5564(0xeb),'WJfSC':_0x5564(0x2d7),'iIDcH':'โš ๏ธ\x20[YOUTUBE\x20REAUTH]\x20Expected\x20hasRefreshToken\x20or\x20refreshTokenReceived\x20in\x20response','TVQcx':function(_0x531791,_0x5cb0b1){return _0x531791===_0x5cb0b1;},'jETVO':'Google\x20Sign-In\x20already\x20in\x20progress','lvmQf':_0x5564(0x23f),'XBFPf':_0x5564(0x2d8),'UhNWW':_0x5564(0x2d9),'fYPLk':function(_0x598d26,_0x360843){return _0x598d26!==_0x360843;},'tKvvM':_0x5564(0x2da),'yKWek':_0x5564(0x183),'cxIkB':'XwlUT','syZAJ':'QbpVE','MxyXA':function(_0x302303,_0x518518,_0xfc23ba){return _0x302303(_0x518518,_0xfc23ba);},'eWSag':function(_0x5a1720,_0x2413e2){return _0x5a1720+_0x2413e2;},'BZago':function(_0x35ec09,_0x4bdae4){return _0x35ec09*_0x4bdae4;},'QiMGi':function(_0x1c5ff1,_0x385635){return _0x1c5ff1!==_0x385635;},'gNwiq':_0x5564(0x2db),'YpIGC':_0x5564(0x2dc),'GRruL':'โŒ\x20YouTube\x20token\x20refresh\x20failed:','YaLbA':'โŒ\x20Error\x20refreshing\x20YouTube\x20tokens:'};try{var _0x2535f8;console[_0x5564(0x19)]('๐Ÿ”„\x20Refreshing\x20YouTube\x20tokens...');const _0x2d48ea=await _googleSignin[_0x5564(0x107)]['getTokens']();if(!_0x2d48ea)return console[_0x5564(0x4f)](_0x350984[_0x5564(0x2dd)]),![];const _0x3f51aa=await _googleSignin[_0x5564(0x107)][_0x5564(0x11b)]();if(!_0x3f51aa)return _0x350984[_0x5564(0x2de)](_0x350984[_0x5564(0x2df)],_0x350984[_0x5564(0x2df)])?(_0x58409c[_0x5564(0x18c)](_0x350984[_0x5564(0x2e0)]),_0xf31ac3[_0x5564(0x18c)](_0x350984['WJfSC'],_0x495467),_0x464d32[_0x5564(0x18c)](_0x350984[_0x5564(0x2e1)]),![]):(console[_0x5564(0x4f)](_0x350984[_0x5564(0x2e2)]),![]);const _0x1e8904=await(0x0,_jwtStorageService['getJWT'])();if(!_0x1e8904){if(_0x350984[_0x5564(0x2e3)]!==_0x350984[_0x5564(0x2e4)])return console[_0x5564(0x4f)]('โŒ\x20No\x20auth\x20token\x20found\x20for\x20YouTube\x20refresh'),![];else{_0x4f9794['error'](_0x5564(0x23e),_0xbdc400);if(_0x350984[_0x5564(0x2e5)](_0x23f55f[_0x5564(0x20)],_0x457de1[_0x5564(0x199)][_0x5564(0x19a)]))_0x3cc48d[_0x5564(0x19)](_0x5564(0xba));else{if(_0x146b53[_0x5564(0x20)]===_0x462e51['statusCodes'][_0x5564(0x2bf)])_0x27ef06[_0x5564(0x19)](_0x350984[_0x5564(0x2e6)]);else _0x5ba0ac[_0x5564(0x20)]===_0x578c06[_0x5564(0x199)]['PLAY_SERVICES_NOT_AVAILABLE']&&_0x3b2d97[_0x5564(0x19)](_0x350984[_0x5564(0x2e7)]);}return![];}}const _0xc33e78=await _0x350984['MxyXA'](fetch,_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x2e8),{'method':'POST','headers':{'Content-Type':'application/json','Authorization':_0x1e8904},'body':JSON[_0x5564(0x98)]({'accessToken':_0x2d48ea[_0x5564(0x108)],'idToken':_0x2d48ea['idToken'],'refreshToken':_0x3f51aa[_0x5564(0xea)],'userEmail':_0x350984[_0x5564(0x2e5)](_0x2535f8=_0x3f51aa[_0x5564(0x6c)],null)||_0x350984[_0x5564(0x2e5)](_0x2535f8,void 0x0)?void 0x0:_0x2535f8[_0x5564(0x75)],'tokenExpiry':new Date(_0x350984[_0x5564(0x2e9)](Date[_0x5564(0x163)](),_0x350984['BZago'](0xe10,0x3e8)))[_0x5564(0x93)](),'timestamp':new Date()[_0x5564(0x93)]()})});if(_0xc33e78['ok']){if(_0x350984[_0x5564(0x2ea)](_0x350984[_0x5564(0x2eb)],'oZTuG'))return{'success':![],'error':_0x1fb5d0[_0x5564(0x54)]||_0x350984[_0x5564(0x2ec)]};else{const _0x95771f=await _0xc33e78[_0x5564(0x132)]();return console[_0x5564(0x19)](_0x350984[_0x5564(0x2ed)],_0x95771f),!![];}}else{const _0x360c3f=await _0xc33e78[_0x5564(0x5b)]();return console['error'](_0x350984['GRruL'],_0xc33e78[_0x5564(0x5d)],_0x360c3f),![];}}catch(_0x17576f){return console['error'](_0x350984['YaLbA'],_0x17576f),![];}};exports[_0x5564(0x3)]=refreshYouTubeTokens;const triggerTrainingRestart=async(_0x222ccc,_0x33e2f4)=>{const _0x103780={'fIdDu':function(_0x5b3a95,_0x108943){return _0x5b3a95===_0x108943;},'sLYRy':_0x5564(0x23f),'TYJWs':_0x5564(0x2ee),'rqcQg':'๐Ÿ”„\x20[TRAINING\x20RESTART]\x20Triggering\x20training\x20restart\x20for\x20user:','EcAnt':function(_0x1a9e1a,_0x218ce4,_0x30a2f3){return _0x1a9e1a(_0x218ce4,_0x30a2f3);},'xETUZ':'youtube','TEUEO':_0x5564(0x2ef),'ZRUyX':_0x5564(0x2f0),'peXGJ':function(_0x3291dc,_0x411c3e){return _0x3291dc===_0x411c3e;},'zPDhG':_0x5564(0x2f1),'GDTnZ':_0x5564(0x2f2)};try{if(_0x103780['TYJWs']===_0x103780[_0x5564(0x2f3)]){console[_0x5564(0x19)](_0x103780[_0x5564(0x2f4)],_0x222ccc);const _0xa0db3a=await _0x103780[_0x5564(0x2f5)](fetch,_api[_0x5564(0x21)][_0x5564(0x22)]+'/mobile-training/restart',{'method':'POST','headers':{'Content-Type':'application/json','Authorization':_0x33e2f4},'body':JSON[_0x5564(0x98)]({'username':_0x222ccc,'reason':_0x5564(0x2f6),'platform':_0x103780[_0x5564(0x2f7)],'timestamp':new Date()[_0x5564(0x93)](),'requestNewTraining':!![]})});if(_0xa0db3a['ok']){const _0x2a7780=await _0xa0db3a[_0x5564(0x132)]();console[_0x5564(0x19)](_0x103780['TEUEO'],_0x2a7780);}else{const _0x5a821b=await _0xa0db3a[_0x5564(0x5b)]();console['error'](_0x103780[_0x5564(0x2f8)],_0xa0db3a[_0x5564(0x5d)],_0x5a821b);throw new Error(_0x5564(0x2f9)+_0xa0db3a['status']);}}else{var _0x1314c9,_0x5c3f83;_0x13386c['log'](_0x5564(0xd3)),_0x5e5843=(_0x103780[_0x5564(0x2fa)](_0x1314c9=_0x598326[_0x5564(0x6a)],null)||_0x103780[_0x5564(0x2fa)](_0x1314c9,void 0x0)||_0x103780[_0x5564(0x2fa)](_0x1314c9=_0x1314c9['user'],null)||_0x103780[_0x5564(0x2fa)](_0x1314c9,void 0x0)?void 0x0:_0x1314c9[_0x5564(0x61)])||(_0x103780[_0x5564(0x2fa)](_0x5c3f83=_0x17c19b[_0x5564(0x6a)],null)||_0x5c3f83===void 0x0||_0x103780[_0x5564(0x2fa)](_0x5c3f83=_0x5c3f83[_0x5564(0x6c)],null)||_0x103780[_0x5564(0x2fa)](_0x5c3f83,void 0x0)?void 0x0:_0x5c3f83[_0x5564(0x75)])||_0x5564(0xd4);}}catch(_0x23d344){if(_0x103780['peXGJ']('pMkZK',_0x103780['zPDhG']))_0x222814['log'](_0x103780[_0x5564(0x2fb)]);else{console[_0x5564(0x4f)](_0x103780[_0x5564(0x2fc)],_0x23d344);throw _0x23d344;}}},testYouTubeRefreshToken=async _0x519993=>{const _0x15b02f={'JbmdT':_0x5564(0x2fd),'wSFNo':_0x5564(0xbf),'PNDzn':function(_0x1aa0b8,_0x148ce8){return _0x1aa0b8===_0x148ce8;},'efFdp':_0x5564(0x2fe),'rJOUp':function(_0x2c9a31){return _0x2c9a31();},'dSNqy':'โš ๏ธ\x20No\x20refresh\x20token\x20found\x20-\x20attempting\x20to\x20fix...','gBLMH':function(_0x2da202,_0x5085fa){return _0x2da202(_0x5085fa);},'oldTN':_0x5564(0x2ff),'YnplC':_0x5564(0x300),'tfyqk':function(_0x6e2300){return _0x6e2300();},'CDxae':_0x5564(0x301),'UjZmz':_0x5564(0x302),'jYzFr':_0x5564(0x303)};console['log'](_0x15b02f['JbmdT']),console['log'](_0x15b02f[_0x5564(0x304)],_0x519993);try{if(_0x15b02f['PNDzn'](_0x15b02f[_0x5564(0x305)],'Hpylg'))return _0x46e927['log']('โœ…\x20'+_0xce74d6+_0x5564(0x1c6)),!![];else{const _0xa1117b=await _0x15b02f[_0x5564(0x306)](debugYouTubeTokens);console[_0x5564(0x19)](_0x5564(0x307),_0xa1117b);if(!_0xa1117b['hasRefreshToken']){console[_0x5564(0x19)](_0x15b02f[_0x5564(0x308)]);const _0x16a22d=await _0x15b02f[_0x5564(0x309)](fixUserYouTubeConnection,_0x519993);if(_0x16a22d){if(_0x15b02f[_0x5564(0x30a)](_0x15b02f['oldTN'],_0x15b02f[_0x5564(0x30b)])){console[_0x5564(0x19)](_0x15b02f['YnplC']);const _0x4bb615=await _0x15b02f[_0x5564(0x30c)](debugYouTubeTokens);console[_0x5564(0x19)](_0x15b02f['CDxae'],_0x4bb615);}else return _0x4ae8da&&_0x3005f3[_0x5564(0xf)]?_0x4e55fa:{'default':_0x5513f0};}else console[_0x5564(0x4f)](_0x15b02f['UjZmz']);}else console['log'](_0x15b02f[_0x5564(0x30d)]);}}catch(_0x1ae446){console[_0x5564(0x4f)]('โŒ\x20Error\x20testing\x20YouTube\x20refresh\x20token:',_0x1ae446);}};exports['testYouTubeRefreshToken']=testYouTubeRefreshToken;const requestEmailVerification=async(_0x3b9d0a,_0x2e1b95=![])=>{const _0x4da6b8={'caThI':'๐Ÿ“ง\x20[OAUTH]\x20Email\x20platform\x20selected,\x20returning\x20mock\x20auth\x20URL','gxvTC':'๐Ÿ“ง\x20Requesting\x20email\x20verification\x20for:','cGMhr':function(_0x1e1894,_0x4d0e0c,_0x4c2fa2){return _0x1e1894(_0x4d0e0c,_0x4c2fa2);},'HkmjJ':_0x5564(0x30e),'VJDRc':_0x5564(0x30f),'eYKMj':function(_0x24e6d4,_0x2cc25f){return _0x24e6d4!==_0x2cc25f;},'hNYMp':_0x5564(0x310),'VmnOJ':'rpMFX','auzLV':'Failed\x20to\x20send\x20verification\x20code','yLPSH':_0x5564(0x35)};try{console[_0x5564(0x19)](_0x4da6b8[_0x5564(0x311)],_0x3b9d0a);const _0x53e361=await _0x4da6b8[_0x5564(0x312)](fetch,_api[_0x5564(0x21)][_0x5564(0x22)]+_0x5564(0x313),{'method':'POST','headers':getDeveloperAuthHeaders(),'body':JSON[_0x5564(0x98)]({'email':_0x3b9d0a,'action':_0x4da6b8[_0x5564(0x314)],'testMode':_0x2e1b95})}),_0x1acd9d=await _0x53e361['json']();return _0x53e361['ok']?{'success':!![],'message':_0x1acd9d['message']||_0x4da6b8[_0x5564(0x315)]}:_0x4da6b8[_0x5564(0x316)](_0x4da6b8['hNYMp'],_0x4da6b8['VmnOJ'])?{'success':![],'error':_0x1acd9d[_0x5564(0x54)]||_0x4da6b8[_0x5564(0x317)]}:(_0x3bd7c0[_0x5564(0x19)](_0x4da6b8[_0x5564(0x318)]),_0x5d7b0b[_0x5564(0x21)]['BASE_URL']+_0x5564(0x319));}catch(_0x3a82d7){return console['error'](_0x5564(0x50),_0x3a82d7),{'success':![],'error':_0x4da6b8[_0x5564(0x31a)]};}};exports['requestEmailVerification']=requestEmailVerification;const verifyEmailCode=async(_0x3a2da7,_0x558b79,_0x70bdb0=![])=>{const _0x396aeb={'sjawZ':_0x5564(0x31b),'vOnwR':'Network\x20error','iKoEo':function(_0x2f90cc,_0x4797c3){return _0x2f90cc===_0x4797c3;},'BNWVk':function(_0x590183,_0x465777){return _0x590183===_0x465777;},'oxfvF':_0x5564(0xd4),'mrlrW':_0x5564(0x31c),'GGljK':_0x5564(0xe8),'MmVbO':'๐Ÿ”‘\x20[YOUTUBE\x20REAUTH]\x20REFRESH\x20TOKEN\x20SENT\x20TO\x20BACKEND:','DFtSy':_0x5564(0x31d),'cTIyQ':_0x5564(0xe9),'olioE':_0x5564(0xcf),'vxqpP':function(_0x30feb5,_0x34623b){return _0x30feb5===_0x34623b;},'KiJtU':_0x5564(0x31e),'UamVE':'๐Ÿ”\x20Verifying\x20email\x20code\x20for:','MPFmd':function(_0x291a3e,_0x54fcad,_0x5207fe){return _0x291a3e(_0x54fcad,_0x5207fe);},'dzRHy':function(_0x21333f){return _0x21333f();},'nEaLE':'verify','ZqiSd':_0x5564(0x31f),'hocwa':_0x5564(0x320),'jkrMw':function(_0x3fab61,_0x6bf43b){return _0x3fab61===_0x6bf43b;},'YHGhZ':_0x5564(0x321),'nmrip':'Invalid\x20verification\x20code','fPaGo':_0x5564(0x35)};try{if(_0x396aeb[_0x5564(0x322)](_0x5564(0x31e),_0x396aeb[_0x5564(0x323)])){console[_0x5564(0x19)](_0x396aeb[_0x5564(0x324)],_0x3a2da7);const _0x395bc8=await _0x396aeb[_0x5564(0x325)](fetch,_api['API_CONFIG'][_0x5564(0x22)]+'/email/verification',{'method':'POST','headers':_0x396aeb[_0x5564(0x326)](getDeveloperAuthHeaders),'body':JSON[_0x5564(0x98)]({'email':_0x3a2da7,'code':_0x558b79,'action':_0x396aeb[_0x5564(0x327)],'testMode':_0x70bdb0})}),_0x325831=await _0x395bc8[_0x5564(0x132)]();if(_0x395bc8['ok'])return _0x396aeb[_0x5564(0x328)](_0x396aeb[_0x5564(0x329)],_0x396aeb['ZqiSd'])?{'success':!![],'message':_0x325831['message']||_0x396aeb['hocwa'],'existingUser':_0x325831['existingUser']||![],'token':_0x325831[_0x5564(0x32a)]}:(_0x5d8102[_0x5564(0x4f)](_0x396aeb[_0x5564(0x32b)],_0x2faaf9),{'success':![],'isPending':![],'error':_0x396aeb['vOnwR']});else{if(_0x396aeb['jkrMw'](_0x5564(0x321),_0x396aeb[_0x5564(0x32c)]))return{'success':![],'error':_0x325831[_0x5564(0x54)]||_0x396aeb[_0x5564(0x32d)]};else{var _0xe1ad8,_0xbf49bb;_0x59604f[_0x5564(0x19)](_0x5564(0xd3)),_0x16b906=((_0xe1ad8=_0x219d07[_0x5564(0x6a)])===null||_0x396aeb[_0x5564(0x328)](_0xe1ad8,void 0x0)||(_0xe1ad8=_0xe1ad8[_0x5564(0x6c)])===null||_0xe1ad8===void 0x0?void 0x0:_0xe1ad8[_0x5564(0x61)])||(_0x396aeb[_0x5564(0x328)](_0xbf49bb=_0x2ac872[_0x5564(0x6a)],null)||_0x396aeb[_0x5564(0x32e)](_0xbf49bb,void 0x0)||(_0xbf49bb=_0xbf49bb[_0x5564(0x6c)])===null||_0xbf49bb===void 0x0?void 0x0:_0xbf49bb[_0x5564(0x75)])||_0x396aeb[_0x5564(0x32f)];}}}else _0x3485de[_0x5564(0x19)](_0x396aeb['mrlrW']),_0x9cd90b[_0x5564(0x19)](_0x396aeb[_0x5564(0x330)],_0x4ab57e[_0x5564(0x189)]),_0x4a0a46[_0x5564(0x19)](_0x5564(0xe7)),_0x598b52[_0x5564(0x19)](_0x396aeb[_0x5564(0x331)]),_0x1b457a['log'](_0x396aeb[_0x5564(0x332)],_0x371ee7),_0x5b2b56[_0x5564(0x19)](_0x396aeb[_0x5564(0x333)],_0xd3013a[_0x5564(0x12b)]('4/')?'serverAuthCode':_0x396aeb['olioE']),_0x129532[_0x5564(0x19)](_0x5564(0xe6),_0x9b2a93[_0x5564(0x135)]);}catch(_0x408e14){return console[_0x5564(0x4f)]('โŒ\x20Error\x20verifying\x20email\x20code:',_0x408e14),{'success':![],'error':_0x396aeb[_0x5564(0x334)]};}};exports['verifyEmailCode']=verifyEmailCode;const checkEmailVerificationStatus=async(_0x3465cb,_0x24b5cc=![])=>{const _0x4e4955={'ruAEF':_0x5564(0x2d9),'SsTxs':function(_0x2b4e8a,_0x3c8701){return _0x2b4e8a!==_0x3c8701;},'tPjtF':'GvDIu','LSTOH':'GFOgy','WmBBk':function(_0x47b871,_0xaf1ee6,_0x49fd48){return _0x47b871(_0xaf1ee6,_0x49fd48);},'zFowt':_0x5564(0x335),'ZRUbJ':_0x5564(0x31b),'LlTHW':_0x5564(0x336)};try{if(_0x4e4955['SsTxs'](_0x4e4955['tPjtF'],_0x4e4955[_0x5564(0x337)])){const _0x4ba78e=await _0x4e4955[_0x5564(0x338)](fetch,_api[_0x5564(0x21)]['BASE_URL']+'/email/verification/status',{'method':'POST','headers':getDeveloperAuthHeaders(),'body':JSON['stringify']({'email':_0x3465cb,'testMode':_0x24b5cc})}),_0x52c2d0=await _0x4ba78e[_0x5564(0x132)]();return{'success':_0x4ba78e['ok'],'isPending':_0x52c2d0[_0x5564(0x339)]||![],'message':_0x52c2d0[_0x5564(0x54)]};}else return _0x2841ba[_0x5564(0x4f)](_0x4e4955[_0x5564(0x33a)]),![];}catch(_0x58ee66){if(_0x4e4955['SsTxs'](_0x5564(0x335),_0x4e4955['zFowt']))_0x2c77da[_0x5564(0x4f)](_0x5564(0xfa));else return console[_0x5564(0x4f)](_0x4e4955[_0x5564(0x33b)],_0x58ee66),{'success':![],'isPending':![],'error':_0x4e4955['LlTHW']};}};exports[_0x5564(0xe)]=checkEmailVerificationStatus;const initializePlatformAuthService=()=>{const _0x33c486={'pGcRK':'๐Ÿ”ง\x20Platform\x20auth\x20service\x20initialized','RFusP':function(_0x54bc43){return _0x54bc43();}};console[_0x5564(0x19)](_0x33c486[_0x5564(0x33c)]),_0x33c486[_0x5564(0x33d)](initializeGoogleSignIn);};exports[_0x5564(0x8)]=initializePlatformAuthService;
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.verifyEmailCode = exports.testYouTubeRefreshToken = exports.testApiConnectivity = exports.requestEmailVerification = exports.refreshYouTubeTokens = exports.reconnectYouTube = exports.isOAuthCallback = exports.initiateOAuth = exports.initiateNativeAuth = exports.initializePlatformAuthService = exports.hasNativeSDK = exports.forceYouTubeReconnectionWithRevoke = exports.forceYouTubeReconnectionWithConsent = exports.fixUserYouTubeConnection = exports.exchangeCodeForToken = exports.checkEmailVerificationStatus = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _googleSignin = require("@react-native-google-signin/google-signin");
9
+ var _asyncStorage = _interopRequireDefault(require("@react-native-async-storage/async-storage"));
10
+ var _api = require("../config/api");
11
+ var _apiKeyService = require("./apiKeyService");
12
+ var _jwtStorageService = require("./jwtStorageService");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ /**
15
+ * Platform Authentication Service
16
+ * Handles OAuth flows for different platforms
17
+ */
18
+
19
+ // CRITICAL FIX: Use static imports to avoid Hermes transpilation issues
20
+
21
+ /**
22
+ * Get developer API key authorization headers
23
+ * This ensures all auth requests include the developer's API key for backend validation
24
+ * @throws Error if SDK is not initialized with a valid API key
25
+ */
26
+ const getDeveloperAuthHeaders = () => {
27
+ if (!(0, _apiKeyService.isApiKeyInitialized)()) {
28
+ throw new Error('SDK not initialized. Developers must call initializeApiKey() before using auth features.');
29
+ }
30
+ const config = (0, _apiKeyService.getApiConfig)();
31
+ if (!(config !== null && config !== void 0 && config.apiKey)) {
32
+ throw new Error('No API key configured. Please initialize the SDK with a valid developer API key.');
33
+ }
34
+ return {
35
+ ...(0, _api.getApiHeaders)(),
36
+ 'Authorization': `Bearer ${config.apiKey}`,
37
+ 'X-SDK-Version': '3.0.72',
38
+ 'X-SDK-Platform': 'react-native'
39
+ };
40
+ };
41
+
42
+ // ๐Ÿ”‘ CRITICAL: Using the same client ID for both web and iOS to avoid audience errors
43
+ const WEB_CLIENT_ID = '1030678346906-lovkuds2ouqmoc8eu5qpo98spa6edv4o.apps.googleusercontent.com';
44
+ const IOS_CLIENT_ID = '1030678346906-lovkuds2ouqmoc8eu5qpo98spa6edv4o.apps.googleusercontent.com';
45
+ // OAuth configuration for different platforms
46
+ const OAUTH_CONFIG = {
47
+ instagram: {
48
+ authUrl: 'https://api.instagram.com/oauth/authorize',
49
+ clientId: 'demo_instagram_client_id',
50
+ redirectUri: 'onairosevents://auth/callback',
51
+ scope: 'user_profile,user_media',
52
+ responseType: 'code',
53
+ hasNativeSDK: false
54
+ },
55
+ youtube: {
56
+ authUrl: `${_api.API_CONFIG.BASE_URL}/youtube/authorize`,
57
+ clientId: '1030678346906-lovkuds2ouqmoc8eu5qpo98spa6edv4o.apps.googleusercontent.com',
58
+ redirectUri: 'onairosevents://auth/callback',
59
+ scope: 'https://www.googleapis.com/auth/youtube.readonly',
60
+ responseType: 'code',
61
+ hasNativeSDK: true // Changed to true for native SDK
62
+ },
63
+ reddit: {
64
+ authUrl: `${_api.API_CONFIG.BASE_URL}/reddit/authorize`,
65
+ clientId: 'demo_reddit_client_id',
66
+ redirectUri: 'onairosevents://auth/callback',
67
+ scope: 'identity,read',
68
+ responseType: 'code',
69
+ hasNativeSDK: false
70
+ },
71
+ pinterest: {
72
+ authUrl: `${_api.API_CONFIG.BASE_URL}/pinterest/authorize`,
73
+ clientId: 'demo_pinterest_client_id',
74
+ redirectUri: 'onairosevents://auth/callback',
75
+ scope: 'boards:read,pins:read',
76
+ responseType: 'code',
77
+ hasNativeSDK: false
78
+ },
79
+ facebook: {
80
+ authUrl: 'https://www.facebook.com/v12.0/dialog/oauth',
81
+ clientId: 'demo_facebook_client_id',
82
+ redirectUri: 'onairosevents://auth/callback',
83
+ scope: 'public_profile,email',
84
+ responseType: 'code',
85
+ hasNativeSDK: false
86
+ },
87
+ // GitHub connector is temporarily commented out
88
+ // github: {
89
+ // authUrl: 'https://github.com/login/oauth/authorize',
90
+ // clientId: 'demo_github_client_id',
91
+ // redirectUri: 'onairosevents://auth/callback',
92
+ // scope: 'repo,user',
93
+ // responseType: 'code',
94
+ // hasNativeSDK: false
95
+ // },
96
+ linkedin: {
97
+ authUrl: `${_api.API_CONFIG.BASE_URL}/linkedin/authorize`,
98
+ clientId: '',
99
+ // No client ID needed - backend handles OAuth
100
+ redirectUri: 'onairosevents://auth/callback',
101
+ scope: 'openid profile email',
102
+ // Updated to OpenID Connect scopes as per your backend
103
+ responseType: 'code',
104
+ hasNativeSDK: false // LinkedIn has no modern native SDK
105
+ },
106
+ gmail: {
107
+ authUrl: `${_api.API_CONFIG.BASE_URL}/gmail/authorize`,
108
+ clientId: 'demo_gmail_client_id',
109
+ redirectUri: 'onairosevents://auth/callback',
110
+ scope: 'https://www.googleapis.com/auth/gmail.readonly',
111
+ responseType: 'code',
112
+ hasNativeSDK: false
113
+ },
114
+ email: {
115
+ // Email doesn't use OAuth but we still need to handle it in the flow
116
+ hasNativeSDK: false,
117
+ authUrl: `${_api.API_CONFIG.BASE_URL}/email/authorize` // Proxy endpoint for email verification
118
+ },
119
+ // LLM Platforms - use direct login URLs (WebView handles extraction)
120
+ // These platforms use WebView-based login + JavaScript injection for data export
121
+ chatgpt: {
122
+ authUrl: 'https://chat.openai.com',
123
+ // Direct login URL - WebView injects export scripts
124
+ clientId: '',
125
+ redirectUri: '',
126
+ scope: '',
127
+ responseType: '',
128
+ hasNativeSDK: false
129
+ },
130
+ claude: {
131
+ authUrl: 'https://claude.ai/login',
132
+ // Direct login URL - WebView injects export scripts
133
+ clientId: '',
134
+ redirectUri: '',
135
+ scope: '',
136
+ responseType: '',
137
+ hasNativeSDK: false
138
+ },
139
+ gemini: {
140
+ authUrl: 'https://gemini.google.com',
141
+ // Direct login URL - WebView injects export scripts
142
+ clientId: '',
143
+ redirectUri: '',
144
+ scope: '',
145
+ responseType: '',
146
+ hasNativeSDK: false
147
+ },
148
+ grok: {
149
+ authUrl: 'https://x.com/i/grok',
150
+ // Direct login URL (via X) - WebView injects export scripts
151
+ clientId: '',
152
+ redirectUri: '',
153
+ scope: '',
154
+ responseType: '',
155
+ hasNativeSDK: false
156
+ },
157
+ // ============================================================
158
+ // NEW PLATFORMS - WebView-based extraction
159
+ // API endpoints are PLACEHOLDERS - fill in once known
160
+ // ============================================================
161
+ hinge: {
162
+ authUrl: 'https://hinge.co',
163
+ // PLACEHOLDER - may need mobile web URL
164
+ clientId: '',
165
+ redirectUri: '',
166
+ scope: '',
167
+ responseType: '',
168
+ hasNativeSDK: false
169
+ },
170
+ // Instagram WebView extraction (different from OAuth Instagram)
171
+ instagram_webview: {
172
+ authUrl: 'https://www.instagram.com',
173
+ // Direct login - WebView injects export scripts
174
+ clientId: '',
175
+ redirectUri: '',
176
+ scope: '',
177
+ responseType: '',
178
+ hasNativeSDK: false
179
+ },
180
+ sephora: {
181
+ authUrl: 'https://www.sephora.com',
182
+ // Direct login - WebView injects export scripts
183
+ clientId: '',
184
+ redirectUri: '',
185
+ scope: '',
186
+ responseType: '',
187
+ hasNativeSDK: false
188
+ },
189
+ // ============================================================
190
+ // TELEGRAM - MTProto API WebView-based extraction
191
+ // Uses web.telegram.org/k/ for login, extracts via IndexedDB
192
+ //
193
+ // MTProto API methods used:
194
+ // - messages.getDialogs: Get user's chat list
195
+ // - messages.getHistory: Get messages from a chat
196
+ //
197
+ // Backend should use Telethon/Pyrogram/TDLib for full API access
198
+ // @see https://core.telegram.org/api
199
+ // ============================================================
200
+ telegram: {
201
+ authUrl: 'https://web.telegram.org/k/',
202
+ // Telegram Web K - WebView injects export scripts
203
+ clientId: '',
204
+ // Not used - MTProto uses api_id/api_hash
205
+ redirectUri: '',
206
+ scope: '',
207
+ responseType: '',
208
+ hasNativeSDK: false
209
+ }
210
+ };
211
+
212
+ /**
213
+ * Check if the platform has a native SDK
214
+ */
215
+ const hasNativeSDK = platform => {
216
+ var _OAUTH_CONFIG$platfor;
217
+ return ((_OAUTH_CONFIG$platfor = OAUTH_CONFIG[platform]) === null || _OAUTH_CONFIG$platfor === void 0 ? void 0 : _OAUTH_CONFIG$platfor.hasNativeSDK) || false;
218
+ };
219
+
220
+ /**
221
+ * Test API connectivity before making OAuth requests
222
+ */
223
+ exports.hasNativeSDK = hasNativeSDK;
224
+ const testApiConnectivity = async () => {
225
+ const results = {
226
+ googleTest: null,
227
+ api2Test: null
228
+ };
229
+ try {
230
+ var _results$api2Test, _results$googleTest;
231
+ console.log('๐Ÿ”Œ [CONNECTIVITY] Running comprehensive network diagnostics...');
232
+
233
+ // Test 1: Can we reach Google? (known good endpoint)
234
+ console.log('๐ŸŒ [CONNECTIVITY] Test 1: Checking general internet (google.com)...');
235
+ try {
236
+ const googleResponse = await fetch('https://www.google.com', {
237
+ method: 'HEAD',
238
+ // @ts-ignore - mode not always available in React Native
239
+ mode: 'no-cors'
240
+ });
241
+ results.googleTest = {
242
+ success: true,
243
+ status: 'reachable'
244
+ };
245
+ console.log('โœ… [CONNECTIVITY] Google is reachable - internet is working');
246
+ } catch (googleError) {
247
+ results.googleTest = {
248
+ success: false,
249
+ error: googleError.message
250
+ };
251
+ console.error('โŒ [CONNECTIVITY] Cannot reach Google - internet may be down:', googleError.message);
252
+ }
253
+
254
+ // Test 2: Can we reach API server?
255
+ console.log('๐ŸŒ [CONNECTIVITY] Test 2: Checking API server...');
256
+ try {
257
+ const controller = new AbortController();
258
+ const timeoutId = setTimeout(() => controller.abort(), 30000); // Increased to 30s for simulator
259
+
260
+ const response = await fetch(`${_api.API_CONFIG.BASE_URL}/health`, {
261
+ method: 'GET',
262
+ signal: controller.signal
263
+ });
264
+ clearTimeout(timeoutId);
265
+ const responseText = await response.text().catch(() => 'Unable to read response');
266
+ results.api2Test = {
267
+ success: response.ok,
268
+ status: response.status,
269
+ statusText: response.statusText,
270
+ response: responseText.substring(0, 200) // First 200 chars
271
+ };
272
+ if (response.ok) {
273
+ console.log('โœ… [CONNECTIVITY] API server is reachable');
274
+ } else {
275
+ console.log(`โš ๏ธ [CONNECTIVITY] API server responded with status: ${response.status}`);
276
+ }
277
+ } catch (apiError) {
278
+ results.api2Test = {
279
+ success: false,
280
+ error: apiError.message,
281
+ name: apiError.name
282
+ };
283
+ console.error('โŒ [CONNECTIVITY] Cannot reach API server:', apiError.message);
284
+ }
285
+
286
+ // Determine overall result
287
+ if ((_results$api2Test = results.api2Test) !== null && _results$api2Test !== void 0 && _results$api2Test.success) {
288
+ return {
289
+ success: true,
290
+ message: 'API is reachable',
291
+ details: results
292
+ };
293
+ } else if ((_results$googleTest = results.googleTest) !== null && _results$googleTest !== void 0 && _results$googleTest.success) {
294
+ return {
295
+ success: false,
296
+ message: 'Internet works but API server is unreachable. The server may be blocking requests from this device/simulator.',
297
+ details: results
298
+ };
299
+ } else {
300
+ return {
301
+ success: false,
302
+ message: 'No internet connectivity detected. Check your network connection.',
303
+ details: results
304
+ };
305
+ }
306
+ } catch (error) {
307
+ console.error('โŒ [CONNECTIVITY] Connectivity test failed:', error.message);
308
+ return {
309
+ success: false,
310
+ message: `Network error: ${error.message}`,
311
+ details: {
312
+ error: error.message,
313
+ results
314
+ }
315
+ };
316
+ }
317
+ };
318
+
319
+ /**
320
+ * Initiate OAuth flow for a platform
321
+ * Uses User JWT for authentication (TIER 2)
322
+ */
323
+ exports.testApiConnectivity = testApiConnectivity;
324
+ const initiateOAuth = async (platform, _username) => {
325
+ try {
326
+ console.log(`๐Ÿš€ [OAUTH] Starting OAuth for platform: ${platform}`);
327
+ console.log(`๐Ÿ“ฑ [OAUTH] Platform: ${_reactNative.Platform.OS}, Version: ${_reactNative.Platform.Version}`);
328
+
329
+ // For platforms that don't need OAuth (like email), handle differently
330
+ if (platform === 'email') {
331
+ console.log('๐Ÿ“ง [OAUTH] Email platform selected, returning mock auth URL');
332
+ return `${_api.API_CONFIG.BASE_URL}/email/authorize?action=verify`;
333
+ }
334
+
335
+ // Get user JWT headers - user must be authenticated
336
+ let authHeaders;
337
+ try {
338
+ authHeaders = await (0, _api.getUserAuthHeaders)();
339
+ console.log(`๐Ÿ”‘ [OAUTH] Using User JWT for authentication`);
340
+ } catch (authError) {
341
+ console.error(`โŒ [OAUTH] User not authenticated - cannot initiate ${platform} OAuth`);
342
+ console.error(`โŒ [OAUTH] Please log in first before connecting platforms`);
343
+ return null;
344
+ }
345
+
346
+ // Construct the proxy URL
347
+ const proxyUrl = `${_api.API_CONFIG.BASE_URL}/${platform}/authorize`;
348
+ console.log(`๐ŸŒ [OAUTH] Proxy URL: ${proxyUrl}`);
349
+ console.log(`๐Ÿ”— [OAUTH] About to make fetch request...`);
350
+
351
+ // Request body - no username needed, backend extracts from JWT
352
+ const requestBody = {
353
+ platform: platform,
354
+ timestamp: new Date().toISOString()
355
+ };
356
+ console.log(`๐Ÿ“ค [OAUTH] Request body:`, requestBody);
357
+
358
+ // Add timeout to prevent hanging requests
359
+ const controller = new AbortController();
360
+ const timeoutId = setTimeout(() => {
361
+ console.log(`โฐ [OAUTH] Request timeout for ${platform} - aborting`);
362
+ controller.abort();
363
+ }, 30000); // 30 second timeout for simulator compatibility
364
+
365
+ // Make a POST request to the proxy
366
+ // ๐Ÿ”’ SECURITY: Uses User JWT - backend extracts username from token
367
+ const response = await fetch(proxyUrl, {
368
+ method: 'POST',
369
+ headers: authHeaders,
370
+ body: JSON.stringify(requestBody),
371
+ signal: controller.signal
372
+ });
373
+ clearTimeout(timeoutId);
374
+ console.log(`๐Ÿ“ก [OAUTH] Response status: ${response.status} ${response.statusText}`);
375
+ if (!response.ok) {
376
+ const errorText = await response.text();
377
+ console.error(`โŒ [OAUTH] Error initiating OAuth for ${platform}: ${response.status} - ${errorText}`);
378
+ return null;
379
+ }
380
+ const data = await response.json();
381
+ console.log(`๐Ÿ“‹ [OAUTH] Response data for ${platform}:`, data);
382
+
383
+ // Get the authorization URL from the response
384
+ // Different platforms might use different keys (e.g., pinterestURL, youtubeURL)
385
+ const urlKey = `${platform}URL`;
386
+ const authUrl = data[urlKey] || data.url || null;
387
+ console.log(`๐Ÿ”— [OAUTH] Auth URL for ${platform} (key: ${urlKey}):`, authUrl);
388
+ return authUrl;
389
+ } catch (error) {
390
+ var _error$message;
391
+ // Enhanced error logging
392
+ if (error.name === 'AbortError') {
393
+ console.error(`โŒ [OAUTH] Request timeout for ${platform} - the server took too long to respond`);
394
+ } else if ((_error$message = error.message) !== null && _error$message !== void 0 && _error$message.includes('Network request failed')) {
395
+ console.error(`โŒ [OAUTH] Network request failed for ${platform}. Possible causes:`);
396
+ console.error(' 1. No internet connection on device/simulator');
397
+ console.error(' 2. API server (API server) is unreachable');
398
+ console.error(' 3. DNS resolution failed');
399
+ console.error(' 4. SSL/TLS certificate issue');
400
+ console.error(' 5. iOS simulator network sandbox issue - try on physical device');
401
+ } else {
402
+ console.error(`โŒ [OAUTH] Error initiating OAuth for ${platform}:`, error);
403
+ }
404
+ return null;
405
+ }
406
+ };
407
+
408
+ /**
409
+ * Initialize Google Sign-In configuration with enhanced refresh token support
410
+ * Updated with CRITICAL parameters for refresh token generation
411
+ */
412
+ exports.initiateOAuth = initiateOAuth;
413
+ const initializeGoogleSignIn = () => {
414
+ _googleSignin.GoogleSignin.configure({
415
+ webClientId: WEB_CLIENT_ID,
416
+ // โœ… CRITICAL: Web client ID for refresh tokens
417
+ iosClientId: IOS_CLIENT_ID,
418
+ // โœ… iOS client ID for native auth
419
+
420
+ // ๐Ÿ”‘ CRITICAL: These parameters are REQUIRED for refresh tokens
421
+ offlineAccess: true,
422
+ // โ† CRITICAL: Enables refresh tokens
423
+ forceCodeForRefreshToken: true,
424
+ // โ† CRITICAL: Forces refresh token generation
425
+
426
+ // โœ… Enhanced scopes for YouTube
427
+ scopes: ['https://www.googleapis.com/auth/youtube.readonly', 'openid', 'profile', 'email'],
428
+ // โœ… Clear settings to avoid conflicts
429
+ hostedDomain: '',
430
+ accountName: ''
431
+ });
432
+ };
433
+
434
+ /**
435
+ * Force YouTube reconnection with consent screen to get refresh tokens
436
+ * This is the key function to fix YouTube token expiry issues
437
+ */
438
+ const forceYouTubeReconnectionWithConsent = async username => {
439
+ try {
440
+ var _userInfo$data, _userInfo$data2, _userInfo$data3;
441
+ console.log('๐Ÿ”„ FORCING fresh YouTube consent for refresh token...');
442
+ console.log('๐Ÿ‘ค User:', username);
443
+
444
+ // Step 1: โœ… CRITICAL: Complete sign out (clears all cached consent)
445
+ try {
446
+ await _googleSignin.GoogleSignin.signOut();
447
+ console.log('โœ… Signed out - consent cache cleared');
448
+ } catch (signOutError) {
449
+ console.log('โ„น๏ธ Sign out not needed:', signOutError);
450
+ }
451
+
452
+ // Step 2: โœ… CRITICAL: Clear cached tokens if available
453
+ try {
454
+ const existingTokens = await _googleSignin.GoogleSignin.getTokens();
455
+ if (existingTokens.accessToken) {
456
+ await _googleSignin.GoogleSignin.clearCachedAccessToken(existingTokens.accessToken);
457
+ console.log('โœ… Token cache cleared');
458
+ }
459
+ } catch (clearError) {
460
+ console.log('โ„น๏ธ No token cache to clear');
461
+ }
462
+
463
+ // Step 3: โœ… CRITICAL: Configure Google Sign-In for FORCED consent
464
+ console.log('๐Ÿ”ง Configuring Google Sign-In for forced consent...');
465
+ _googleSignin.GoogleSignin.configure({
466
+ webClientId: WEB_CLIENT_ID,
467
+ // โœ… CRITICAL: Web client ID for refresh tokens
468
+ iosClientId: IOS_CLIENT_ID,
469
+ // โœ… iOS client ID for native auth
470
+
471
+ // ๐Ÿ”‘ FORCE REFRESH TOKEN SETTINGS:
472
+ offlineAccess: true,
473
+ // Request offline access
474
+ forceCodeForRefreshToken: true,
475
+ // Force refresh token generation
476
+
477
+ // ๐Ÿ”‘ FORCE CONSENT SCREEN:
478
+ scopes: ['https://www.googleapis.com/auth/youtube.readonly', 'openid', 'profile', 'email'],
479
+ // โœ… CRITICAL: Clear settings to force fresh consent
480
+ hostedDomain: '',
481
+ accountName: ''
482
+ });
483
+
484
+ // Step 4: โœ… Check Play Services
485
+ await _googleSignin.GoogleSignin.hasPlayServices();
486
+ console.log('โœ… Play Services available');
487
+
488
+ // Step 5: โœ… CRITICAL: Sign in (this SHOULD show consent screen)
489
+ console.log('๐Ÿ” Initiating sign-in - consent screen should appear...');
490
+ console.log('๐Ÿ“ฑ User should see: "Allow [App] to access your YouTube account when you\'re not using the app?"');
491
+ const userInfo = await _googleSignin.GoogleSignin.signIn();
492
+ console.log('โœ… Sign-in completed - checking for refresh token...');
493
+ console.log('๐Ÿ‘ค User email:', (_userInfo$data = userInfo.data) === null || _userInfo$data === void 0 || (_userInfo$data = _userInfo$data.user) === null || _userInfo$data === void 0 ? void 0 : _userInfo$data.email);
494
+
495
+ // Step 6: โœ… Get tokens after consent
496
+ const tokens = await _googleSignin.GoogleSignin.getTokens();
497
+ const currentUser = await _googleSignin.GoogleSignin.getCurrentUser();
498
+ console.log('๐Ÿ“‹ FULL userInfo object from forceYouTubeReconnectionWithConsent:');
499
+ console.log(JSON.stringify(userInfo, null, 2));
500
+ console.log('๐Ÿ“‹ FULL tokens object from forceYouTubeReconnectionWithConsent:');
501
+ console.log(JSON.stringify(tokens, null, 2));
502
+ console.log('๐Ÿ“‹ FULL currentUser object from forceYouTubeReconnectionWithConsent:');
503
+ console.log(JSON.stringify(currentUser, null, 2));
504
+ console.log('๐Ÿ” Token analysis:');
505
+ console.log('- Access token:', tokens.accessToken ? `${tokens.accessToken.substring(0, 20)}...` : 'Missing');
506
+ console.log('- ID token:', tokens.idToken ? 'Present' : 'Missing');
507
+ console.log('- ServerAuthCode (userInfo):', (_userInfo$data2 = userInfo.data) !== null && _userInfo$data2 !== void 0 && _userInfo$data2.serverAuthCode ? `${userInfo.data.serverAuthCode.substring(0, 20)}...` : 'Missing');
508
+ console.log('- ServerAuthCode (currentUser):', currentUser !== null && currentUser !== void 0 && currentUser.serverAuthCode ? `${currentUser.serverAuthCode.substring(0, 20)}...` : 'Missing');
509
+
510
+ // Step 7: โœ… Extract refresh capability
511
+ const refreshToken = ((_userInfo$data3 = userInfo.data) === null || _userInfo$data3 === void 0 ? void 0 : _userInfo$data3.serverAuthCode) || (currentUser === null || currentUser === void 0 ? void 0 : currentUser.serverAuthCode);
512
+ if (refreshToken) {
513
+ var _userInfo$data0, _userInfo$data1, _userInfo$data10, _userInfo$data11, _userInfo$data12, _userInfo$data13;
514
+ console.log('โœ… SUCCESS: Got refresh token after consent!');
515
+ console.log('๐Ÿ”‘ Refresh token type:', refreshToken.startsWith('4/') ? 'serverAuthCode' : 'refreshToken');
516
+ console.log('๐Ÿ”‘ Refresh token preview:', `${refreshToken.substring(0, 20)}...`);
517
+
518
+ // Step 8: โœ… Get YouTube channel info
519
+ let channelName = 'Unknown Channel';
520
+ let channelId = null;
521
+ try {
522
+ console.log('๐Ÿ“บ Fetching YouTube channel information...');
523
+ const channelResponse = await fetch('https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true', {
524
+ headers: {
525
+ 'Authorization': `Bearer ${tokens.accessToken}`,
526
+ 'Accept': 'application/json'
527
+ }
528
+ });
529
+ if (channelResponse.ok) {
530
+ const channelData = await channelResponse.json();
531
+ if (channelData.items && channelData.items.length > 0) {
532
+ channelName = channelData.items[0].snippet.title;
533
+ channelId = channelData.items[0].id;
534
+ console.log('โœ… YouTube channel found:', channelName, 'ID:', channelId);
535
+ } else {
536
+ var _userInfo$data4, _userInfo$data5;
537
+ console.log('โš ๏ธ No YouTube channel found for user');
538
+ channelName = ((_userInfo$data4 = userInfo.data) === null || _userInfo$data4 === void 0 || (_userInfo$data4 = _userInfo$data4.user) === null || _userInfo$data4 === void 0 ? void 0 : _userInfo$data4.name) || ((_userInfo$data5 = userInfo.data) === null || _userInfo$data5 === void 0 || (_userInfo$data5 = _userInfo$data5.user) === null || _userInfo$data5 === void 0 ? void 0 : _userInfo$data5.email) || 'No Channel';
539
+ }
540
+ } else {
541
+ var _userInfo$data6, _userInfo$data7;
542
+ console.log('โš ๏ธ Failed to fetch YouTube channel info:', channelResponse.status);
543
+ channelName = ((_userInfo$data6 = userInfo.data) === null || _userInfo$data6 === void 0 || (_userInfo$data6 = _userInfo$data6.user) === null || _userInfo$data6 === void 0 ? void 0 : _userInfo$data6.name) || ((_userInfo$data7 = userInfo.data) === null || _userInfo$data7 === void 0 || (_userInfo$data7 = _userInfo$data7.user) === null || _userInfo$data7 === void 0 ? void 0 : _userInfo$data7.email) || 'Unknown Channel';
544
+ }
545
+ } catch (channelError) {
546
+ var _userInfo$data8, _userInfo$data9;
547
+ console.log('โš ๏ธ Error fetching YouTube channel info:', channelError);
548
+ channelName = ((_userInfo$data8 = userInfo.data) === null || _userInfo$data8 === void 0 || (_userInfo$data8 = _userInfo$data8.user) === null || _userInfo$data8 === void 0 ? void 0 : _userInfo$data8.name) || ((_userInfo$data9 = userInfo.data) === null || _userInfo$data9 === void 0 || (_userInfo$data9 = _userInfo$data9.user) === null || _userInfo$data9 === void 0 ? void 0 : _userInfo$data9.email) || 'Unknown Channel';
549
+ }
550
+
551
+ // Step 9: โœ… Get authentication token using simplified JWT storage
552
+ let authToken = await (0, _jwtStorageService.getJWT)();
553
+ if (!authToken || authToken.trim().length < 20) {
554
+ console.log('๐Ÿ” Creating authentication token for YouTube connection...');
555
+ // Create token logic here if needed
556
+ authToken = 'temp_token_for_youtube_connection';
557
+ }
558
+
559
+ // Step 10: โœ… Send comprehensive data to backend
560
+ const backendPayload = {
561
+ session: {
562
+ username: username,
563
+ platform: 'youtube',
564
+ timestamp: new Date().toISOString(),
565
+ channelName: channelName,
566
+ channelId: channelId,
567
+ forceConsent: true // Flag to indicate this was forced consent
568
+ },
569
+ googleUser: (_userInfo$data0 = userInfo.data) === null || _userInfo$data0 === void 0 ? void 0 : _userInfo$data0.user,
570
+ accessToken: tokens.accessToken,
571
+ idToken: tokens.idToken,
572
+ refreshToken: refreshToken,
573
+ // โœ… CRITICAL: The refresh token!
574
+ serverAuthCode: refreshToken,
575
+ // โœ… Same as refresh token
576
+
577
+ // โœ… CRITICAL: Additional compatibility fields for backend
578
+ refresh_token: refreshToken,
579
+ // Snake case version
580
+ server_auth_code: refreshToken,
581
+ // Snake case version
582
+ authCode: refreshToken,
583
+ // Alternative naming
584
+
585
+ userAccountInfo: {
586
+ username: username,
587
+ email: (_userInfo$data1 = userInfo.data) === null || _userInfo$data1 === void 0 || (_userInfo$data1 = _userInfo$data1.user) === null || _userInfo$data1 === void 0 ? void 0 : _userInfo$data1.email,
588
+ authToken: authToken,
589
+ channelName: channelName,
590
+ channelId: channelId,
591
+ userIdentifier: authToken ? `user-${authToken.substring(0, 10)}` : `youtube-${(_userInfo$data10 = userInfo.data) === null || _userInfo$data10 === void 0 || (_userInfo$data10 = _userInfo$data10.user) === null || _userInfo$data10 === void 0 ? void 0 : _userInfo$data10.email}`,
592
+ googleId: (_userInfo$data11 = userInfo.data) === null || _userInfo$data11 === void 0 || (_userInfo$data11 = _userInfo$data11.user) === null || _userInfo$data11 === void 0 ? void 0 : _userInfo$data11.id,
593
+ // โœ… CRITICAL: Also include refresh token in userAccountInfo
594
+ refreshToken: refreshToken,
595
+ serverAuthCode: refreshToken
596
+ },
597
+ tokenExpiry: new Date(Date.now() + 3600 * 1000).toISOString(),
598
+ // 1 hour from now
599
+ requestRefreshToken: true,
600
+ debugInfo: {
601
+ hasRefreshToken: true,
602
+ refreshTokenType: refreshToken.startsWith('4/') ? 'serverAuthCode' : 'refreshToken',
603
+ configuredForRefresh: true,
604
+ forcedConsent: true,
605
+ consentMethod: 'signOut_and_configure',
606
+ refreshTokenValue: refreshToken // Include actual value for debugging
607
+ }
608
+ };
609
+ console.log('๐Ÿ“ค Sending comprehensive payload with REFRESH TOKEN to backend:', {
610
+ hasAccessToken: !!backendPayload.accessToken,
611
+ hasRefreshToken: !!backendPayload.refreshToken,
612
+ hasServerAuthCode: !!backendPayload.serverAuthCode,
613
+ refreshTokenType: backendPayload.debugInfo.refreshTokenType,
614
+ userEmail: (_userInfo$data12 = userInfo.data) === null || _userInfo$data12 === void 0 || (_userInfo$data12 = _userInfo$data12.user) === null || _userInfo$data12 === void 0 ? void 0 : _userInfo$data12.email,
615
+ forcedConsent: true
616
+ });
617
+
618
+ // Step 11: โœ… Send to backend with ENHANCED LOGGING
619
+ console.log('๐Ÿš€ [YOUTUBE REAUTH] ===== SENDING REAUTH SIGNAL TO BACKEND =====');
620
+ console.log('๐Ÿš€ [YOUTUBE REAUTH] Endpoint: https://API server/youtube/native-auth');
621
+ console.log('๐Ÿš€ [YOUTUBE REAUTH] Method: POST');
622
+ console.log('๐Ÿš€ [YOUTUBE REAUTH] Headers:', {
623
+ 'Content-Type': 'application/json',
624
+ 'Authorization': authToken ? `${authToken.substring(0, 20)}...` : 'NO AUTH TOKEN'
625
+ });
626
+ console.log('๐Ÿš€ [YOUTUBE REAUTH] Payload Summary:', {
627
+ hasAccessToken: !!backendPayload.accessToken,
628
+ hasRefreshToken: !!backendPayload.refreshToken,
629
+ hasServerAuthCode: !!backendPayload.serverAuthCode,
630
+ refreshTokenType: backendPayload.debugInfo.refreshTokenType,
631
+ userEmail: (_userInfo$data13 = userInfo.data) === null || _userInfo$data13 === void 0 || (_userInfo$data13 = _userInfo$data13.user) === null || _userInfo$data13 === void 0 ? void 0 : _userInfo$data13.email,
632
+ channelName: channelName,
633
+ forcedConsent: true,
634
+ requestRefreshToken: true
635
+ });
636
+ console.log('๐Ÿš€ [YOUTUBE REAUTH] FULL PAYLOAD:', JSON.stringify(backendPayload, null, 2));
637
+ const backendResponse = await fetch(`${_api.API_CONFIG.BASE_URL}/youtube/native-auth`, {
638
+ method: 'POST',
639
+ headers: {
640
+ 'Content-Type': 'application/json',
641
+ ...(authToken && {
642
+ 'Authorization': authToken
643
+ })
644
+ },
645
+ body: JSON.stringify(backendPayload)
646
+ });
647
+ console.log('๐Ÿ“ก [YOUTUBE REAUTH] Response Status:', backendResponse.status);
648
+ console.log('๐Ÿ“ก [YOUTUBE REAUTH] Response Status Text:', backendResponse.statusText);
649
+ console.log('๐Ÿ“ก [YOUTUBE REAUTH] Response Headers:', backendResponse.headers);
650
+ if (backendResponse.ok) {
651
+ var _responseData$validat, _responseData$tempora;
652
+ const responseData = await backendResponse.json();
653
+ console.log('โœ… [YOUTUBE REAUTH] Backend Response SUCCESS:', JSON.stringify(responseData, null, 2));
654
+
655
+ // Enhanced verification with detailed logging and temporary mode detection (exact backend fields)
656
+ const isTemporaryMode = ((_responseData$validat = responseData.validation) === null || _responseData$validat === void 0 ? void 0 : _responseData$validat.isTemporaryMode) === true || ((_responseData$tempora = responseData.temporaryMode) === null || _responseData$tempora === void 0 ? void 0 : _responseData$tempora.enabled) === true || responseData.isTemporaryMode === true || responseData.message && responseData.message.includes('temporary access token mode');
657
+ if (isTemporaryMode) {
658
+ console.log('๐Ÿ”„ [YOUTUBE REAUTH] YouTube connected in temporary mode');
659
+ console.log('โœ… [YOUTUBE REAUTH] Training will work, but connection expires in ~1 hour');
660
+ console.log('๐ŸŽ‰ [YOUTUBE REAUTH] SUCCESS: Temporary YouTube connection established!');
661
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Connection Details:');
662
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Mode: Temporary (expires ~1 hour)');
663
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Training Ready: Yes');
664
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Refresh token sent:', refreshToken ? 'Yes' : 'No');
665
+ } else if (responseData.hasRefreshToken || responseData.refreshTokenReceived) {
666
+ console.log('โœ… [YOUTUBE REAUTH] Backend CONFIRMED refresh token received');
667
+ console.log('โœ… [YOUTUBE REAUTH] Response hasRefreshToken:', responseData.hasRefreshToken);
668
+ console.log('๐ŸŽ‰ [YOUTUBE REAUTH] SUCCESS: Full YouTube connection with refresh tokens!');
669
+
670
+ // CRITICAL: Print the refresh token that was sent for debugging
671
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] REFRESH TOKEN SENT TO BACKEND:');
672
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Full refresh token:', refreshToken);
673
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Refresh token type:', refreshToken.startsWith('4/') ? 'serverAuthCode' : 'refreshToken');
674
+ console.log('๐Ÿ”‘ [YOUTUBE REAUTH] Refresh token length:', refreshToken.length);
675
+ } else {
676
+ console.warn('โš ๏ธ [YOUTUBE REAUTH] Backend did NOT confirm refresh token reception');
677
+ console.warn('โš ๏ธ [YOUTUBE REAUTH] Response data:', responseData);
678
+ console.warn('โš ๏ธ [YOUTUBE REAUTH] Expected hasRefreshToken or refreshTokenReceived in response');
679
+ return false;
680
+ }
681
+
682
+ // CRITICAL: Signal training system to restart with new connection
683
+ console.log('๐Ÿ”„ [YOUTUBE REAUTH] Signaling training system to restart...');
684
+ try {
685
+ await triggerTrainingRestart(username, authToken);
686
+ console.log('โœ… [YOUTUBE REAUTH] Training restart signal sent successfully');
687
+ } catch (restartError) {
688
+ console.warn('โš ๏ธ [YOUTUBE REAUTH] Training restart signal failed:', restartError);
689
+ console.warn('โš ๏ธ [YOUTUBE REAUTH] User may need to manually restart training');
690
+ }
691
+ return true;
692
+ } else {
693
+ const errorData = await backendResponse.text();
694
+ console.error('โŒ [YOUTUBE REAUTH] Backend processing FAILED:', backendResponse.status, errorData);
695
+ console.error('โŒ [YOUTUBE REAUTH] This means the reauth signal was not processed');
696
+ return false;
697
+ }
698
+ } else {
699
+ console.error('โŒ CRITICAL: No refresh token even after consent screen');
700
+ console.error('โŒ This means consent screen did not appear or user denied permissions');
701
+ console.error('๐Ÿ’ก Solutions:');
702
+ console.error(' 1. Try the revoke method: forceYouTubeReconnectionWithRevoke()');
703
+ console.error(' 2. Check Google Console OAuth configuration');
704
+ console.error(' 3. Ensure user clicks "Allow" on consent screen');
705
+ return false;
706
+ }
707
+ } catch (error) {
708
+ console.error('โŒ Error forcing YouTube consent:', error);
709
+ if (error.code === _googleSignin.statusCodes.SIGN_IN_CANCELLED) {
710
+ console.error('โŒ User cancelled sign-in - no refresh token obtained');
711
+ console.error('๐Ÿ’ก User must click "Allow" to get refresh token');
712
+ } else if (error.code === _googleSignin.statusCodes.IN_PROGRESS) {
713
+ console.error('โŒ Sign-in already in progress');
714
+ } else if (error.code === _googleSignin.statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
715
+ console.error('โŒ Google Play Services not available');
716
+ }
717
+ return false;
718
+ }
719
+ };
720
+
721
+ /**
722
+ * Alternative method: Force consent by revoking existing permissions
723
+ */
724
+ exports.forceYouTubeReconnectionWithConsent = forceYouTubeReconnectionWithConsent;
725
+ const forceYouTubeReconnectionWithRevoke = async username => {
726
+ try {
727
+ var _userInfo$data14;
728
+ console.log('๐Ÿ”„ FORCING YouTube consent via REVOKE method...');
729
+ console.log('๐Ÿ‘ค User:', username);
730
+
731
+ // Step 1: Initialize Google Sign-In
732
+ initializeGoogleSignIn();
733
+ await _googleSignin.GoogleSignin.hasPlayServices();
734
+
735
+ // Step 2: โœ… CRITICAL: Revoke existing permissions (forces fresh consent)
736
+ try {
737
+ await _googleSignin.GoogleSignin.revokeAccess();
738
+ console.log('โœ… Revoked existing permissions - fresh consent REQUIRED');
739
+ } catch (revokeError) {
740
+ console.log('โ„น๏ธ No existing permissions to revoke:', revokeError);
741
+ }
742
+
743
+ // Step 3: Sign out completely
744
+ await _googleSignin.GoogleSignin.signOut();
745
+ console.log('โœ… Signed out completely');
746
+
747
+ // Step 4: โœ… Now sign in again (will DEFINITELY show consent screen)
748
+ console.log('๐Ÿ” Signing in after revoke - consent screen MUST appear...');
749
+ const userInfo = await _googleSignin.GoogleSignin.signIn();
750
+
751
+ // Step 5: โœ… User will definitely see consent screen now
752
+ const tokens = await _googleSignin.GoogleSignin.getTokens();
753
+ const currentUser = await _googleSignin.GoogleSignin.getCurrentUser();
754
+ const refreshToken = ((_userInfo$data14 = userInfo.data) === null || _userInfo$data14 === void 0 ? void 0 : _userInfo$data14.serverAuthCode) || (currentUser === null || currentUser === void 0 ? void 0 : currentUser.serverAuthCode);
755
+ if (refreshToken) {
756
+ console.log('โœ… SUCCESS: Got refresh token after REVOKE + consent!');
757
+ console.log('๐Ÿ”‘ Refresh token preview:', `${refreshToken.substring(0, 20)}...`);
758
+
759
+ // Continue with the same backend submission logic as above
760
+ // (Similar to forceYouTubeReconnectionWithConsent)
761
+
762
+ return true;
763
+ } else {
764
+ console.error('โŒ Still no refresh token after revoke method');
765
+ return false;
766
+ }
767
+ } catch (error) {
768
+ console.error('โŒ Error with revoke method:', error);
769
+ return false;
770
+ }
771
+ };
772
+
773
+ /**
774
+ * Fix YouTube connection for a specific user (like nicholase50)
775
+ */
776
+ exports.forceYouTubeReconnectionWithRevoke = forceYouTubeReconnectionWithRevoke;
777
+ const fixUserYouTubeConnection = async username => {
778
+ console.log(`๐Ÿ”ง Fixing YouTube connection for user: ${username}`);
779
+
780
+ // Method 1: Try forced consent via configuration
781
+ console.log('๐Ÿ”„ Method 1: Trying forced consent via configuration...');
782
+ let success = await forceYouTubeReconnectionWithConsent(username);
783
+ if (success) {
784
+ console.log(`โœ… ${username} YouTube connection fixed via Method 1!`);
785
+ return true;
786
+ }
787
+
788
+ // Method 2: Try forced consent via revoke
789
+ console.log('๐Ÿ”„ Method 2: Trying forced consent via revoke...');
790
+ success = await forceYouTubeReconnectionWithRevoke(username);
791
+ if (success) {
792
+ console.log(`โœ… ${username} YouTube connection fixed via Method 2!`);
793
+ return true;
794
+ }
795
+ console.error(`โŒ Failed to fix ${username} YouTube connection with both methods`);
796
+ return false;
797
+ };
798
+
799
+ /**
800
+ * Get fresh tokens using refresh token
801
+ */
802
+ exports.fixUserYouTubeConnection = fixUserYouTubeConnection;
803
+ const refreshGoogleTokens = async () => {
804
+ try {
805
+ console.log('๐Ÿ”„ Attempting to refresh Google tokens...');
806
+
807
+ // Check if user is signed in
808
+ const currentUser = await _googleSignin.GoogleSignin.getCurrentUser();
809
+ if (!currentUser) {
810
+ console.log('โŒ User not signed in to Google, cannot refresh tokens');
811
+ return null;
812
+ }
813
+
814
+ // Get fresh tokens
815
+ const tokens = await _googleSignin.GoogleSignin.getTokens();
816
+ console.log('โœ… Successfully refreshed Google tokens');
817
+ return {
818
+ accessToken: tokens.accessToken,
819
+ idToken: tokens.idToken
820
+ };
821
+ } catch (error) {
822
+ console.error('โŒ Failed to refresh Google tokens:', error);
823
+
824
+ // If refresh fails, try to sign in again
825
+ try {
826
+ console.log('๐Ÿ”„ Refresh failed, attempting re-authentication...');
827
+ const userInfo = await _googleSignin.GoogleSignin.signIn();
828
+ const tokens = await _googleSignin.GoogleSignin.getTokens();
829
+ console.log('โœ… Re-authentication successful');
830
+ return {
831
+ accessToken: tokens.accessToken,
832
+ idToken: tokens.idToken
833
+ };
834
+ } catch (signInError) {
835
+ console.error('โŒ Re-authentication also failed:', signInError);
836
+ return null;
837
+ }
838
+ }
839
+ };
840
+
841
+ /**
842
+ * Debug YouTube tokens to verify refresh token availability
843
+ */
844
+ const debugYouTubeTokens = async () => {
845
+ try {
846
+ var _currentUser$user;
847
+ const tokens = await _googleSignin.GoogleSignin.getTokens();
848
+ const currentUser = await _googleSignin.GoogleSignin.getCurrentUser();
849
+ console.log('๐Ÿ” YouTube Token Debug:', {
850
+ accessToken: tokens.accessToken ? `${tokens.accessToken.substring(0, 20)}...` : 'Missing',
851
+ idToken: tokens.idToken ? 'Present' : 'Missing',
852
+ serverAuthCode: currentUser !== null && currentUser !== void 0 && currentUser.serverAuthCode ? `${currentUser.serverAuthCode.substring(0, 20)}...` : 'Missing',
853
+ userEmail: (currentUser === null || currentUser === void 0 || (_currentUser$user = currentUser.user) === null || _currentUser$user === void 0 ? void 0 : _currentUser$user.email) || 'Missing'
854
+ });
855
+ return {
856
+ hasRefreshToken: !!(currentUser !== null && currentUser !== void 0 && currentUser.serverAuthCode),
857
+ refreshTokenType: currentUser !== null && currentUser !== void 0 && currentUser.serverAuthCode ? 'serverAuthCode' : 'none'
858
+ };
859
+ } catch (error) {
860
+ console.error('โŒ Debug tokens failed:', error);
861
+ return {
862
+ hasRefreshToken: false,
863
+ refreshTokenType: 'error'
864
+ };
865
+ }
866
+ };
867
+
868
+ /**
869
+ * Force fresh YouTube reconnection with proper refresh token
870
+ */
871
+ const reconnectYouTube = async username => {
872
+ try {
873
+ console.log('๐Ÿ”„ Forcing fresh YouTube reconnection for refresh token...');
874
+
875
+ // 1. Sign out completely to force fresh consent
876
+ try {
877
+ await _googleSignin.GoogleSignin.signOut();
878
+ console.log('โœ… Signed out from Google');
879
+ } catch (signOutError) {
880
+ console.log('โ„น๏ธ Already signed out or sign out failed:', signOutError);
881
+ }
882
+
883
+ // 2. Clear any cached tokens
884
+ try {
885
+ const currentTokens = await _googleSignin.GoogleSignin.getTokens();
886
+ if (currentTokens.accessToken) {
887
+ await _googleSignin.GoogleSignin.clearCachedAccessToken(currentTokens.accessToken);
888
+ console.log('โœ… Cleared cached access token');
889
+ }
890
+ } catch (clearError) {
891
+ console.log('โ„น๏ธ Token clearing failed or not needed:', clearError);
892
+ }
893
+
894
+ // 3. Re-authenticate with fresh consent
895
+ const result = await initiateNativeAuth('youtube', username);
896
+ if (result) {
897
+ console.log('โœ… YouTube reconnected successfully with refresh token');
898
+
899
+ // 4. Verify we now have a refresh token
900
+ const debugInfo = await debugYouTubeTokens();
901
+ if (debugInfo.hasRefreshToken) {
902
+ console.log('โœ… Refresh token confirmed:', debugInfo.refreshTokenType);
903
+ } else {
904
+ console.warn('โš ๏ธ Still no refresh token after reconnection');
905
+ }
906
+ return true;
907
+ } else {
908
+ console.error('โŒ YouTube reconnection failed');
909
+ return false;
910
+ }
911
+ } catch (error) {
912
+ console.error('โŒ YouTube reconnection error:', error);
913
+ return false;
914
+ }
915
+ };
916
+
917
+ /**
918
+ * Initiate native authentication for platforms with SDKs
919
+ */
920
+ exports.reconnectYouTube = reconnectYouTube;
921
+ const initiateNativeAuth = async (platform, username) => {
922
+ if (platform === 'youtube') {
923
+ console.log('๐Ÿ”— Initiating native Google Sign-In for YouTube');
924
+
925
+ // Validate username for YouTube
926
+ if (!username || username.trim() === '') {
927
+ console.error('โŒ [YOUTUBE AUTH] Username is required for YouTube authentication');
928
+ return false;
929
+ }
930
+ try {
931
+ var _userInfo$data15, _currentUser$user2, _userInfo$data16, _userInfo$data17, _userInfo$data24, _userInfo$data25, _userInfo$data26, _userInfo$data27, _userInfo$data28, _userInfo$data29;
932
+ // Initialize Google Sign-In if not already done
933
+ // โœ… CRITICAL: Initialize with CORRECT iOS Client ID
934
+ initializeGoogleSignIn();
935
+
936
+ // Check if Google Play Services are available
937
+ await _googleSignin.GoogleSignin.hasPlayServices();
938
+
939
+ // โœ… CRITICAL: Force sign out first to ensure fresh consent
940
+ try {
941
+ await _googleSignin.GoogleSignin.signOut();
942
+ console.log('๐Ÿ”„ Signed out to force fresh consent');
943
+ } catch (signOutError) {
944
+ console.log('โ„น๏ธ Sign out not needed or failed:', signOutError);
945
+ }
946
+
947
+ // Sign in with Google (this will show consent screen due to our config)
948
+ const userInfo = await _googleSignin.GoogleSignin.signIn();
949
+ console.log('โœ… Google Sign-In successful:', (_userInfo$data15 = userInfo.data) === null || _userInfo$data15 === void 0 || (_userInfo$data15 = _userInfo$data15.user) === null || _userInfo$data15 === void 0 ? void 0 : _userInfo$data15.email);
950
+ console.log('๐Ÿ“‹ FULL userInfo object:');
951
+ console.log(JSON.stringify(userInfo, null, 2));
952
+
953
+ // Get access token for API calls
954
+ const tokens = await _googleSignin.GoogleSignin.getTokens();
955
+ console.log('๐Ÿ”‘ Got Google tokens');
956
+ console.log('๐Ÿ“‹ FULL tokens object:');
957
+ console.log(JSON.stringify(tokens, null, 2));
958
+
959
+ // CRITICAL: Get the current user info which contains the refresh token
960
+ const currentUser = await _googleSignin.GoogleSignin.getCurrentUser();
961
+ console.log('๐Ÿ‘ค Current user info:', currentUser === null || currentUser === void 0 || (_currentUser$user2 = currentUser.user) === null || _currentUser$user2 === void 0 ? void 0 : _currentUser$user2.email);
962
+ console.log('๐Ÿ“‹ FULL currentUser object:');
963
+ console.log(JSON.stringify(currentUser, null, 2));
964
+
965
+ // โœ… CRITICAL: Extract refresh token properly using serverAuthCode
966
+ let refreshToken = null;
967
+ console.log('๐Ÿ” REFRESH TOKEN EXTRACTION:');
968
+ console.log('- userInfo.data?.serverAuthCode:', (_userInfo$data16 = userInfo.data) !== null && _userInfo$data16 !== void 0 && _userInfo$data16.serverAuthCode ? `Present: ${userInfo.data.serverAuthCode.substring(0, 20)}...` : 'Missing');
969
+ console.log('- currentUser?.serverAuthCode:', currentUser !== null && currentUser !== void 0 && currentUser.serverAuthCode ? `Present: ${currentUser.serverAuthCode.substring(0, 20)}...` : 'Missing');
970
+ console.log('- tokens.idToken:', tokens.idToken ? `Present: ${tokens.idToken.substring(0, 20)}...` : 'Missing');
971
+ console.log('- tokens.accessToken:', tokens.accessToken ? `Present: ${tokens.accessToken.substring(0, 20)}...` : 'Missing');
972
+
973
+ // The serverAuthCode is the refresh token mechanism for React Native Google Sign-In
974
+ if (currentUser !== null && currentUser !== void 0 && currentUser.serverAuthCode) {
975
+ refreshToken = currentUser.serverAuthCode;
976
+ console.log('โœ… Got serverAuthCode (refresh token mechanism)');
977
+ console.log('๐Ÿ”‘ Refresh token preview:', `${refreshToken.substring(0, 20)}...`);
978
+ } else if ((_userInfo$data17 = userInfo.data) !== null && _userInfo$data17 !== void 0 && _userInfo$data17.serverAuthCode) {
979
+ refreshToken = userInfo.data.serverAuthCode;
980
+ console.log('โœ… Got serverAuthCode from sign-in response');
981
+ console.log('๐Ÿ”‘ Refresh token preview:', `${refreshToken.substring(0, 20)}...`);
982
+ }
983
+
984
+ // โœ… CRITICAL: Verify refresh token availability
985
+ if (!refreshToken) {
986
+ console.error('โŒ CRITICAL: No refresh token available - YouTube connection will fail when token expires');
987
+ console.error('๐Ÿ’ก User needs to reconnect with proper consent screen');
988
+ console.error('๐Ÿ’ก Check Google Sign-In configuration: offlineAccess, forceCodeForRefreshToken');
989
+
990
+ // Still continue but warn about the issue
991
+ console.warn('โš ๏ธ Continuing without refresh token - connection may fail later');
992
+ } else {
993
+ console.log('โœ… Refresh token available for YouTube connection');
994
+ console.log('๐Ÿ”‘ Refresh token type:', refreshToken.startsWith('4/') ? 'serverAuthCode' : 'refreshToken');
995
+ }
996
+
997
+ // Fetch YouTube channel information using the access token
998
+ let channelName = 'Unknown Channel';
999
+ let channelId = null;
1000
+ try {
1001
+ console.log('๐Ÿ“บ Fetching YouTube channel information...');
1002
+ const channelResponse = await fetch('https://www.googleapis.com/youtube/v3/channels?part=snippet&mine=true', {
1003
+ headers: {
1004
+ 'Authorization': `Bearer ${tokens.accessToken}`,
1005
+ 'Accept': 'application/json'
1006
+ }
1007
+ });
1008
+ if (channelResponse.ok) {
1009
+ const channelData = await channelResponse.json();
1010
+ if (channelData.items && channelData.items.length > 0) {
1011
+ channelName = channelData.items[0].snippet.title;
1012
+ channelId = channelData.items[0].id;
1013
+ console.log('โœ… YouTube channel found:', channelName, 'ID:', channelId);
1014
+ } else {
1015
+ var _userInfo$data18, _userInfo$data19;
1016
+ console.log('โš ๏ธ No YouTube channel found for user');
1017
+ channelName = ((_userInfo$data18 = userInfo.data) === null || _userInfo$data18 === void 0 || (_userInfo$data18 = _userInfo$data18.user) === null || _userInfo$data18 === void 0 ? void 0 : _userInfo$data18.name) || ((_userInfo$data19 = userInfo.data) === null || _userInfo$data19 === void 0 || (_userInfo$data19 = _userInfo$data19.user) === null || _userInfo$data19 === void 0 ? void 0 : _userInfo$data19.email) || 'No Channel';
1018
+ }
1019
+ } else {
1020
+ var _userInfo$data20, _userInfo$data21;
1021
+ console.log('โš ๏ธ Failed to fetch YouTube channel info:', channelResponse.status);
1022
+ channelName = ((_userInfo$data20 = userInfo.data) === null || _userInfo$data20 === void 0 || (_userInfo$data20 = _userInfo$data20.user) === null || _userInfo$data20 === void 0 ? void 0 : _userInfo$data20.name) || ((_userInfo$data21 = userInfo.data) === null || _userInfo$data21 === void 0 || (_userInfo$data21 = _userInfo$data21.user) === null || _userInfo$data21 === void 0 ? void 0 : _userInfo$data21.email) || 'Unknown Channel';
1023
+ }
1024
+ } catch (channelError) {
1025
+ var _userInfo$data22, _userInfo$data23;
1026
+ console.log('โš ๏ธ Error fetching YouTube channel info:', channelError);
1027
+ channelName = ((_userInfo$data22 = userInfo.data) === null || _userInfo$data22 === void 0 || (_userInfo$data22 = _userInfo$data22.user) === null || _userInfo$data22 === void 0 ? void 0 : _userInfo$data22.name) || ((_userInfo$data23 = userInfo.data) === null || _userInfo$data23 === void 0 || (_userInfo$data23 = _userInfo$data23.user) === null || _userInfo$data23 === void 0 ? void 0 : _userInfo$data23.email) || 'Unknown Channel';
1028
+ }
1029
+
1030
+ // Get stored authentication info to link YouTube data to user account
1031
+ // NOTE: SDK no longer creates EnochUser - consuming app should handle this
1032
+ let authToken = await (0, _jwtStorageService.getJWT)();
1033
+ const storedUsername = await _asyncStorage.default.getItem('onairos_username');
1034
+ const finalUsername = storedUsername || username || ((_userInfo$data24 = userInfo.data) === null || _userInfo$data24 === void 0 || (_userInfo$data24 = _userInfo$data24.user) === null || _userInfo$data24 === void 0 ? void 0 : _userInfo$data24.email) || 'youtube_user';
1035
+
1036
+ // Log authentication status - SDK does NOT create users during YouTube connection
1037
+ if (!authToken || authToken.trim().length < 20) {
1038
+ console.log('โ„น๏ธ No valid authentication token found for YouTube connection');
1039
+ console.log('โ„น๏ธ NOTE: SDK does not create users during YouTube connection');
1040
+ console.log('โ„น๏ธ User should authenticate first via Google/Apple/Email before connecting YouTube');
1041
+ // Continue without token - YouTube connection will work but may not be linked to user
1042
+ } else {
1043
+ console.log('โœ… Found existing authentication token for YouTube auth');
1044
+ console.log('๐Ÿ”‘ Token preview:', `${authToken.substring(0, 20)}...`);
1045
+ }
1046
+ console.log('๐Ÿ”— Linking YouTube data to user:', finalUsername);
1047
+ console.log('๐Ÿ”‘ Using auth token for linking:', authToken ? `${authToken.substring(0, 20)}...` : 'No token');
1048
+ console.log('๐Ÿ“บ YouTube channel name:', channelName);
1049
+
1050
+ // โœ… CRITICAL: Enhanced payload with comprehensive refresh token data
1051
+ const backendPayload = {
1052
+ session: {
1053
+ username: finalUsername,
1054
+ platform: 'youtube',
1055
+ timestamp: new Date().toISOString(),
1056
+ channelName: channelName,
1057
+ channelId: channelId
1058
+ },
1059
+ googleUser: (_userInfo$data25 = userInfo.data) === null || _userInfo$data25 === void 0 ? void 0 : _userInfo$data25.user,
1060
+ accessToken: tokens.accessToken,
1061
+ idToken: tokens.idToken,
1062
+ refreshToken: refreshToken,
1063
+ // โœ… CRITICAL: Include refresh token
1064
+ serverAuthCode: refreshToken,
1065
+ // โœ… Alternative refresh mechanism (same as refreshToken)
1066
+
1067
+ // โœ… CRITICAL: Additional compatibility fields for backend
1068
+ refresh_token: refreshToken,
1069
+ // Snake case version
1070
+ server_auth_code: refreshToken,
1071
+ // Snake case version
1072
+ authCode: refreshToken,
1073
+ // Alternative naming
1074
+
1075
+ // Include user account linking information
1076
+ userAccountInfo: {
1077
+ username: finalUsername,
1078
+ email: (_userInfo$data26 = userInfo.data) === null || _userInfo$data26 === void 0 || (_userInfo$data26 = _userInfo$data26.user) === null || _userInfo$data26 === void 0 ? void 0 : _userInfo$data26.email,
1079
+ authToken: authToken,
1080
+ channelName: channelName,
1081
+ channelId: channelId,
1082
+ // CRITICAL: Include user identifier that matches your database
1083
+ userIdentifier: authToken ? `user-${authToken.substring(0, 10)}` : `youtube-${(_userInfo$data27 = userInfo.data) === null || _userInfo$data27 === void 0 || (_userInfo$data27 = _userInfo$data27.user) === null || _userInfo$data27 === void 0 ? void 0 : _userInfo$data27.email}`,
1084
+ googleId: (_userInfo$data28 = userInfo.data) === null || _userInfo$data28 === void 0 || (_userInfo$data28 = _userInfo$data28.user) === null || _userInfo$data28 === void 0 ? void 0 : _userInfo$data28.id,
1085
+ appleUserId: authToken !== null && authToken !== void 0 && authToken.includes('apple') ? authToken.split('.')[1] : null,
1086
+ // โœ… CRITICAL: Also include refresh token in userAccountInfo
1087
+ refreshToken: refreshToken,
1088
+ serverAuthCode: refreshToken
1089
+ },
1090
+ // Token expiry information
1091
+ tokenExpiry: new Date(Date.now() + 3600 * 1000).toISOString(),
1092
+ // 1 hour from now
1093
+ // Force refresh token request
1094
+ requestRefreshToken: true,
1095
+ // โœ… CRITICAL: Debug information for backend
1096
+ debugInfo: {
1097
+ hasRefreshToken: !!refreshToken,
1098
+ refreshTokenType: refreshToken ? refreshToken.startsWith('4/') ? 'serverAuthCode' : 'refreshToken' : 'none',
1099
+ configuredForRefresh: true,
1100
+ forcedConsent: true,
1101
+ refreshTokenValue: refreshToken // Include actual value for debugging
1102
+ }
1103
+ };
1104
+ console.log('๐Ÿ“ค BACKEND PAYLOAD SUMMARY:');
1105
+ console.log('- hasAccessToken:', !!backendPayload.accessToken);
1106
+ console.log('- hasRefreshToken:', !!backendPayload.refreshToken);
1107
+ console.log('- hasServerAuthCode:', !!backendPayload.serverAuthCode);
1108
+ console.log('- refreshTokenType:', backendPayload.debugInfo.refreshTokenType);
1109
+ console.log('- userEmail:', (_userInfo$data29 = userInfo.data) === null || _userInfo$data29 === void 0 || (_userInfo$data29 = _userInfo$data29.user) === null || _userInfo$data29 === void 0 ? void 0 : _userInfo$data29.email);
1110
+ console.log('- channelName:', channelName);
1111
+ console.log('๐Ÿ“‹ COMPLETE BACKEND PAYLOAD:');
1112
+ console.log(JSON.stringify(backendPayload, null, 2));
1113
+
1114
+ // Send the tokens to your backend for YouTube data processing with ENHANCED LOGGING
1115
+ console.log('๐Ÿ“ค Sending YouTube auth to backend with refresh token:', !!refreshToken);
1116
+ const backendResponse = await fetch(`${_api.API_CONFIG.BASE_URL}/youtube/native-auth`, {
1117
+ method: 'POST',
1118
+ headers: {
1119
+ 'Content-Type': 'application/json',
1120
+ ...(authToken && {
1121
+ 'Authorization': authToken
1122
+ }) // Include auth token if available
1123
+ },
1124
+ body: JSON.stringify(backendPayload)
1125
+ });
1126
+ console.log('๐Ÿ“ก Backend response status:', backendResponse.status);
1127
+ console.log('๐Ÿ“ก Backend response headers:', backendResponse.headers);
1128
+ if (backendResponse.ok) {
1129
+ var _responseData$validat2, _responseData$tempora2;
1130
+ const responseData = await backendResponse.json();
1131
+ console.log('โœ… YouTube connection successful');
1132
+ console.log('๐Ÿ“‹ COMPLETE BACKEND RESPONSE:');
1133
+ console.log(JSON.stringify(responseData, null, 2));
1134
+
1135
+ // โœ… Enhanced verification with temporary mode detection (exact backend fields)
1136
+ const isTemporaryMode = ((_responseData$validat2 = responseData.validation) === null || _responseData$validat2 === void 0 ? void 0 : _responseData$validat2.isTemporaryMode) === true || ((_responseData$tempora2 = responseData.temporaryMode) === null || _responseData$tempora2 === void 0 ? void 0 : _responseData$tempora2.enabled) === true || responseData.isTemporaryMode === true || responseData.message && responseData.message.includes('temporary access token mode');
1137
+ if (isTemporaryMode) {
1138
+ console.log('๐Ÿ”„ [YOUTUBE AUTH] YouTube connected in temporary mode');
1139
+ console.log('โœ… [YOUTUBE AUTH] Training will work, but connection expires in ~1 hour');
1140
+ console.log('โ„น๏ธ [YOUTUBE AUTH] User can reconnect later for refresh tokens if needed');
1141
+ } else if (responseData.hasRefreshToken || responseData.refreshTokenReceived) {
1142
+ console.log('โœ… [YOUTUBE AUTH] Backend confirmed refresh token received');
1143
+ console.log('โœ… [YOUTUBE AUTH] Full YouTube connection with persistent access');
1144
+ } else {
1145
+ console.warn('โš ๏ธ [YOUTUBE AUTH] Backend did not confirm refresh token');
1146
+ console.warn('๐Ÿ” [YOUTUBE AUTH] Response data keys:', Object.keys(responseData));
1147
+ console.warn('โš ๏ธ [YOUTUBE AUTH] Connection may fail when tokens expire');
1148
+ }
1149
+ return true;
1150
+ } else {
1151
+ const errorData = await backendResponse.text();
1152
+ console.error('โŒ YouTube auth failed:', backendResponse.status);
1153
+ console.error('๐Ÿ“‹ BACKEND ERROR RESPONSE:');
1154
+ console.error(errorData);
1155
+ return false;
1156
+ }
1157
+ } catch (error) {
1158
+ console.error('โŒ Google Sign-In error:', error);
1159
+ if (error.code === _googleSignin.statusCodes.SIGN_IN_CANCELLED) {
1160
+ console.log('User cancelled Google Sign-In');
1161
+ } else if (error.code === _googleSignin.statusCodes.IN_PROGRESS) {
1162
+ console.log('Google Sign-In already in progress');
1163
+ } else if (error.code === _googleSignin.statusCodes.PLAY_SERVICES_NOT_AVAILABLE) {
1164
+ console.log('Google Play Services not available');
1165
+ }
1166
+ return false;
1167
+ }
1168
+ }
1169
+
1170
+ // Instagram is commented out in the UI, but keeping the code for future use
1171
+ if (platform === 'instagram') {
1172
+ // Simulate Facebook Login SDK for Instagram
1173
+ console.log('Initiating Facebook Login for Instagram');
1174
+ return new Promise(resolve => {
1175
+ setTimeout(() => {
1176
+ console.log('Facebook Login completed successfully');
1177
+ resolve(true);
1178
+ }, 1000);
1179
+ });
1180
+ }
1181
+ return false;
1182
+ };
1183
+
1184
+ /**
1185
+ * Check if a URL is an OAuth callback
1186
+ */
1187
+ exports.initiateNativeAuth = initiateNativeAuth;
1188
+ const isOAuthCallback = url => {
1189
+ return url.includes('auth/callback') || url.includes('code=');
1190
+ };
1191
+
1192
+ /**
1193
+ * Exchange authorization code for access token
1194
+ * This would typically be done on a server, but we're simulating it here
1195
+ */
1196
+ exports.isOAuthCallback = isOAuthCallback;
1197
+ const exchangeCodeForToken = async (code, platform) => {
1198
+ console.log(`Exchanging code for token for platform: ${platform}`);
1199
+ try {
1200
+ // Use the proxy server to exchange the code for a token
1201
+ const tokenUrl = `${_api.API_CONFIG.BASE_URL}/${platform}/token`;
1202
+
1203
+ // Make a POST request to the proxy
1204
+ const response = await fetch(tokenUrl, {
1205
+ method: 'POST',
1206
+ headers: {
1207
+ 'Content-Type': 'application/json'
1208
+ },
1209
+ body: JSON.stringify({
1210
+ code: code,
1211
+ platform: platform
1212
+ })
1213
+ });
1214
+ if (!response.ok) {
1215
+ console.error(`Error exchanging code for token: ${response.status}`);
1216
+ throw new Error(`Token exchange failed with status ${response.status}`);
1217
+ }
1218
+ const data = await response.json();
1219
+ console.log(`Token exchange successful for ${platform}`);
1220
+ return data;
1221
+ } catch (error) {
1222
+ console.error(`Error exchanging code for token:`, error);
1223
+
1224
+ // Fallback to simulation if the API call fails
1225
+ console.log('Falling back to simulated token response');
1226
+ return {
1227
+ access_token: `${platform}_access_token_${Math.random().toString(36).substring(7)}`,
1228
+ refresh_token: `${platform}_refresh_token_${Math.random().toString(36).substring(7)}`,
1229
+ expires_in: 3600
1230
+ };
1231
+ }
1232
+ };
1233
+
1234
+ /**
1235
+ * Refresh YouTube tokens when they expire
1236
+ * This should be called when the backend reports token expiry
1237
+ */
1238
+ exports.exchangeCodeForToken = exchangeCodeForToken;
1239
+ const refreshYouTubeTokens = async () => {
1240
+ try {
1241
+ var _currentUser$user3;
1242
+ console.log('๐Ÿ”„ Refreshing YouTube tokens...');
1243
+
1244
+ // Get fresh tokens from Google SDK
1245
+ const freshTokens = await _googleSignin.GoogleSignin.getTokens();
1246
+ if (!freshTokens) {
1247
+ console.error('โŒ Failed to get fresh tokens from Google SDK');
1248
+ return false;
1249
+ }
1250
+
1251
+ // Get current user info
1252
+ const currentUser = await _googleSignin.GoogleSignin.getCurrentUser();
1253
+ if (!currentUser) {
1254
+ console.error('โŒ No current Google user found');
1255
+ return false;
1256
+ }
1257
+
1258
+ // Get stored auth token using simplified JWT storage
1259
+ const authToken = await (0, _jwtStorageService.getJWT)();
1260
+ if (!authToken) {
1261
+ console.error('โŒ No auth token found for YouTube refresh');
1262
+ return false;
1263
+ }
1264
+
1265
+ // Send refreshed tokens to backend
1266
+ const refreshResponse = await fetch(`${_api.API_CONFIG.BASE_URL}/youtube/refresh-token`, {
1267
+ method: 'POST',
1268
+ headers: {
1269
+ 'Content-Type': 'application/json',
1270
+ 'Authorization': authToken
1271
+ },
1272
+ body: JSON.stringify({
1273
+ accessToken: freshTokens.accessToken,
1274
+ idToken: freshTokens.idToken,
1275
+ refreshToken: currentUser.serverAuthCode,
1276
+ userEmail: (_currentUser$user3 = currentUser.user) === null || _currentUser$user3 === void 0 ? void 0 : _currentUser$user3.email,
1277
+ tokenExpiry: new Date(Date.now() + 3600 * 1000).toISOString(),
1278
+ // 1 hour from now
1279
+ timestamp: new Date().toISOString()
1280
+ })
1281
+ });
1282
+ if (refreshResponse.ok) {
1283
+ const responseData = await refreshResponse.json();
1284
+ console.log('โœ… YouTube tokens refreshed successfully:', responseData);
1285
+ return true;
1286
+ } else {
1287
+ const errorData = await refreshResponse.text();
1288
+ console.error('โŒ YouTube token refresh failed:', refreshResponse.status, errorData);
1289
+ return false;
1290
+ }
1291
+ } catch (error) {
1292
+ console.error('โŒ Error refreshing YouTube tokens:', error);
1293
+ return false;
1294
+ }
1295
+ };
1296
+
1297
+ /**
1298
+ * Trigger training restart after YouTube re-authentication
1299
+ * This signals the backend to restart training with the new refresh token
1300
+ */
1301
+ exports.refreshYouTubeTokens = refreshYouTubeTokens;
1302
+ const triggerTrainingRestart = async (username, authToken) => {
1303
+ try {
1304
+ console.log('๐Ÿ”„ [TRAINING RESTART] Triggering training restart for user:', username);
1305
+ const response = await fetch(`${_api.API_CONFIG.BASE_URL}/mobile-training/restart`, {
1306
+ method: 'POST',
1307
+ headers: {
1308
+ 'Content-Type': 'application/json',
1309
+ 'Authorization': authToken
1310
+ },
1311
+ body: JSON.stringify({
1312
+ username: username,
1313
+ reason: 'youtube_reauth',
1314
+ platform: 'youtube',
1315
+ timestamp: new Date().toISOString(),
1316
+ requestNewTraining: true
1317
+ })
1318
+ });
1319
+ if (response.ok) {
1320
+ const responseData = await response.json();
1321
+ console.log('โœ… [TRAINING RESTART] Training restart successful:', responseData);
1322
+ } else {
1323
+ const errorData = await response.text();
1324
+ console.error('โŒ [TRAINING RESTART] Training restart failed:', response.status, errorData);
1325
+ throw new Error(`Training restart failed: ${response.status}`);
1326
+ }
1327
+ } catch (error) {
1328
+ console.error('โŒ [TRAINING RESTART] Error triggering training restart:', error);
1329
+ throw error;
1330
+ }
1331
+ };
1332
+
1333
+ /**
1334
+ * Test function to verify YouTube refresh token functionality
1335
+ * Call this in your app to test the YouTube connection
1336
+ */
1337
+ const testYouTubeRefreshToken = async username => {
1338
+ console.log('๐Ÿงช Testing YouTube refresh token functionality...');
1339
+ console.log('๐Ÿ‘ค User:', username);
1340
+ try {
1341
+ // Test the debug function first
1342
+ const debugInfo = await debugYouTubeTokens();
1343
+ console.log('๐Ÿ” Current token status:', debugInfo);
1344
+ if (!debugInfo.hasRefreshToken) {
1345
+ console.log('โš ๏ธ No refresh token found - attempting to fix...');
1346
+ const success = await fixUserYouTubeConnection(username);
1347
+ if (success) {
1348
+ console.log('โœ… YouTube connection fixed! Testing again...');
1349
+ const newDebugInfo = await debugYouTubeTokens();
1350
+ console.log('๐Ÿ” New token status:', newDebugInfo);
1351
+ } else {
1352
+ console.error('โŒ Failed to fix YouTube connection');
1353
+ }
1354
+ } else {
1355
+ console.log('โœ… Refresh token already available');
1356
+ }
1357
+ } catch (error) {
1358
+ console.error('โŒ Error testing YouTube refresh token:', error);
1359
+ }
1360
+ };
1361
+
1362
+ /**
1363
+ * Request email verification code
1364
+ */
1365
+ exports.testYouTubeRefreshToken = testYouTubeRefreshToken;
1366
+ const requestEmailVerification = async (email, testMode = false) => {
1367
+ try {
1368
+ console.log('๐Ÿ“ง Requesting email verification for:', email);
1369
+
1370
+ // ๐Ÿ”’ SECURITY: Use developer API key - backend must validate
1371
+ const response = await fetch(`${_api.API_CONFIG.BASE_URL}/email/verification`, {
1372
+ method: 'POST',
1373
+ headers: getDeveloperAuthHeaders(),
1374
+ body: JSON.stringify({
1375
+ email,
1376
+ action: 'request',
1377
+ testMode
1378
+ })
1379
+ });
1380
+ const result = await response.json();
1381
+ if (response.ok) {
1382
+ return {
1383
+ success: true,
1384
+ message: result.message || 'Verification code sent to your email'
1385
+ };
1386
+ } else {
1387
+ return {
1388
+ success: false,
1389
+ error: result.message || 'Failed to send verification code'
1390
+ };
1391
+ }
1392
+ } catch (error) {
1393
+ console.error('โŒ Error requesting email verification:', error);
1394
+ return {
1395
+ success: false,
1396
+ error: 'Network error. Please check your connection and try again.'
1397
+ };
1398
+ }
1399
+ };
1400
+
1401
+ /**
1402
+ * Verify email code
1403
+ */
1404
+ exports.requestEmailVerification = requestEmailVerification;
1405
+ const verifyEmailCode = async (email, code, testMode = false) => {
1406
+ try {
1407
+ console.log('๐Ÿ” Verifying email code for:', email);
1408
+
1409
+ // ๐Ÿ”’ SECURITY: Use developer API key - backend must validate before issuing JWT
1410
+ const response = await fetch(`${_api.API_CONFIG.BASE_URL}/email/verification`, {
1411
+ method: 'POST',
1412
+ headers: getDeveloperAuthHeaders(),
1413
+ body: JSON.stringify({
1414
+ email,
1415
+ code,
1416
+ action: 'verify',
1417
+ testMode
1418
+ })
1419
+ });
1420
+ const result = await response.json();
1421
+ if (response.ok) {
1422
+ return {
1423
+ success: true,
1424
+ message: result.message || 'Email verified successfully',
1425
+ existingUser: result.existingUser || false,
1426
+ token: result.token
1427
+ };
1428
+ } else {
1429
+ return {
1430
+ success: false,
1431
+ error: result.message || 'Invalid verification code'
1432
+ };
1433
+ }
1434
+ } catch (error) {
1435
+ console.error('โŒ Error verifying email code:', error);
1436
+ return {
1437
+ success: false,
1438
+ error: 'Network error. Please check your connection and try again.'
1439
+ };
1440
+ }
1441
+ };
1442
+
1443
+ /**
1444
+ * Check email verification status
1445
+ */
1446
+ exports.verifyEmailCode = verifyEmailCode;
1447
+ const checkEmailVerificationStatus = async (email, testMode = false) => {
1448
+ try {
1449
+ // ๐Ÿ”’ SECURITY: Use developer API key - backend must validate
1450
+ const response = await fetch(`${_api.API_CONFIG.BASE_URL}/email/verification/status`, {
1451
+ method: 'POST',
1452
+ headers: getDeveloperAuthHeaders(),
1453
+ body: JSON.stringify({
1454
+ email,
1455
+ testMode
1456
+ })
1457
+ });
1458
+ const result = await response.json();
1459
+ return {
1460
+ success: response.ok,
1461
+ isPending: result.isPending || false,
1462
+ message: result.message
1463
+ };
1464
+ } catch (error) {
1465
+ console.error('โŒ Error checking email verification status:', error);
1466
+ return {
1467
+ success: false,
1468
+ isPending: false,
1469
+ error: 'Network error'
1470
+ };
1471
+ }
1472
+ };
1473
+
1474
+ /**
1475
+ * Initialize platform auth service
1476
+ */
1477
+ exports.checkEmailVerificationStatus = checkEmailVerificationStatus;
1478
+ const initializePlatformAuthService = () => {
1479
+ console.log('๐Ÿ”ง Platform auth service initialized');
1480
+ // Initialize Google Sign-In
1481
+ initializeGoogleSignIn();
1482
+ };
1483
+ exports.initializePlatformAuthService = initializePlatformAuthService;
1484
+ //# sourceMappingURL=platformAuthService.js.map