diff --git a/cabi/Cargo.lock b/cabi/Cargo.lock index c8c6159a9..7326f1059 100644 --- a/cabi/Cargo.lock +++ b/cabi/Cargo.lock @@ -936,7 +936,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sourcemap" -version = "4.1.1" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1082,7 +1082,7 @@ name = "symbolic-sourcemap" version = "7.0.0" dependencies = [ "failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "sourcemap 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "sourcemap 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1380,7 +1380,7 @@ dependencies = [ "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" "checksum smallvec 0.6.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab606a9c5e214920bb66c458cd7be8ef094f813f20fe77a54cc7dbfff220d4b7" -"checksum sourcemap 4.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c9d3a3f2a4d60c8702cc6f60bca874548d0e0dcae40af629c476e56e44fa7adb" +"checksum sourcemap 5.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8fd57aa9e5cea41b4a3c26a61039fad5585e2154ffe057a2656540a21b03a2d2" "checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" "checksum string_cache 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25d70109977172b127fe834e5449e5ab1740b9ba49fa18a2020f509174f25423" "checksum string_cache_codegen 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1eea1eee654ef80933142157fdad9dd8bc43cf7c74e999e369263496f04ff4da" diff --git a/sourcemap/Cargo.toml b/sourcemap/Cargo.toml index 2b5583141..169e206c6 100644 --- a/sourcemap/Cargo.toml +++ b/sourcemap/Cargo.toml @@ -17,4 +17,4 @@ edition = "2018" [dependencies] failure = "0.1.5" -sourcemap = "4.1.0" +sourcemap = "5.0.0" diff --git a/sourcemap/src/lib.rs b/sourcemap/src/lib.rs index 174ef9b56..c22b24a3f 100644 --- a/sourcemap/src/lib.rs +++ b/sourcemap/src/lib.rs @@ -4,6 +4,7 @@ use std::borrow::Cow; use std::fmt; +use std::ops::Deref; use failure::Fail; @@ -44,12 +45,29 @@ pub struct SourceView<'a> { sv: sourcemap::SourceView<'a>, } +enum SourceMapType { + Regular(sourcemap::SourceMap), + Hermes(sourcemap::SourceMapHermes), +} + +impl Deref for SourceMapType { + type Target = sourcemap::SourceMap; + + fn deref(&self) -> &Self::Target { + match self { + SourceMapType::Regular(sm) => sm, + SourceMapType::Hermes(smh) => smh, + } + } +} + /// Represents a source map. pub struct SourceMapView { - sm: sourcemap::SourceMap, + sm: SourceMapType, } /// A matched token. +#[derive(Debug, Default, PartialEq)] pub struct TokenMatch<'a> { /// The line number in the original source file. pub src_line: u32, @@ -116,8 +134,9 @@ impl SourceMapView { pub fn from_json_slice(buffer: &[u8]) -> Result { Ok(SourceMapView { sm: match sourcemap::decode_slice(buffer)? { - sourcemap::DecodedMap::Regular(sm) => sm, - sourcemap::DecodedMap::Index(smi) => smi.flatten()?, + sourcemap::DecodedMap::Regular(sm) => SourceMapType::Regular(sm), + sourcemap::DecodedMap::Index(smi) => SourceMapType::Regular(smi.flatten()?), + sourcemap::DecodedMap::Hermes(smh) => SourceMapType::Hermes(smh), }, }) } @@ -169,14 +188,26 @@ impl SourceMapView { minified_name: &str, source: &SourceView<'b>, ) -> Option> { - self.sm.lookup_token(line, col).map(|token| { - let mut rv = self.make_token_match(token); - rv.function_name = source - .sv - .get_original_function_name(token, minified_name) - .map(str::to_owned); - rv - }) + match &self.sm { + SourceMapType::Regular(sm) => sm.lookup_token(line, col).map(|token| { + let mut rv = self.make_token_match(token); + rv.function_name = source + .sv + .get_original_function_name(token, minified_name) + .map(str::to_owned); + rv + }), + SourceMapType::Hermes(smh) => { + // we use `col + 1` here, since hermes uses bytecode offsets which are 0-based, + // and the upstream python code does a `- 1` here: + // https://github.com/getsentry/sentry/blob/fdabccac7576c80674c2fed556d4c5407657dc4c/src/sentry/lang/javascript/processor.py#L584-L586 + smh.lookup_token(line, col + 1).map(|token| { + let mut rv = self.make_token_match(token); + rv.function_name = smh.get_original_function_name(col + 1).map(str::to_owned); + rv + }) + } + } } fn make_token_match<'a>(&'a self, tok: sourcemap::Token<'a>) -> TokenMatch<'a> { @@ -192,3 +223,40 @@ impl SourceMapView { } } } + +#[test] +fn test_react_native_hermes() { + let bytes = include_bytes!("../tests/fixtures/react-native-hermes.map"); + let smv = SourceMapView::from_json_slice(bytes).unwrap(); + let sv = SourceView::new(""); + + // at foo (address at unknown:1:11939) + assert_eq!( + smv.lookup_token_with_function_name(0, 11939, "", &sv), + Some(TokenMatch { + src_line: 1, + src_col: 10, + dst_line: 0, + dst_col: 11939, + src_id: 5, + name: None, + src: Some("module.js"), + function_name: Some("foo".into()) + }) + ); + + // at anonymous (address at unknown:1:11857) + assert_eq!( + smv.lookup_token_with_function_name(0, 11857, "", &sv), + Some(TokenMatch { + src_line: 2, + src_col: 0, + dst_line: 0, + dst_col: 11857, + src_id: 4, + name: None, + src: Some("input.js"), + function_name: Some("".into()) + }) + ); +} diff --git a/sourcemap/tests/fixtures/README.md b/sourcemap/tests/fixtures/README.md new file mode 100644 index 000000000..08409e12c --- /dev/null +++ b/sourcemap/tests/fixtures/README.md @@ -0,0 +1,5 @@ +## react-native-hermes.map + +This SourceMap is one generated by the `react-native` + `hermes` pipeline. +See the `rust-sourcemap` repo for instructions on how to generate it. +Additionally, it was processed by `sentry-cli`, which basically inlines all the `sourceContent`s. diff --git a/sourcemap/tests/fixtures/react-native-hermes.map b/sourcemap/tests/fixtures/react-native-hermes.map new file mode 100644 index 000000000..2bcee80e0 --- /dev/null +++ b/sourcemap/tests/fixtures/react-native-hermes.map @@ -0,0 +1 @@ +{"version":3,"sources":["node_modules/metro/src/lib/polyfills/require.js","node_modules/react-native/Libraries/polyfills/console.js","node_modules/react-native/Libraries/polyfills/error-guard.js","node_modules/react-native/Libraries/polyfills/Object.es7.js","input.js","module.js"],"sourcesContent":["/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @polyfill\n *\n * @format\n */\n\"use strict\";\n/* eslint-disable no-bitwise */\n\nglobal.__r = metroRequire;\nglobal.__d = define;\nglobal.__c = clear;\nglobal.__registerSegment = registerSegment;\nvar modules = clear(); // Don't use a Symbol here, it would pull in an extra polyfill with all sorts of\n// additional stuff (e.g. Array.from).\n\nconst EMPTY = {};\nconst _ref = {},\n hasOwnProperty = _ref.hasOwnProperty;\n\nif (__DEV__) {\n global.$RefreshReg$ = () => {};\n\n global.$RefreshSig$ = () => type => type;\n}\n\nfunction clear() {\n modules = Object.create(null); // We return modules here so that we can assign an initial value to modules\n // when defining it. Otherwise, we would have to do \"let modules = null\",\n // which will force us to add \"nullthrows\" everywhere.\n\n return modules;\n}\n\nif (__DEV__) {\n var verboseNamesToModuleIds = Object.create(null);\n var initializingModuleIds = [];\n}\n\nfunction define(factory, moduleId, dependencyMap) {\n if (modules[moduleId] != null) {\n if (__DEV__) {\n // (We take `inverseDependencies` from `arguments` to avoid an unused\n // named parameter in `define` in production.\n const inverseDependencies = arguments[4]; // If the module has already been defined and the define method has been\n // called with inverseDependencies, we can hot reload it.\n\n if (inverseDependencies) {\n global.__accept(moduleId, factory, dependencyMap, inverseDependencies);\n }\n } // prevent repeated calls to `global.nativeRequire` to overwrite modules\n // that are already loaded\n\n return;\n }\n\n const mod = {\n dependencyMap,\n factory,\n hasError: false,\n importedAll: EMPTY,\n importedDefault: EMPTY,\n isInitialized: false,\n publicModule: {\n exports: {}\n }\n };\n modules[moduleId] = mod;\n\n if (__DEV__) {\n // HMR\n mod.hot = createHotReloadingObject(); // DEBUGGABLE MODULES NAMES\n // we take `verboseName` from `arguments` to avoid an unused named parameter\n // in `define` in production.\n\n const verboseName = arguments[3];\n\n if (verboseName) {\n mod.verboseName = verboseName;\n verboseNamesToModuleIds[verboseName] = moduleId;\n }\n }\n}\n\nfunction metroRequire(moduleId) {\n if (__DEV__ && typeof moduleId === \"string\") {\n const verboseName = moduleId;\n moduleId = verboseNamesToModuleIds[verboseName];\n\n if (moduleId == null) {\n throw new Error(`Unknown named module: \"${verboseName}\"`);\n } else {\n console.warn(\n `Requiring module \"${verboseName}\" by name is only supported for ` +\n \"debugging purposes and will BREAK IN PRODUCTION!\"\n );\n }\n } //$FlowFixMe: at this point we know that moduleId is a number\n\n const moduleIdReallyIsNumber = moduleId;\n\n if (__DEV__) {\n const initializingIndex = initializingModuleIds.indexOf(\n moduleIdReallyIsNumber\n );\n\n if (initializingIndex !== -1) {\n const cycle = initializingModuleIds\n .slice(initializingIndex)\n .map(id => (modules[id] ? modules[id].verboseName : \"[unknown]\")); // We want to show A -> B -> A:\n\n cycle.push(cycle[0]);\n console.warn(\n `Require cycle: ${cycle.join(\" -> \")}\\n\\n` +\n \"Require cycles are allowed, but can result in uninitialized values. \" +\n \"Consider refactoring to remove the need for a cycle.\"\n );\n }\n }\n\n const module = modules[moduleIdReallyIsNumber];\n return module && module.isInitialized\n ? module.publicModule.exports\n : guardedLoadModule(moduleIdReallyIsNumber, module);\n}\n\nfunction metroImportDefault(moduleId) {\n if (__DEV__ && typeof moduleId === \"string\") {\n const verboseName = moduleId;\n moduleId = verboseNamesToModuleIds[verboseName];\n } //$FlowFixMe: at this point we know that moduleId is a number\n\n const moduleIdReallyIsNumber = moduleId;\n\n if (\n modules[moduleIdReallyIsNumber] &&\n modules[moduleIdReallyIsNumber].importedDefault !== EMPTY\n ) {\n return modules[moduleIdReallyIsNumber].importedDefault;\n }\n\n const exports = metroRequire(moduleIdReallyIsNumber);\n const importedDefault =\n exports && exports.__esModule ? exports.default : exports; // $FlowFixMe The metroRequire call above will throw if modules[id] is null\n\n return (modules[moduleIdReallyIsNumber].importedDefault = importedDefault);\n}\n\nmetroRequire.importDefault = metroImportDefault;\n\nfunction metroImportAll(moduleId) {\n if (__DEV__ && typeof moduleId === \"string\") {\n const verboseName = moduleId;\n moduleId = verboseNamesToModuleIds[verboseName];\n } //$FlowFixMe: at this point we know that moduleId is a number\n\n const moduleIdReallyIsNumber = moduleId;\n\n if (\n modules[moduleIdReallyIsNumber] &&\n modules[moduleIdReallyIsNumber].importedAll !== EMPTY\n ) {\n return modules[moduleIdReallyIsNumber].importedAll;\n }\n\n const exports = metroRequire(moduleIdReallyIsNumber);\n let importedAll;\n\n if (exports && exports.__esModule) {\n importedAll = exports;\n } else {\n importedAll = {}; // Refrain from using Object.assign, it has to work in ES3 environments.\n\n if (exports) {\n for (const key in exports) {\n if (hasOwnProperty.call(exports, key)) {\n importedAll[key] = exports[key];\n }\n }\n }\n\n importedAll.default = exports;\n } // $FlowFixMe The metroRequire call above will throw if modules[id] is null\n\n return (modules[moduleIdReallyIsNumber].importedAll = importedAll);\n}\n\nmetroRequire.importAll = metroImportAll;\nlet inGuard = false;\n\nfunction guardedLoadModule(moduleId, module) {\n if (!inGuard && global.ErrorUtils) {\n inGuard = true;\n let returnValue;\n\n try {\n returnValue = loadModuleImplementation(moduleId, module);\n } catch (e) {\n // TODO: (moti) T48204692 Type this use of ErrorUtils.\n global.ErrorUtils.reportFatalError(e);\n }\n\n inGuard = false;\n return returnValue;\n } else {\n return loadModuleImplementation(moduleId, module);\n }\n}\n\nconst ID_MASK_SHIFT = 16;\nconst LOCAL_ID_MASK = ~0 >>> ID_MASK_SHIFT;\n\nfunction unpackModuleId(moduleId) {\n const segmentId = moduleId >>> ID_MASK_SHIFT;\n const localId = moduleId & LOCAL_ID_MASK;\n return {\n segmentId,\n localId\n };\n}\n\nmetroRequire.unpackModuleId = unpackModuleId;\n\nfunction packModuleId(value) {\n return (value.segmentId << ID_MASK_SHIFT) + value.localId;\n}\n\nmetroRequire.packModuleId = packModuleId;\nconst moduleDefinersBySegmentID = [];\n\nfunction registerSegment(segmentID, moduleDefiner) {\n moduleDefinersBySegmentID[segmentID] = moduleDefiner;\n}\n\nfunction loadModuleImplementation(moduleId, module) {\n if (!module && moduleDefinersBySegmentID.length > 0) {\n const _unpackModuleId = unpackModuleId(moduleId),\n segmentId = _unpackModuleId.segmentId,\n localId = _unpackModuleId.localId;\n\n const definer = moduleDefinersBySegmentID[segmentId];\n\n if (definer != null) {\n definer(localId);\n module = modules[moduleId];\n }\n }\n\n const nativeRequire = global.nativeRequire;\n\n if (!module && nativeRequire) {\n const _unpackModuleId2 = unpackModuleId(moduleId),\n segmentId = _unpackModuleId2.segmentId,\n localId = _unpackModuleId2.localId;\n\n nativeRequire(localId, segmentId);\n module = modules[moduleId];\n }\n\n if (!module) {\n throw unknownModuleError(moduleId);\n }\n\n if (module.hasError) {\n throw moduleThrewError(moduleId, module.error);\n } // `metroRequire` calls into the require polyfill itself are not analyzed and\n // replaced so that they use numeric module IDs.\n // The systrace module will expose itself on the metroRequire function so that\n // it can be used here.\n // TODO(t9759686) Scan polyfills for dependencies, too\n\n if (__DEV__) {\n var Systrace = metroRequire.Systrace,\n Refresh = metroRequire.Refresh;\n } // We must optimistically mark module as initialized before running the\n // factory to keep any require cycles inside the factory from causing an\n // infinite require loop.\n\n module.isInitialized = true;\n const _module = module,\n factory = _module.factory,\n dependencyMap = _module.dependencyMap;\n\n if (__DEV__) {\n initializingModuleIds.push(moduleId);\n }\n\n try {\n if (__DEV__) {\n // $FlowFixMe: we know that __DEV__ is const and `Systrace` exists\n Systrace.beginEvent(\"JS_require_\" + (module.verboseName || moduleId));\n }\n\n const moduleObject = module.publicModule;\n\n if (__DEV__) {\n moduleObject.hot = module.hot;\n var prevRefreshReg = global.$RefreshReg$;\n var prevRefreshSig = global.$RefreshSig$;\n\n if (Refresh != null) {\n const RefreshRuntime = Refresh;\n\n global.$RefreshReg$ = (type, id) => {\n RefreshRuntime.register(type, moduleId + \" \" + id);\n };\n\n global.$RefreshSig$ =\n RefreshRuntime.createSignatureFunctionForTransform;\n }\n }\n\n moduleObject.id = moduleId; // keep args in sync with with defineModuleCode in\n // metro/src/Resolver/index.js\n // and metro/src/ModuleGraph/worker.js\n\n factory(\n global,\n metroRequire,\n metroImportDefault,\n metroImportAll,\n moduleObject,\n moduleObject.exports,\n dependencyMap\n ); // avoid removing factory in DEV mode as it breaks HMR\n\n if (!__DEV__) {\n // $FlowFixMe: This is only sound because we never access `factory` again\n module.factory = undefined;\n module.dependencyMap = undefined;\n }\n\n if (__DEV__) {\n // $FlowFixMe: we know that __DEV__ is const and `Systrace` exists\n Systrace.endEvent();\n\n if (Refresh != null) {\n registerExportsForReactRefresh(Refresh, moduleObject.exports, moduleId);\n }\n }\n\n return moduleObject.exports;\n } catch (e) {\n module.hasError = true;\n module.error = e;\n module.isInitialized = false;\n module.publicModule.exports = undefined;\n throw e;\n } finally {\n if (__DEV__) {\n if (initializingModuleIds.pop() !== moduleId) {\n throw new Error(\n \"initializingModuleIds is corrupt; something is terribly wrong\"\n );\n }\n\n global.$RefreshReg$ = prevRefreshReg;\n global.$RefreshSig$ = prevRefreshSig;\n }\n }\n}\n\nfunction unknownModuleError(id) {\n let message = 'Requiring unknown module \"' + id + '\".';\n\n if (__DEV__) {\n message +=\n \" If you are sure the module exists, try restarting Metro. \" +\n \"You may also want to run `yarn` or `npm install`.\";\n }\n\n return Error(message);\n}\n\nfunction moduleThrewError(id, error) {\n const displayName = (__DEV__ && modules[id] && modules[id].verboseName) || id;\n return Error(\n 'Requiring module \"' + displayName + '\", which threw an exception: ' + error\n );\n}\n\nif (__DEV__) {\n metroRequire.Systrace = {\n beginEvent: () => {},\n endEvent: () => {}\n };\n\n metroRequire.getModules = () => {\n return modules;\n }; // HOT MODULE RELOADING\n\n var createHotReloadingObject = function() {\n const hot = {\n _acceptCallback: null,\n _disposeCallback: null,\n _didAccept: false,\n accept: callback => {\n hot._didAccept = true;\n hot._acceptCallback = callback;\n },\n dispose: callback => {\n hot._disposeCallback = callback;\n }\n };\n return hot;\n };\n\n let reactRefreshTimeout = null;\n\n const metroHotUpdateModule = function(\n id,\n factory,\n dependencyMap,\n inverseDependencies\n ) {\n const mod = modules[id];\n\n if (!mod) {\n if (factory) {\n // New modules are going to be handled by the define() method.\n return;\n }\n\n throw unknownModuleError(id);\n }\n\n if (!mod.hasError && !mod.isInitialized) {\n // The module hasn't actually been executed yet,\n // so we can always safely replace it.\n mod.factory = factory;\n mod.dependencyMap = dependencyMap;\n return;\n }\n\n const Refresh = metroRequire.Refresh;\n const pendingModuleIDs = [id];\n const updatedModuleIDs = [];\n const seenModuleIDs = new Set();\n const refreshBoundaryIDs = new Set(); // In this loop, we will traverse the dependency tree upwards from the\n // changed module. Updates \"bubble\" up to the closest accepted parent.\n //\n // If we reach the module root and nothing along the way accepted the update,\n // we know hot reload is going to fail. In that case we return false.\n //\n // The main purpose of this loop is to figure out whether it's safe to apply\n // a hot update. It is only safe when the update was accepted somewhere\n // along the way upwards for each of its parent dependency module chains.\n //\n // If we didn't have this check, we'd risk re-evaluating modules that\n // have side effects and lead to confusing and meaningless crashes.\n\n while (pendingModuleIDs.length > 0) {\n const pendingID = pendingModuleIDs.pop(); // Don't process twice if we have a cycle.\n\n if (seenModuleIDs.has(pendingID)) {\n continue;\n }\n\n seenModuleIDs.add(pendingID); // If the module accepts itself, no need to bubble.\n // We can stop worrying about this module chain and pick the next one.\n\n const pendingModule = modules[pendingID];\n\n if (pendingModule != null) {\n const pendingHot = pendingModule.hot;\n\n if (pendingHot == null) {\n throw new Error(\n \"[Refresh] Expected module.hot to always exist in DEV.\"\n );\n } // A module can be accepted manually from within itself.\n\n let canAccept = pendingHot._didAccept;\n\n if (!canAccept && Refresh != null) {\n // Or React Refresh may mark it accepted based on exports.\n const isBoundary = isReactRefreshBoundary(\n Refresh,\n pendingModule.publicModule.exports\n );\n\n if (isBoundary) {\n canAccept = true;\n refreshBoundaryIDs.add(pendingID);\n }\n }\n\n if (canAccept) {\n updatedModuleIDs.push(pendingID);\n continue;\n }\n } // If we bubble through the roof, there is no way to do a hot update.\n // Bail out altogether. This is the failure case.\n\n const parentIDs = inverseDependencies[pendingID];\n\n if (parentIDs.length === 0) {\n // Reload the app because the hot reload can't succeed.\n // This should work both on web and React Native.\n performFullRefresh();\n return;\n } // This module didn't accept but maybe all its parents did?\n // Put them all in the queue to run the same set of checks.\n\n updatedModuleIDs.push(pendingID);\n parentIDs.forEach(parentID => pendingModuleIDs.push(parentID));\n } // If we reached here, it is likely that hot reload will be successful.\n // Run the actual factories.\n\n seenModuleIDs.clear();\n\n for (let i = 0; i < updatedModuleIDs.length; i++) {\n // Don't process twice if we have a cycle.\n const updatedID = updatedModuleIDs[i];\n\n if (seenModuleIDs.has(updatedID)) {\n continue;\n }\n\n seenModuleIDs.add(updatedID);\n const mod = modules[updatedID];\n\n if (mod == null) {\n throw new Error(\"[Refresh] Expected to find the updated module.\");\n }\n\n const prevExports = mod.publicModule.exports;\n const didError = runUpdatedModule(\n updatedID,\n updatedID === id ? factory : undefined,\n updatedID === id ? dependencyMap : undefined\n );\n const nextExports = mod.publicModule.exports;\n\n if (didError) {\n // The user was shown a redbox about module initialization.\n // There's nothing for us to do here until it's fixed.\n return;\n }\n\n if (refreshBoundaryIDs.has(updatedID)) {\n // Since we just executed the code for it, it's possible\n // that the new exports make it ineligible for being a boundary.\n const isNoLongerABoundary = !isReactRefreshBoundary(\n Refresh,\n nextExports\n ); // It can also become ineligible if its exports are incompatible\n // with the previous exports.\n // For example, if you add/remove/change exports, we'll want\n // to re-execute the importing modules, and force those components\n // to re-render. Similarly, if you convert a class component\n // to a function, we want to invalidate the boundary.\n\n const didInvalidate = shouldInvalidateReactRefreshBoundary(\n Refresh,\n prevExports,\n nextExports\n );\n\n if (isNoLongerABoundary || didInvalidate) {\n // We'll be conservative. The only case in which we won't do a full\n // reload is if all parent modules are also refresh boundaries.\n // In that case we'll add them to the current queue.\n const parentIDs = inverseDependencies[updatedID];\n\n if (parentIDs.length === 0) {\n // Looks like we bubbled to the root. Can't recover from that.\n performFullRefresh();\n return;\n } // Schedule all parent refresh boundaries to re-run in this loop.\n\n for (let j = 0; j < parentIDs.length; j++) {\n const parentID = parentIDs[j];\n const parentMod = modules[parentID];\n\n if (parentMod == null) {\n throw new Error(\"[Refresh] Expected to find parent module.\");\n }\n\n const canAcceptParent = isReactRefreshBoundary(\n Refresh,\n parentMod.publicModule.exports\n );\n\n if (canAcceptParent) {\n // All parents will have to re-run too.\n refreshBoundaryIDs.add(parentID);\n updatedModuleIDs.push(parentID);\n } else {\n performFullRefresh();\n return;\n }\n }\n }\n }\n }\n\n if (Refresh != null) {\n // Debounce a little in case there are multiple updates queued up.\n // This is also useful because __accept may be called multiple times.\n if (reactRefreshTimeout == null) {\n reactRefreshTimeout = setTimeout(() => {\n reactRefreshTimeout = null; // Update React components.\n\n Refresh.performReactRefresh();\n }, 30);\n }\n }\n };\n\n const runUpdatedModule = function(id, factory, dependencyMap) {\n const mod = modules[id];\n\n if (mod == null) {\n throw new Error(\"[Refresh] Expected to find the module.\");\n }\n\n const hot = mod.hot;\n\n if (!hot) {\n throw new Error(\"[Refresh] Expected module.hot to always exist in DEV.\");\n }\n\n if (hot._disposeCallback) {\n try {\n hot._disposeCallback();\n } catch (error) {\n console.error(\n `Error while calling dispose handler for module ${id}: `,\n error\n );\n }\n }\n\n if (factory) {\n mod.factory = factory;\n }\n\n if (dependencyMap) {\n mod.dependencyMap = dependencyMap;\n }\n\n mod.hasError = false;\n mod.error = undefined;\n mod.importedAll = EMPTY;\n mod.importedDefault = EMPTY;\n mod.isInitialized = false;\n const prevExports = mod.publicModule.exports;\n mod.publicModule.exports = {};\n hot._didAccept = false;\n hot._acceptCallback = null;\n hot._disposeCallback = null;\n metroRequire(id);\n\n if (mod.hasError) {\n // This error has already been reported via a redbox.\n // We know it's likely a typo or some mistake that was just introduced.\n // Our goal now is to keep the rest of the application working so that by\n // the time user fixes the error, the app isn't completely destroyed\n // underneath the redbox. So we'll revert the module object to the last\n // successful export and stop propagating this update.\n mod.hasError = false;\n mod.isInitialized = true;\n mod.error = null;\n mod.publicModule.exports = prevExports; // We errored. Stop the update.\n\n return true;\n }\n\n if (hot._acceptCallback) {\n try {\n hot._acceptCallback();\n } catch (error) {\n console.error(\n `Error while calling accept handler for module ${id}: `,\n error\n );\n }\n } // No error.\n\n return false;\n };\n\n const performFullRefresh = () => {\n /* global window */\n if (\n typeof window !== \"undefined\" &&\n window.location != null &&\n typeof window.location.reload === \"function\"\n ) {\n window.location.reload();\n } else {\n // This is attached in setUpDeveloperTools.\n const Refresh = metroRequire.Refresh;\n\n if (Refresh != null) {\n Refresh.performFullRefresh();\n } else {\n console.warn(\"Could not reload the application after an edit.\");\n }\n }\n }; // Modules that only export components become React Refresh boundaries.\n\n var isReactRefreshBoundary = function(Refresh, moduleExports) {\n if (Refresh.isLikelyComponentType(moduleExports)) {\n return true;\n }\n\n if (moduleExports == null || typeof moduleExports !== \"object\") {\n // Exit if we can't iterate over exports.\n return false;\n }\n\n let hasExports = false;\n let areAllExportsComponents = true;\n\n for (const key in moduleExports) {\n hasExports = true;\n\n if (key === \"__esModule\") {\n continue;\n }\n\n const desc = Object.getOwnPropertyDescriptor(moduleExports, key);\n\n if (desc && desc.get) {\n // Don't invoke getters as they may have side effects.\n return false;\n }\n\n const exportValue = moduleExports[key];\n\n if (!Refresh.isLikelyComponentType(exportValue)) {\n areAllExportsComponents = false;\n }\n }\n\n return hasExports && areAllExportsComponents;\n };\n\n var shouldInvalidateReactRefreshBoundary = (\n Refresh,\n prevExports,\n nextExports\n ) => {\n const prevSignature = getRefreshBoundarySignature(Refresh, prevExports);\n const nextSignature = getRefreshBoundarySignature(Refresh, nextExports);\n\n if (prevSignature.length !== nextSignature.length) {\n return true;\n }\n\n for (let i = 0; i < nextSignature.length; i++) {\n if (prevSignature[i] !== nextSignature[i]) {\n return true;\n }\n }\n\n return false;\n }; // When this signature changes, it's unsafe to stop at this refresh boundary.\n\n var getRefreshBoundarySignature = (Refresh, moduleExports) => {\n const signature = [];\n signature.push(Refresh.getFamilyByType(moduleExports));\n\n if (moduleExports == null || typeof moduleExports !== \"object\") {\n // Exit if we can't iterate over exports.\n // (This is important for legacy environments.)\n return signature;\n }\n\n for (const key in moduleExports) {\n if (key === \"__esModule\") {\n continue;\n }\n\n const desc = Object.getOwnPropertyDescriptor(moduleExports, key);\n\n if (desc && desc.get) {\n continue;\n }\n\n const exportValue = moduleExports[key];\n signature.push(key);\n signature.push(Refresh.getFamilyByType(exportValue));\n }\n\n return signature;\n };\n\n var registerExportsForReactRefresh = (Refresh, moduleExports, moduleID) => {\n Refresh.register(moduleExports, moduleID + \" %exports%\");\n\n if (moduleExports == null || typeof moduleExports !== \"object\") {\n // Exit if we can't iterate over exports.\n // (This is important for legacy environments.)\n return;\n }\n\n for (const key in moduleExports) {\n const desc = Object.getOwnPropertyDescriptor(moduleExports, key);\n\n if (desc && desc.get) {\n // Don't invoke getters as they may have side effects.\n continue;\n }\n\n const exportValue = moduleExports[key];\n const typeID = moduleID + \" %exports% \" + key;\n Refresh.register(exportValue, typeID);\n }\n };\n\n global.__accept = metroHotUpdateModule;\n}\n","/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @polyfill\n * @nolint\n * @format\n */\n\n/* eslint-disable no-shadow, eqeqeq, curly, no-unused-vars, no-void, no-control-regex */\n\n/**\n * This pipes all of our console logging functions to native logging so that\n * JavaScript errors in required modules show up in Xcode via NSLog.\n */\nconst inspect = (function() {\n // Copyright Joyent, Inc. and other Node contributors.\n //\n // Permission is hereby granted, free of charge, to any person obtaining a\n // copy of this software and associated documentation files (the\n // \"Software\"), to deal in the Software without restriction, including\n // without limitation the rights to use, copy, modify, merge, publish,\n // distribute, sublicense, and/or sell copies of the Software, and to permit\n // persons to whom the Software is furnished to do so, subject to the\n // following conditions:\n //\n // The above copyright notice and this permission notice shall be included\n // in all copies or substantial portions of the Software.\n //\n // THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n // USE OR OTHER DEALINGS IN THE SOFTWARE.\n //\n // https://github.com/joyent/node/blob/master/lib/util.js\n\n function inspect(obj, opts) {\n var ctx = {\n seen: [],\n formatValueCalls: 0,\n stylize: stylizeNoColor,\n };\n return formatValue(ctx, obj, opts.depth);\n }\n\n function stylizeNoColor(str, styleType) {\n return str;\n }\n\n function arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n }\n\n function formatValue(ctx, value, recurseTimes) {\n ctx.formatValueCalls++;\n if (ctx.formatValueCalls > 200) {\n return `[TOO BIG formatValueCalls ${\n ctx.formatValueCalls\n } exceeded limit of 200]`;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (\n isError(value) &&\n (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)\n ) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '',\n array = false,\n braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(\n ctx,\n value,\n recurseTimes,\n visibleKeys,\n key,\n array,\n );\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n }\n\n function formatPrimitive(ctx, value) {\n if (isUndefined(value)) return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple =\n \"'\" +\n JSON.stringify(value)\n .replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') +\n \"'\";\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value)) return ctx.stylize('' + value, 'number');\n if (isBoolean(value)) return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value)) return ctx.stylize('null', 'null');\n }\n\n function formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n }\n\n function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(\n formatProperty(\n ctx,\n value,\n recurseTimes,\n visibleKeys,\n String(i),\n true,\n ),\n );\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(\n formatProperty(ctx, value, recurseTimes, visibleKeys, key, true),\n );\n }\n });\n return output;\n }\n\n function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || {value: value[key]};\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str\n .split('\\n')\n .map(function(line) {\n return ' ' + line;\n })\n .join('\\n')\n .substr(2);\n } else {\n str =\n '\\n' +\n str\n .split('\\n')\n .map(function(line) {\n return ' ' + line;\n })\n .join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n }\n\n function reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return (\n braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1]\n );\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n }\n\n // NOTE: These type checking functions intentionally don't use `instanceof`\n // because it is fragile and can be easily faked with `Object.create()`.\n function isArray(ar) {\n return Array.isArray(ar);\n }\n\n function isBoolean(arg) {\n return typeof arg === 'boolean';\n }\n\n function isNull(arg) {\n return arg === null;\n }\n\n function isNullOrUndefined(arg) {\n return arg == null;\n }\n\n function isNumber(arg) {\n return typeof arg === 'number';\n }\n\n function isString(arg) {\n return typeof arg === 'string';\n }\n\n function isSymbol(arg) {\n return typeof arg === 'symbol';\n }\n\n function isUndefined(arg) {\n return arg === void 0;\n }\n\n function isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n }\n\n function isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n }\n\n function isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n }\n\n function isError(e) {\n return (\n isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error)\n );\n }\n\n function isFunction(arg) {\n return typeof arg === 'function';\n }\n\n function objectToString(o) {\n return Object.prototype.toString.call(o);\n }\n\n function hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n }\n\n return inspect;\n})();\n\nconst OBJECT_COLUMN_NAME = '(index)';\nconst LOG_LEVELS = {\n trace: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\nconst INSPECTOR_LEVELS = [];\nINSPECTOR_LEVELS[LOG_LEVELS.trace] = 'debug';\nINSPECTOR_LEVELS[LOG_LEVELS.info] = 'log';\nINSPECTOR_LEVELS[LOG_LEVELS.warn] = 'warning';\nINSPECTOR_LEVELS[LOG_LEVELS.error] = 'error';\n\n// Strip the inner function in getNativeLogFunction(), if in dev also\n// strip method printing to originalConsole.\nconst INSPECTOR_FRAMES_TO_SKIP = __DEV__ ? 2 : 1;\n\nfunction getNativeLogFunction(level) {\n return function() {\n let str;\n if (arguments.length === 1 && typeof arguments[0] === 'string') {\n str = arguments[0];\n } else {\n str = Array.prototype.map\n .call(arguments, function(arg) {\n return inspect(arg, {depth: 10});\n })\n .join(', ');\n }\n\n let logLevel = level;\n if (str.slice(0, 9) === 'Warning: ' && logLevel >= LOG_LEVELS.error) {\n // React warnings use console.error so that a stack trace is shown,\n // but we don't (currently) want these to show a redbox\n // (Note: Logic duplicated in ExceptionsManager.js.)\n logLevel = LOG_LEVELS.warn;\n }\n if (global.__inspectorLog) {\n global.__inspectorLog(\n INSPECTOR_LEVELS[logLevel],\n str,\n [].slice.call(arguments),\n INSPECTOR_FRAMES_TO_SKIP,\n );\n }\n if (groupStack.length) {\n str = groupFormat('', str);\n }\n global.nativeLoggingHook(str, logLevel);\n };\n}\n\nfunction repeat(element, n) {\n return Array.apply(null, Array(n)).map(function() {\n return element;\n });\n}\n\nfunction consoleTablePolyfill(rows) {\n // convert object -> array\n if (!Array.isArray(rows)) {\n var data = rows;\n rows = [];\n for (var key in data) {\n if (data.hasOwnProperty(key)) {\n var row = data[key];\n row[OBJECT_COLUMN_NAME] = key;\n rows.push(row);\n }\n }\n }\n if (rows.length === 0) {\n global.nativeLoggingHook('', LOG_LEVELS.info);\n return;\n }\n\n var columns = Object.keys(rows[0]).sort();\n var stringRows = [];\n var columnWidths = [];\n\n // Convert each cell to a string. Also\n // figure out max cell width for each column\n columns.forEach(function(k, i) {\n columnWidths[i] = k.length;\n for (var j = 0; j < rows.length; j++) {\n var cellStr = (rows[j][k] || '?').toString();\n stringRows[j] = stringRows[j] || [];\n stringRows[j][i] = cellStr;\n columnWidths[i] = Math.max(columnWidths[i], cellStr.length);\n }\n });\n\n // Join all elements in the row into a single string with | separators\n // (appends extra spaces to each cell to make separators | aligned)\n function joinRow(row, space) {\n var cells = row.map(function(cell, i) {\n var extraSpaces = repeat(' ', columnWidths[i] - cell.length).join('');\n return cell + extraSpaces;\n });\n space = space || ' ';\n return cells.join(space + '|' + space);\n }\n\n var separators = columnWidths.map(function(columnWidth) {\n return repeat('-', columnWidth).join('');\n });\n var separatorRow = joinRow(separators, '-');\n var header = joinRow(columns);\n var table = [header, separatorRow];\n\n for (var i = 0; i < rows.length; i++) {\n table.push(joinRow(stringRows[i]));\n }\n\n // Notice extra empty line at the beginning.\n // Native logging hook adds \"RCTLog >\" at the front of every\n // logged string, which would shift the header and screw up\n // the table\n global.nativeLoggingHook('\\n' + table.join('\\n'), LOG_LEVELS.info);\n}\n\nconst GROUP_PAD = '\\u2502'; // Box light vertical\nconst GROUP_OPEN = '\\u2510'; // Box light down+left\nconst GROUP_CLOSE = '\\u2518'; // Box light up+left\n\nconst groupStack = [];\n\nfunction groupFormat(prefix, msg) {\n // Insert group formatting before the console message\n return groupStack.join('') + prefix + ' ' + (msg || '');\n}\n\nfunction consoleGroupPolyfill(label) {\n global.nativeLoggingHook(groupFormat(GROUP_OPEN, label), LOG_LEVELS.info);\n groupStack.push(GROUP_PAD);\n}\n\nfunction consoleGroupCollapsedPolyfill(label) {\n global.nativeLoggingHook(groupFormat(GROUP_CLOSE, label), LOG_LEVELS.info);\n groupStack.push(GROUP_PAD);\n}\n\nfunction consoleGroupEndPolyfill() {\n groupStack.pop();\n global.nativeLoggingHook(groupFormat(GROUP_CLOSE), LOG_LEVELS.info);\n}\n\nfunction consoleAssertPolyfill(expression, label) {\n if (!expression) {\n global.nativeLoggingHook('Assertion failed: ' + label, LOG_LEVELS.error);\n }\n}\n\nif (global.nativeLoggingHook) {\n const originalConsole = global.console;\n // Preserve the original `console` as `originalConsole`\n if (__DEV__ && originalConsole) {\n const descriptor = Object.getOwnPropertyDescriptor(global, 'console');\n if (descriptor) {\n Object.defineProperty(global, 'originalConsole', descriptor);\n }\n }\n\n global.console = {\n error: getNativeLogFunction(LOG_LEVELS.error),\n info: getNativeLogFunction(LOG_LEVELS.info),\n log: getNativeLogFunction(LOG_LEVELS.info),\n warn: getNativeLogFunction(LOG_LEVELS.warn),\n trace: getNativeLogFunction(LOG_LEVELS.trace),\n debug: getNativeLogFunction(LOG_LEVELS.trace),\n table: consoleTablePolyfill,\n group: consoleGroupPolyfill,\n groupEnd: consoleGroupEndPolyfill,\n groupCollapsed: consoleGroupCollapsedPolyfill,\n assert: consoleAssertPolyfill,\n };\n\n Object.defineProperty(console, '_isPolyfilled', {\n value: true,\n enumerable: false,\n });\n\n // If available, also call the original `console` method since that is\n // sometimes useful. Ex: on OS X, this will let you see rich output in\n // the Safari Web Inspector console.\n if (__DEV__ && originalConsole) {\n Object.keys(console).forEach(methodName => {\n const reactNativeMethod = console[methodName];\n if (originalConsole[methodName]) {\n console[methodName] = function() {\n // TODO(T43930203): remove this special case once originalConsole.assert properly checks\n // the condition\n if (methodName === 'assert') {\n if (!arguments[0]) {\n originalConsole.assert(...arguments);\n }\n } else {\n originalConsole[methodName](...arguments);\n }\n reactNativeMethod.apply(console, arguments);\n };\n }\n });\n\n // The following methods are not supported by this polyfill but\n // we still should pass them to original console if they are\n // supported by it.\n [\n 'clear',\n 'dir',\n 'dirxml',\n 'groupCollapsed',\n 'profile',\n 'profileEnd',\n ].forEach(methodName => {\n if (typeof originalConsole[methodName] === 'function') {\n console[methodName] = function() {\n originalConsole[methodName](...arguments);\n };\n }\n });\n }\n} else if (!global.console) {\n const log = global.print || function consoleLoggingStub() {};\n global.console = {\n error: log,\n info: log,\n log: log,\n warn: log,\n trace: log,\n debug: log,\n table: log,\n };\n\n Object.defineProperty(console, '_isPolyfilled', {\n value: true,\n enumerable: false,\n });\n}\n","/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n * @flow strict\n * @polyfill\n */\n\nlet _inGuard = 0;\n\ntype ErrorHandler = (error: mixed, isFatal: boolean) => void;\ntype Fn = (...Args) => Return;\n\n/**\n * This is the error handler that is called when we encounter an exception\n * when loading a module. This will report any errors encountered before\n * ExceptionsManager is configured.\n */\nlet _globalHandler: ErrorHandler = function onError(\n e: mixed,\n isFatal: boolean,\n) {\n throw e;\n};\n\n/**\n * The particular require runtime that we are using looks for a global\n * `ErrorUtils` object and if it exists, then it requires modules with the\n * error handler specified via ErrorUtils.setGlobalHandler by calling the\n * require function with applyWithGuard. Since the require module is loaded\n * before any of the modules, this ErrorUtils must be defined (and the handler\n * set) globally before requiring anything.\n */\nconst ErrorUtils = {\n setGlobalHandler(fun: ErrorHandler): void {\n _globalHandler = fun;\n },\n getGlobalHandler(): ErrorHandler {\n return _globalHandler;\n },\n reportError(error: mixed): void {\n _globalHandler && _globalHandler(error, false);\n },\n reportFatalError(error: mixed): void {\n // NOTE: This has an untyped call site in Metro.\n _globalHandler && _globalHandler(error, true);\n },\n applyWithGuard, TOut>(\n fun: Fn,\n context?: ?mixed,\n args?: ?TArgs,\n // Unused, but some code synced from www sets it to null.\n unused_onError?: null,\n // Some callers pass a name here, which we ignore.\n unused_name?: ?string,\n ): ?TOut {\n try {\n _inGuard++;\n // $FlowFixMe: TODO T48204745 (1) apply(context, null) is fine. (2) array -> rest array should work\n return fun.apply(context, args);\n } catch (e) {\n ErrorUtils.reportError(e);\n } finally {\n _inGuard--;\n }\n return null;\n },\n applyWithGuardIfNeeded, TOut>(\n fun: Fn,\n context?: ?mixed,\n args?: ?TArgs,\n ): ?TOut {\n if (ErrorUtils.inGuard()) {\n // $FlowFixMe: TODO T48204745 (1) apply(context, null) is fine. (2) array -> rest array should work\n return fun.apply(context, args);\n } else {\n ErrorUtils.applyWithGuard(fun, context, args);\n }\n return null;\n },\n inGuard(): boolean {\n return !!_inGuard;\n },\n guard, TOut>(\n fun: Fn,\n name?: ?string,\n context?: ?mixed,\n ): ?(...TArgs) => ?TOut {\n // TODO: (moti) T48204753 Make sure this warning is never hit and remove it - types\n // should be sufficient.\n if (typeof fun !== 'function') {\n console.warn('A function must be passed to ErrorUtils.guard, got ', fun);\n return null;\n }\n const guardName = name ?? fun.name ?? '';\n function guarded(...args: TArgs): ?TOut {\n return ErrorUtils.applyWithGuard(\n fun,\n context ?? this,\n args,\n null,\n guardName,\n );\n }\n\n return guarded;\n },\n};\n\nglobal.ErrorUtils = ErrorUtils;\n\nexport type ErrorUtilsT = typeof ErrorUtils;\n","/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @format\n * @polyfill\n * @nolint\n */\n\n(function() {\n 'use strict';\n\n const hasOwnProperty = Object.prototype.hasOwnProperty;\n\n /**\n * Returns an array of the given object's own enumerable entries.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries\n */\n if (typeof Object.entries !== 'function') {\n Object.entries = function(object) {\n // `null` and `undefined` values are not allowed.\n if (object == null) {\n throw new TypeError('Object.entries called on non-object');\n }\n\n const entries = [];\n for (const key in object) {\n if (hasOwnProperty.call(object, key)) {\n entries.push([key, object[key]]);\n }\n }\n return entries;\n };\n }\n\n /**\n * Returns an array of the given object's own enumerable entries.\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values\n */\n if (typeof Object.values !== 'function') {\n Object.values = function(object) {\n // `null` and `undefined` values are not allowed.\n if (object == null) {\n throw new TypeError('Object.values called on non-object');\n }\n\n const values = [];\n for (const key in object) {\n if (hasOwnProperty.call(object, key)) {\n values.push(object[key]);\n }\n }\n return values;\n };\n }\n})();\n","import { foo } from \"./module.js\"\n\nfoo();\n","export function foo() {\n throw new Error(\"lets throw!\");\n}\n"],"names":["__DEV__","Object","metroRequire","metroImportDefault","metroImportAll","unpackModuleId","modules","EMPTY","createHotReloadingObject","verboseNamesToModuleIds","global","console","initializingModuleIds","module","guardedLoadModule","Error","exports","hasOwnProperty","inGuard","loadModuleImplementation","ID_MASK_SHIFT","moduleId","LOCAL_ID_MASK","value","moduleDefinersBySegmentID","unknownModuleError","RefreshRuntime","registerExportsForReactRefresh","moduleThrewError","hot","Set","pendingModuleIDs","isReactRefreshBoundary","performFullRefresh","runUpdatedModule","updatedID","shouldInvalidateReactRefreshBoundary","reactRefreshTimeout","setTimeout","Refresh","window","hasExports","getRefreshBoundarySignature","moduleID","LOG_LEVELS","Array","level","INSPECTOR_LEVELS","INSPECTOR_FRAMES_TO_SKIP","groupStack","groupFormat","inspect","element","OBJECT_COLUMN_NAME","rows","columnWidths","stringRows","space","repeat","cell","Math","msg","GROUP_OPEN","GROUP_PAD","GROUP_CLOSE","stylizeNoColor","formatValue","hash","formatPrimitive","arrayToHash","isError","isFunction","isRegExp","isDate","isArray","RegExp","Date","formatError","formatArray","reduceToSingleString","braces","formatProperty","ctx","recurseTimes","visibleKeys","array","isUndefined","isString","isNumber","isBoolean","isNull","JSON","String","output","name","base","numLinesEst","prev","arg","isObject","objectToString","e","originalConsole","methodName","reactNativeMethod","_globalHandler","_inGuard","ErrorUtils","fun","context","guardName","TypeError"],"mappings":"A,uB,K,K,M,K,I,I,Q,I,E,Q,M,K,G,E,M,K,K,K,G,E,M,K,K,K,K,K,M,M,K,O,I,K,G,I,K,M,I,M,E,M,E,M,O,K,K,G,I,K,G,I,K,M,I,M,E,M,E,M,K,K,K,G,I,K,G,I,K,G,I,M,E,M,E,M,K,K,K,G,I,K,G,I,K,G,I,M,E,M,E,M,K,K,M,O,gB,I,M,Q,Q,I,M,K,E,O,I,K,K,I,K,I,K,I,K,I,K,I,K,I,K,I,K,IAaA,M,KACA,MACA,M,KACA,MACmB,IAAR,IAGG,EAAH,IACE,EACU,KAAP,MAEZA,KAAJ,GACwB,KAAtB,MAEsB,KAAtB,MAWEA,KAAJ,GACgCC,MAAA,OAAA,KAAH,IACC,IAAH,IAgH3BC,IAA6BC,IAA7B,MAuCAD,IAAyBE,IAAzB,QACW,OAqBQ,MACG,GAAA,IAAH,IAWnBF,IAA8BG,IAA9B,MAMAH,I,KAAA,MACkC,IAAH,IAyJ3BF,KAAJ,wDACEE,IAAwB,EACV,KADU,IAEZ,KAFY,IAAxB,MAKAA,IAA0B,KAA1B,MAI+B,KAAH,MAgBL,IA2ME,KAAH,IAyEK,KAAH,IAoBK,KAAH,IAqCiB,KAAH,IAqBN,KAAH,IA6BM,KAAH,IA7XL,KAoZ7B,M,EAnxBe,EACLD,MAAA,OAAA,KAAH,GAAA,IAIP,EAQgD,aAC5CK,GAAAA,IAAO,MAAX,IAgBY,EAAA,IAAA,MAAA,IAIGC,IAJH,IAKOA,IALP,IAAA,IAOI,EACH,EADG,IAPJ,IAWZD,IAAA,MAEIN,KAAJ,GAEYQ,IAAwB,IAAlC,SAI6B,IAE7B,GACE,MACAC,IAAA,IAGL,IAzCOT,KAAJ,MAGuC,IAGrC,GACEU,IAAA,oBAAA,IAKJ,EA+B4B,KAC1BV,QAAJ,GAAe,UAAf,IAEaS,GAAAA,IAAuB,MAElC,OAGEE,MAAA,SACE,QAAA,QAAA,IADF,QASAX,KAAJ,MAC4BY,GAAAA,IAAA,KAAA,WAI1B,IACgBA,IAAA,KAAA,KAAA,OAEP,KAFO,KAId,OAAgB,IAAhB,KACAD,MAAA,KACoB,SAAA,SAAlB,QAAA,QAAA,QAAA,IADF,KAQWL,GAAAA,IAAO,IACfO,GAAgB,KAAhBA,GAEHC,MAAiB,MAFdD,EACG,KAAN,KADJ,EA/BcE,UAAJ,IAAA,KAAA,QAAA,OAAA,IAAA,IAAN,EAmBS,OAAKT,GAAAA,IAAO,IAAPA,GAAcA,IAAO,IAAP,KAAnB,EAiBuB,KAChCN,QAAJ,GAAe,UAAf,IAEaS,GAAAA,IAAuB,IAMlCH,GAAAA,IAAO,IADT,GAEEA,IAAO,IAAP,KAAoDC,IAFtD,IAOgBL,MAAY,QAE1Bc,GAAkB,QAAlBA,GAAuC,KAEjCV,IAAO,IAAP,MAAR,EAPSA,IAAO,IAAP,KAAP,EAY8B,KAC5BN,QAAJ,GAAe,UAAf,IAEaS,GAAAA,IAAuB,IAMlCH,GAAAA,IAAO,IADT,GAEEA,IAAO,IAAP,KAAgDC,IAFlD,IAOgBL,MAAY,KAG5B,GAAsB,QAAtB,GAGgB,EAEd,GACE,GAAA,QAAA,SAAA,GACMe,IAAA,KAAA,MAAJ,GAC4B,IAA1B,IADF,EAMJ,SAGMX,IAAO,IAAP,MAAR,EAtBSA,IAAO,IAAP,KAAP,EA4ByC,UACtCY,GAAAA,IAAL,GAAgBR,IAAM,KAAtB,KACS,IAISS,IAAwB,MACvC,EAAC,EAEAT,IAAM,KAAN,KAAA,KACD,EAEM,IACP,EAEOS,IAAwB,MAA/B,EAO8B,GACDC,GAAAA,IAAbC,IACSC,IAAXD,IACT,EAAA,IAAA,IAAP,EAQ2B,GACd,KAAcD,GAAAA,IAAnBG,IAAyC,KAAzCA,IAAR,EAOAC,GAAAA,UAAA,MACD,EAEmD,wCAClD,GAAeA,GAAAA,IAAyB,OAAxC,IAC0BnB,IAAc,KACT,KACF,KAEXmB,IAAyB,MAEzC,IACS,KACElB,IAAO,IAIEI,GAAAA,IAAM,QAE5B,GAAA,GAC2BL,IAAc,KACT,KACF,KAEf,MACJC,IAAO,IANlB,GASA,GACQmB,IAAkB,KAAxB,KAGQ,KAAV,QAQIzB,KAAJ,GACiBE,IAAY,KACH,KAF1B,KAOA,MAEmB,KACM,KAErBF,KAAJ,GAAA,EACEY,IAAA,KAAA,KAIIZ,KAAJ,MAEE,KAAqCa,GAAM,QAANA,MAAAA,OAAjB,IAApB,KAFF,GAK2B,KAEvBb,KAAJ,qCAC2B,KAAzB,MACqBU,IAAM,KACA,UAE3B,oCACsB,IAEpBA,IAAsB,KAAtB,MAKEgB,IAAc,KADhB,MAPF,GAYF,SAKEhB,IACAR,IACAC,IACAC,IAEY,aANP,IAUFJ,KAAL,MAEE,MACA,MAGEA,KAAJ,MAEE,KAAA,SAEA,IACE2B,UAAoD,KAAtB,OAIf,KAQf3B,KAAJ,GACMY,IAAA,KAAA,IAAJ,IAMAF,OAAA,SACA,MAhBF,EAUcK,MAAJ,KAAA,WAAA,IAAA,IAAN,EATJ,KACA,MACA,QACA,MACM,KAAN,MACA,EACQ,EACJf,KAAJ,GACMY,IAAA,KAAA,IAAJ,IAMAF,IAAA,MACA,MAEH,EAReK,MAAJ,KAAA,WAAA,IAAA,IAAN,EAvFEa,IAAiC,KAAjB,MAAtB,EAwCMF,GAAAA,IAAA,KAA8BL,QAAAA,OAAAA,OAA9B,QACD,EAyDuB,OAChB,QAAA,MAEVrB,QAAJ,OACS,IAKFe,QAAK,KAAZ,EAGmC,KACdf,KAAAA,GAAWM,GAAAA,IAAO,IAAlBN,GAA0BM,GAAAA,IAAO,IAAP,KAA1BN,MACde,UACL,QAAA,OAAA,MADU,KAAZ,EAnW4B,EAAE,EAER,EAAM,KAAN,EAAU,GAAA,EAwWZ,EAAE,EACJ,EAAE,EAIXT,GAAAA,IAAP,EAGwC,EAC5B,UAIF,KAJE,IAQD,KARC,IAAH,IAYT,EAPIuB,GAAAA,MAAA,MACAA,OAAA,QACD,EAECA,GAAAA,OAAA,QACD,EAYH,uBACYvB,GAAAA,IAAO,IAEnB,GACE,GAKMmB,IAAkB,KAAxB,EAHE,EAMI,KAAR,GAAyB,KAAzB,GAGE,MACA,MACA,EAGcvB,IAAY,KACH,IAAA,IACA,MACC4B,MAAJ,KAAA,OAAA,IAAA,IACSA,MAAJ,KAAA,OAAA,IAAA,IAaJ,KAAvB,yBACoBC,IAAA,KAAA,IAEd,KAAA,cAAJ,MAIA,KAAA,KAGsBzB,IAAO,IAE7B,IACkC,KAEhC,OAM0B,QAE1B,MAAA,IAEqB0B,IAEJ,KAAb,KAFuC,SAKzC,GAEE,KAAA,OAFF,MAMF,GAOmC,IAExB,KAAb,IAQA,KAAA,KACA,KAAkB,KAAlB,iBAtDF,EAgDIC,IAAkB,IAClB,EAZE,KAAA,iBACA,EAtBUlB,MAAJ,KAAA,WAAA,IAAA,IAAN,EAhBCgB,IAAgB,cAAvB,OA0DA,KAAA,IAEoC,uBAApC,OAEoC,IAE9B,KAAA,oBAAJ,MAIA,KAAA,KACYzB,IAAO,IAEnB,OAIuB,KAAH,KACH4B,IAEfC,MAAAA,MAAAA,EACAA,MAH+B,OAKV,KAAH,KAEpB,MAMI,KAAA,6BAAJ,MAG+BH,IAAsB,MAAvB,GAUNI,IAAoC,OAM1D,2BAAA,MAIuC,IAExB,KAAb,OAM6B,8BAA7B,OAC4B,IACR9B,IAAO,IAEzB,IAIwB0B,IAEb,KAAT,KAF4C,MAK9C,GAKEC,IAAkB,IAClB,EAJA,KAAA,KACA,KAAA,KAhBmC,IAAV,6BAA7B,MAKclB,MAAJ,KAAA,WAAA,IAAA,IAAN,EATFkB,IAAkB,IAClB,EA/BJ,EAdUlB,MAAJ,KAAA,WAAA,IAAA,IAAN,EAZ0C,IAAV,oBAApC,OAsFA,UAGMsB,IAAJ,cACwBC,MAAW,QAAD,MAAb,IAOxB,EAvGiCP,GAAAA,IAAA,QAAA,KAAJ,EAiGH,KAAA,IAEnBQ,GAAAA,IAAA,KAAA,MACD,EAKuD,aAChDjC,GAAAA,IAAO,MAEnB,OAIe,QAEf,KACYS,MAAJ,KAAA,WAAA,IAAA,IAAN,KAGK,KAAP,GACE,GACE,KAAA,IACD,EAAC,IACAJ,MAAA,SAAA,QAAA,IAAA,MAOJ,GACE,MAGF,GACE,MADF,EAIA,MACA,MACkBJ,IAAlB,MACsBA,IAAtB,MACA,MACuB,KAAH,KACjB,KAAwB,EAA3B,SACA,MACA,MACA,MACAL,IAAY,KAEL,KAAP,MAeO,KAAP,GACE,GACE,KAAA,IACD,EAAC,IACAS,MAAA,SAAA,QAAA,IAAA,MAOJ,EAnBE,QACA,MACA,MACG,KAAH,MAEA,IApDUI,MAAJ,KAAA,WAAA,IAAA,IAAN,EAqE6B,EAG7B,KAAA,OADF,IAEEyB,MAAM,OAFR,IAGSA,MAAM,KAAN,KAAP,OAHF,IAQkBtC,GAAAA,IAAY,OAE5B,IAGES,MAAA,SAAA,KAHF,EACE,KAAA,IADF,EALA6B,MAAM,KAAN,KAAA,IALF,EAgBD,EAE6D,gBACxD,KAAA,KAAJ,QAIA,OAA6B,OAA7B,OAQA,GAAA,UAAA,iBAAA,SAAA,QAGE,IAIavC,MAAA,KAAA,MAEb,GAAgB,KAAhB,GAKiC,IAE5B,KAAA,aAAL,UAAA,EALE,EAUGwC,MAAP,EA3BE,EALA,EAuCC,MACmBC,GAAAA,SAA2B,MAC3BA,OAA2B,MAEhC,KAAyB,KAA1C,IAIiC,OAAjC,IACmB,IAAqB,IAAtC,IADyC,IAAV,KAAjC,MAMA,IAJI,IALF,EAY0D,YAC1C,IAClB,KAAe,KAAA,KAAf,OAEA,IAA6B,OAA7B,IAMA,GAAA,EAAA,QAAA,SAAA,GACE,IAIazC,MAAA,KAAA,MAEb,GAAgB,QAAhB,GAIiC,IACjC,KAAA,KACA,KAAe,KAAA,KAAf,QAbF,EAgBA,EAnBE,EAsBuE,eACzE,SAAgC0C,IAAhC,QAEA,IAA6B,OAA7B,IAMA,GAAA,QAAA,SAAA,GACe1C,MAAA,KAAA,MAEb,GAAgB,KAAhB,GAKiC,IAClB0C,IAAAA,IACf,KAAA,MAVF,IAYD,IAfG,E,6B,K,K,KC/wBW,KAAD,IA8WG,UAMM,IACE,SAA3B,IAC2B,SAA3B,IAC2B,SAA3B,IAC2B,SAA3B,MAIiC3C,KAAAA,MA8Gd,IAAH,IA4BN,KACsB,KADhC,MAqEO,MACa,KAANU,GAAgB,KACX,EAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAA,IAAjB,MAUAT,MAAA,KAAsBU,UAA0B,UAAhD,iHA9EIX,KAAJ,GAAA,GACqBC,MAAA,SAAA,MACnB,GACEA,MAAA,SAAA,OADF,4CAKe,EACuB,KAAX,KADZ,IAEY2C,IAAU,KAAX,KAFX,IAGWA,IAAU,KAAX,KAHV,IAIYA,IAAU,KAAX,KAJX,IAKaA,IAAU,KAAX,KALZ,IAMaA,IAAU,KAAX,KANZ,I,KAAA,I,KAAA,I,KAAA,I,KAAA,I,KAAA,IAAjB,MAcA3C,MAAA,KAAsBU,UAA0B,UAAhD,OAQIX,SAAJ,KAAA,KACEC,MAAA,KAAYU,MAAZ,KAAA,KAA6B,KAA7B,KAqBA,QAAA,KAOU,KAPV,K,EA9LiC,KAAA,IAC5B,KAAP,EAAkB,IAEH,MAAb,MAA8C,IAAhB,OAA9B,MAGQkC,MAAK,KAAL,KAAA,KAAA,EAAA,KACa,KADb,MAAA,SAAA,KAHR,EACiB,IASFC,GAAAA,IACX,UAAA,gBAAJ,IAAmDF,GAAAA,IAAU,QAA7D,IAIaA,IAAU,KAEnBlC,GAAAA,IAAM,KAAV,GACEA,IAAA,KACEqC,IAAgB,IAEhB,IAAA,KAAA,KAAA,EAAA,KACAC,aAJF,IAOEC,IAAU,QAAd,GACQC,QAAW,MAEnBxC,IAAA,KAAA,MACD,EAxBcyC,GAAAA,IAAa,KAAA,SAAN,MAAd,EA2BkB,KAAA,MACnBN,MAAA,KAAkBA,WAAK,OAAvB,MAAA,KAAgC,KAAhC,KAAP,EACSO,GAAAA,IAAP,EAIgC,YAAA,OAE7BP,MAAA,KAAA,QAAL,GAES,IACP,GAGQQ,MAHR,WAAA,SAAA,GACM,KAAA,KAAJ,GACgB,IACVA,IAAJ,IACA,KAAA,KAHF,EAOI,KAAR,mBAKcpD,MAAA,KAAYqD,IAAI,IAAhB,KAAA,KAAA,IACG,IAAH,IACK,IAAH,IAIhB,KAAgB,KAAhB,KAqBiBC,IAAA,KAAiB,KAAjB,SAGS,MACN,KACR,IAAA,IAAA,IAEQD,IAAI,OAAxB,IACE,KAAmBE,IAAU,IAAX,KAAlB,KADgC,IAAdF,IAAI,KAAxB,IAQA5C,GAAAA,IAAA,KAAgC,SAAA,KAAP,IAAyBkC,IAAU,KAA5D,MACD,EA/CGlC,GAAAA,IAAA,KAA6BkC,IAAU,SAAvC,MACA,EAqB2B,UACf,OAAQ,KAAR,KAIJa,MACD,SAAWA,IAAAA,IAAX,KAAP,EALsC,GAClBC,GAAAA,IAAYH,GAAAA,OAAY,IAAU,KAAtBA,UAAN,MAAN,SAAA,KACXI,IAAP,EAf2B,eAC7BJ,GAAAA,IAAmB,KAAnB,IACoBD,IAAI,OAAxB,IACiBA,IAAI,IAAJ,IAAAA,MAAD,KAAA,IACdE,IAA0B,IAAVA,GAAiB,IAAjC,IACAA,IAAU,IAAV,IACAD,IAAkBK,MAAA,KAASL,IAAY,IAAY,KAAjC,MAAlB,IAJgC,IAAdD,IAAI,KAAxB,MAMD,EAcQI,GAAAA,aAAM,MAAN,SAAA,KAAP,EAuB8B,OAEzBT,GAAAA,IAAA,KAAA,QAAAA,IAAsCY,MAAAA,IAAtCZ,IAAAA,IAAP,EAIAvC,GAAAA,IAAA,KAAyBwC,IAAYY,SAAD,MAAqBlB,IAAU,KAAnE,MACAK,IAAA,KAAgBc,IAAhB,KACD,EAGCrD,GAAAA,IAAA,KAAyBwC,IAAYc,SAAD,MAAsBpB,IAAU,KAApE,MACAK,IAAA,KAAgBc,IAAhB,KACD,EAGCd,GAAAA,IAAA,KAAA,IACAvC,IAAA,KAAyBwC,IAAYc,MAAD,KAAepB,IAAU,KAA7D,MACD,EAEiD,GAChD,GACElC,GAAAA,IAAA,YAAyB,IAA8BkC,IAAU,KAAjE,MADF,EAGD,EApgB2B,EAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KA0W1B,EAjVY,EACF,IADE,MAAA,IAGCqB,GAAAA,IAHD,IAKHC,OAA0B,UAAf,OAAlB,EAGsC,GACtC,EAG0B,KACf,EAAH,IAER,KAAc,KAAd,KAIA,EAHEC,GAAAA,SAAA,MACD,EAK4C,iBAC1C,KAAH,MAAA,IAAA,MACO,QAAP,OAOgBC,GAAAA,IAAe,MAC/B,QAKWnE,MAAA,KAAA,KACOoE,IAAW,KAK3BC,IAAO,KADT,GAEG,SAAA,OAFH,OAEmC,SAAA,KAFnC,OAQQ,OAAR,IACMC,IAAU,KAAd,MAIIC,IAAQ,KAAZ,MAGIC,IAAM,KAAV,MAGIH,IAAO,KAAX,MAOS,QAGPI,IAAO,OAAX,GAEW,UAIPH,IAAU,QAAd,GACe,QAALhD,GAAyB,SAAZ,IAAbA,IACD,QAAA,IAILiD,IAAQ,KAAZ,GACeG,MAAM,KAAN,KAAA,KAAA,SAAN,IAILF,IAAM,KAAV,GACeG,MAAI,KAAJ,KAAA,KAAA,SAAN,IAILN,IAAO,KAAX,GACeO,IAAW,SAAjB,IAGD,KAAR,IAAA,MAAyC,KAAzC,OAIA,OAQG,KAAH,KAAA,KAGA,uBAGW,KAAS,KAAT,KAHX,EACWC,qBAAW,wBAcnB,KAAH,KAAA,IAEOC,IAAoB,OAA3B,EA3BMP,IAAQ,KACH,KADT,WAGS,MAAP,EAFmBG,MAAM,KAAN,KAAA,KAAA,SAAZ,MAAP,EALW,IAANK,IAAyB,IAAzBA,IAAP,EApCSH,IAAW,KAAlB,EAHO,KAAYD,MAAI,KAAJ,KAAA,KAAA,SAAZ,MAAP,EAHO,KAAYD,MAAM,KAAN,KAAA,KAAA,SAAZ,MAAP,EAJgB,KAALpD,GAAyB,SAAZ,IACjB,SAAY,QAAA,QAAZ,MAAP,EAPKsD,IAAW,KAAlB,EAbA,EAPK,SADL,QAAA,IAAA,EA2FSI,GAAAA,IACLC,GAAAA,IACA3D,IACA4D,IACAC,IAEAC,SANmB,IAArB,EAgB+B,MAC/BC,GAAAA,MAAW,KAAf,MACIC,IAAQ,KAAZ,GAUIC,IAAQ,KAAZ,GACIC,IAAS,KAAb,GAEIC,IAAM,KAAV,GACD,EAD2B,SAAA,MAAP,EAFU,YAAA,MAAP,EADM,YAAA,MAAP,IAPjBC,MAAA,KAAA,KAAA,KACW,kBADX,MAAA,KAEW,kBAFX,MAAA,KAGW,kBAHX,UADA,IAMK,KANL,QAMK,MAAP,EAT6B,SAAA,MAAP,EAiBE,EACb5E,MAAK,KAAL,KAAA,QAAA,SAAN,QAAA,IAAP,EAGgE,4BACnD,IACY,KAGnBkE,KAHN,IACMhE,IAAsB2E,MAAM,KAAd,MAChB,QADF,GAYE,KAZF,EAEIX,IAKEW,MAAM,qBALM,IADhB,KAFqC,IAAzC,wBAgBA,KAAa,KAAb,KAOOC,IAAP,EAP2B,GACpB,KAAU,cAAV,KAAL,GACEA,GAAAA,IAAA,KACEZ,GAAAA,IAAeC,IAAK3D,IAAO4D,IAAcC,WAA3B,IADhB,KADF,EAKD,EAIwE,qBAElEnF,MAAA,KAAA,MAAAA,GAA+C,EAAa,IAAb,OAC9C,KACE,KADV,KAOE,GACQ,aAAA,MADR,EALQ,KADR,WAGQ,MAHR,UACQ,MASLgB,GAAAA,OAAc,QAAnB,OACS,QAAA,IAET,MACS,KAAH,KAAqB,KAArB,OAAJ,IA2BQ,aAAA,MA3BR,KACMyE,IAAM,KACFxB,IAAqB,KAD7B,MAGqCiB,IAAlB,OAHnB,IACmB,OAIf,SAAA,cAAJ,IAEU,KADR,GAWI,KAAA,KAEO,KAFP,KAAA,KAAA,KADA,IAVJ,EACQ,KAAA,KAEC,KAFD,KAAA,KAAA,KAAA,QAAA,KAsBVG,IAAW,KAAf,MACE,GAAa,KAAU,cAAV,KAAb,MAGOK,MAAA,QAAA,KACH,KAAW,cAAX,KAAJ,GAIS,KACI,kBADJ,MAAA,KAEI,kBAFJ,MAAA,KAGI,kBAHJ,MAIA,SAAA,MART,EACS,KAAmB,QAAJG,OAAf,MACA,SAAA,MAFT,IAYKA,IAAAA,IAAP,EAfI,EAtB0B,OACX,IAAP,EASoB,OACX,IAAP,EA6BoC,iBACnC,IACF,KAAc,KAAd,SAMb,IAWa,IAANd,IAAyB,SAAA,SAAzBA,IAAAA,OAAyD,IAAzDA,IAAAA,IAAP,EATU,IACLe,QAAmBA,IADpBf,IAGA,SAAA,SAHAA,IAAAA,OAKM,IALNA,IAAAA,IADF,EAP6C,GAC7CgB,GAAAA,OAAW,IAAA,IACP,SAAA,OAAJ,IAA4BA,IAAW,IAAA,IACzB,KAAY,kBAAZ,MAAA,QAAPC,IAAAA,IAAP,EAmBiB,EACZpD,MAAA,QAAA,KAAP,EAGsB,GACf,OAAA,IAAP,EAGmB,KACZqD,IAAP,EAOqB,GACd,OAAA,IAAP,EAGqB,GACd,OAAA,IAAP,EAOwB,KACjBA,IAAP,EAGoB,GACbC,GAAAA,MAAQ,KAARA,GAAgBC,IAAc,SAAdA,IAAvB,EAGqB,GACd,OAAA,IAAA,KAA2BF,IAAlC,EAGiB,GACVC,GAAAA,MAAQ,KAARA,GAAeC,IAAc,SAAdA,IAAtB,EAGkB,GAEhBD,GAAAA,MAAQ,KAARA,GACCC,IAAc,SAAdA,IAAAA,KAAuDrF,MAAbsF,IAA1CD,GAFH,EAMuB,GAChB,OAAA,IAAP,EAGyB,EAClBnG,MAAM,KAAN,KAAA,QAAA,KAAP,EAGiC,EAC1BA,MAAM,KAAN,KAAA,WAAA,MAAP,EAgM2C,SACfU,MAAO,IAC7B2F,GAAAA,IAAe,YAAnB,KACE3F,MAAsB,KAAtB,IAaH,EAboC,IAG3B4F,GAAAA,QAAJ,IAKED,GAAAA,IAAgBC,IAAD,IAAf,KAAAD,IAAA,EAAA,GAAA,MALF,IACgB,IAAd,GACEA,GAAAA,IAAe,KAAf,KAAAA,IAAA,EAAA,GAAA,MAKJE,IAAA,OAAwB7F,MAAxB,EAAA,MACD,EAcmB,OACX2F,GAAAA,IAAe,IAAtB,OAAJ,gBACE3F,MAAsB,KAAtB,IAIH,EAJoC,IAC/B2F,GAAAA,IAAgBC,GAAAA,IAAD,IAAf,KAAAD,IAAA,EAAA,MACD,EAKmD,EAAE,E,ICllBlD,IAUuB,KAAH,IAeb,EAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAA,KAAA,IAAH,OA4EhB,Q,EAxFE,GACA,EAagB,MAAA,MACf,EAEQG,GAAAA,IAAP,EAGAA,GAAAA,IAAAA,GAAkBA,WAAc,MAAhCA,EACD,EAGCA,GAAAA,IAAAA,GAAkBA,WAAc,MAAhCA,EACD,EASQ,GAELC,GAAAA,OAAQ,IAAA,IAED,WAAA,MAIPA,IAAQ,IAAA,IAJR,EACA,EACAC,GAAAA,IAAA,KAAA,KAEAD,OAAQ,IAAA,MAEV,EAHU,EACRA,GAAAA,OAAQ,IAAA,IACT,EAOM,SACHC,GAAAA,IAAA,KAAA,IAAJ,GAIEA,IAAA,KAAA,SAEF,EAJS,KAAA,MAAP,EAOOD,GAAAA,IAAD,GAAD,GAAP,EAMsB,YAGlB,OAAJ,MAIkBZ,IAAW,KAAd,OAAA,WAAA,IAPO,KAkBtB,IAdEnF,MAAA,SAAA,QACA,EAGsC,OAAA,KAAA,MAAA,KAAA,UAAA,IAAA,MAAA,IAAA,IAAA,IAAA,IAAA,IAC/BgG,GAAAA,IAAA,KACLC,GAAAA,IACAC,MAAAA,IAAAA,IAGAC,kBALK,IAAP,E,ECxFL,OAAD,I,EAAY,MAGa7G,MAAM,KAAN,KAMZA,MAAM,KAAb,OAAJ,cACEA,MAAiB,KAAjB,MAoBSA,MAAM,KAAb,GAAJ,IACEA,MAAgB,KAAhB,MAeH,EApCqC,KAEhC,IAIgB,IAChB,GACMgB,GADN,QAAA,SAAA,GACMA,IAAA,KAAA,MAAJ,GACE,KAAa,IAAA,IAAY,IAAZ,IAAb,KADF,EAIF,IATY8F,MAAJ,KAAA,WAAA,IAAA,IAAN,EAkB6B,KAE/B,IAIe,IACf,GACM9F,GADN,QAAA,SAAA,GACMA,IAAA,KAAA,MAAJ,GACE,KAAkB,IAAlB,KADF,EAIF,IATY8F,MAAJ,KAAA,WAAA,IAAA,IAAN,E,KC7CR,aAAA,MAEA,KAAA,I,E,K,M,K,I,Q,S,K,Q,ECFsB,EACRhG,MAAJ,KAAA,WAAA,IAAA,IAAN","x_facebook_sources":[[{"names":["","global.$RefreshReg$","global.$RefreshSig$","","clear","define","metroRequire","initializingModuleIds.slice.map$argument_0","metroImportDefault","metroImportAll","guardedLoadModule","unpackModuleId","packModuleId","registerSegment","loadModuleImplementation","unknownModuleError","moduleThrewError","metroRequire.Systrace.beginEvent","metroRequire.Systrace.endEvent","metroRequire.getModules","createHotReloadingObject","hot.accept","hot.dispose","metroHotUpdateModule","parentIDs.forEach$argument_0","setTimeout$argument_0","runUpdatedModule","performFullRefresh","isReactRefreshBoundary","shouldInvalidateReactRefreshBoundary","getRefreshBoundarySignature","registerExportsForReactRefresh"],"mappings":"AAA;wBCyB,QD;wBEE,MC,YH;AIG;CJM;AKO;CL2C;AME;aCyB,2DD;CNe;AQE;CRoB;ASI;CTmC;AUK;CViB;AWK;CXO;AYI;CZE;AaK;CbE;AcE;8BbqE;SaE;CduD;AeE;CfU;AgBE;ChBK;gBiBI,QjB;ckBC,QlB;4BmBG;GnBE;iCoBE;cCK;ODG;eEC;OFE;GpBG;+BuBI;wBCgG,2CD;yCEgG;SFI;GvBG;2B0BE;G1BuE;6B2BE;G3BkB;+B4BE;G5BmC;6C6BE;G7BmB;oC8BE;G9B2B;uC+BE;G/BqB"}],[{"names":["","","inspect","stylizeNoColor","arrayToHash","array.forEach$argument_0","formatValue","keys.map$argument_0","formatPrimitive","formatError","formatArray","keys.forEach$argument_0","formatProperty","str.split.map$argument_0","reduceToSingleString","output.reduce$argument_0","isArray","isBoolean","isNull","isNullOrUndefined","isNumber","isString","isSymbol","isUndefined","isRegExp","isObject","isDate","isError","isFunction","objectToString","hasOwnProperty","getNativeLogFunction","Array.prototype.map.call$argument_1","repeat","Array.apply.map$argument_0","consoleTablePolyfill","columns.forEach$argument_0","joinRow","row.map$argument_0","columnWidths.map$argument_0","groupFormat","consoleGroupPolyfill","consoleGroupCollapsedPolyfill","consoleGroupEndPolyfill","consoleAssertPolyfill","Object.keys.forEach$argument_0","methodName","forEach$argument_0","consoleLoggingStub"],"mappings":"AAA;iBCiB;ECwB;GDO;EEE;GFE;EGE;kBCG;KDE;GHG;EKE;wBC6F;ODS;GLM;EOE;GPgB;EQE;GRE;ESE;iBCkB;KDM;GTE;EWE;mBC4B;eDE;qBCQ;iBDE;GX0B;EaE;+BCE;KDI;Gbc;EeI;GfE;EgBE;GhBE;EiBE;GjBE;EkBE;GlBE;EmBE;GnBE;EoBE;GpBE;EqBE;GrBE;EsBE;GtBE;EuBE;GvBE;EwBE;GxBE;EyBE;GzBE;E0BE;G1BK;E2BE;G3BE;E4BE;G5BE;E6BE;G7BE;CDG;A+BmB;S9BC;yB+BM;S/BE;G8BuB;C/BC;AiCE;yCCC;GDE;CjCC;AmCE;kBCwB;GDQ;EEI;wBCC;KDG;GFG;oCIE;GJE;CnCc;AwCQ;CxCG;AyCE;CzCG;A0CE;C1CG;A2CE;C3CG;A4CE;C5CI;iC6CmC;8BCG;SDW;K7CE;c+CY;8BDE;SCE;K/CE;8BgDG,gChD"}],[{"names":["","onError","ErrorUtils.setGlobalHandler","ErrorUtils.getGlobalHandler","ErrorUtils.reportError","ErrorUtils.reportFatalError","ErrorUtils.applyWithGuard","ErrorUtils.applyWithGuardIfNeeded","ErrorUtils.inGuard","ErrorUtils.guard","guarded"],"mappings":"AAA;mCCqB;CDK;EEW;GFE;EGC;GHE;EIC;GJE;EKC;GLG;EMC;GNmB;EOC;GPY;EQC;GRE;ESC;ICY;KDQ;GTG"}],[{"names":["","","entries","values"],"mappings":"AAA;CCW;qBCU;KDa;oBEQ;KFa;CDE"}],[{"names":[""],"mappings":"AAA"}],[{"names":["","foo"],"mappings":"AAA,OC;CDE"}]]} \ No newline at end of file