Skip to content

Commit

Permalink
[Wallet] Upgrade react-navigation libraries (#5896)
Browse files Browse the repository at this point in the history
### Description

This seems to fix the top crash we are currently experiencing.
Thanks @cmcewen for smelling the right fix here. We should also start a PR for upgrading all the other react packages, but I wanted to do this one as a smaller PR to make sure it fixes it and doesn't introduce anything new.

TODO: fix the any types that are added by asking @jeanregisser 

### Other changes

Added a new e2e test for opening the app using a dappkit url, which is the common source of crashes.

### Tested

Manually by opening the app with a deep link. Committed the script used also.

### Related issues

- Fixes #5524 

### Backwards compatibility

Yes.
  • Loading branch information
etuleu authored Nov 19, 2020
1 parent f1ce5cf commit dbac500
Show file tree
Hide file tree
Showing 10 changed files with 109 additions and 84 deletions.
9 changes: 9 additions & 0 deletions packages/mobile/e2e/src/DeepLinkDappkit.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import dismissBanners from './utils/banners'
import RestoreAccountOnboarding from './usecases/RestoreAccountOnboarding'
import HandleDeepLinkDappkit from './usecases/HandleDeepLinkDappkit'

describe('Deep Link with account dappkit', () => {
beforeEach(dismissBanners)
describe('Onboarding', RestoreAccountOnboarding)
describe('HandleDeepLinkSend', HandleDeepLinkDappkit)
})
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
import dismissBanners from './utils/banners'
import HandleDeepLinkSend from './usecases/HandleDeepLinkSend'
import ResetAccount from './usecases/ResetAccount'
import RestoreAccountOnboarding from './usecases/RestoreAccountOnboarding'

describe('Deep link without account', () => {
describe('Deep link without account send', () => {
beforeEach(dismissBanners)

// The behavior for this case is not really specified yet
Expand All @@ -16,11 +14,3 @@ describe('Deep link without account', () => {

describe('HandleDeepLinkSend', HandleDeepLinkSend)
})

//describe('Deep Link with account', () => {
// beforeEach(dismissBanners)

// describe('Onboarding', RestoreAccountOnboarding)
// describe('HandleDeepLinkSend', HandleDeepLinkSend)
// describe('Reset Account', ResetAccount)
//})
15 changes: 15 additions & 0 deletions packages/mobile/e2e/src/usecases/HandleDeepLinkDappkit.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
export default HandleDeepLinkDappkit = () => {
const DAPPKIT_URL =
'"celo://wallet/dappkit?type=sign_tx\\&requestId=beneficiaryclaim\\&callback=impactmarket%3A%2F%2F\\&dappName=impactmarket\\&txs=W3sidHhEYXRhIjoiMHg0ZTcxZDkyZCIsImVzdGltYXRlZEdhcyI6MTIxMTI3LCJmcm9tIjoiMHhhY2FGQjRGMWQ5RERGMTQwNWViZEJGZWM5NTlBNzI4MTk0QjAyMzhhIiwidG8iOiIweDc0ZTVDNDA1RURFNEUzN2U3ODBEQjk2NTI1NDE1MzhkZDhBNzlBN2QiLCJub25jZSI6MjYsImZlZUN1cnJlbmN5QWRkcmVzcyI6IjB4NzY1REU4MTY4NDU4NjFlNzVBMjVmQ0ExMjJiYjY4OThCOEIxMjgyYSIsInZhbHVlIjoiMCJ9XQ%3D%3D"'

it('Launch app with dappkit deep link', async () => {
await device.terminateApp()
await device.launchApp({ url: DAPPKIT_URL, newInstance: true })

// press Allow button on DappKitSignTxScreen
await element(by.id('DappkitAllow')).tap()

// Arrived at pin code enter screen
await expect(element(by.id('digit1'))).toBeVisible()
})
}
12 changes: 6 additions & 6 deletions packages/mobile/e2e/src/usecases/HandleDeepLinkSend.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
export default HandleDeepLinkSend = () => {
const url =
'"celo://wallet/pay?address=0x0b784e1cf121a2d9e914ae8bfe3090af0882f229&displayName=Crypto4BlackLives&e164PhoneNumber=%2B14046251530"'
const PAY_URL =
'"celo://wallet/pay?address=0x0b784e1cf121a2d9e914ae8bfe3090af0882f229\\&displayName=Crypto4BlackLives\\&e164PhoneNumber=%2B14046251530"'

it('Launch app cold with url', async () => {
await device.terminateApp()
await device.launchApp({ url, newInstance: true })
await device.launchApp({ url: PAY_URL, newInstance: true })
// Arrived at SendAmount screen
await expect(element(by.id('Review'))).toBeVisible()
})
Expand All @@ -20,20 +20,20 @@ export default HandleDeepLinkSend = () => {
} else {
await device.sendToHome()
}
await device.launchApp({ url, newInstance: false })
await device.launchApp({ url: PAY_URL, newInstance: false })
await expect(element(by.id('Review'))).toBeVisible()
})

// skip until we can have a firebase build on ci
it.skip('Send url while app is in foreground', async () => {
await device.openURL({ url })
await device.openURL({ url: PAY_URL })
await expect(element(by.id('Review'))).toBeVisible()
})

// skip until we can have a firebase build on ci
it.skip('Send url while app is in background, process running', async () => {
await device.sendToHome()
await device.launchApp({ url, newInstance: false })
await device.launchApp({ url: PAY_URL, newInstance: false })
await expect(element(by.id('Review'))).toBeVisible()
})
}
14 changes: 7 additions & 7 deletions packages/mobile/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,11 @@
"@react-native-firebase/functions": "^6.7.1",
"@react-native-firebase/messaging": "^6.7.1",
"@react-native-firebase/storage": "^6.7.1",
"@react-navigation/compat": "^5.2.1",
"@react-navigation/drawer": "^5.8.6",
"@react-navigation/material-top-tabs": "^5.2.14",
"@react-navigation/native": "^5.7.1",
"@react-navigation/stack": "^5.7.1",
"@react-navigation/compat": "^5.3.9",
"@react-navigation/drawer": "^5.11.3",
"@react-navigation/material-top-tabs": "^5.3.9",
"@react-navigation/native": "^5.8.9",
"@react-navigation/stack": "^5.12.6",
"@segment/analytics-react-native": "^1.3.2",
"@segment/analytics-react-native-firebase": "^1.3.2",
"@sentry/react-native": "^1.7.1",
Expand Down Expand Up @@ -153,7 +153,7 @@
},
"devDependencies": {
"@apollo/react-testing": "^3.1.3",
"@babel/plugin-proposal-decorators":"^7.12.1",
"@babel/plugin-proposal-decorators": "^7.12.1",
"@celo/flake-tracker": "0.0.1-dev",
"@celo/typescript": "0.0.1",
"@graphql-codegen/add": "^1.10.0",
Expand Down Expand Up @@ -248,4 +248,4 @@
}
}
}
}
}
1 change: 1 addition & 0 deletions packages/mobile/scripts/adb-dappkit.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
adb shell am start -a android.intent.action.VIEW -d "celo://wallet/dappkit?type=sign_tx\&requestId=beneficiaryclaim\&callback=impactmarket%3A%2F%2F\&dappName=impactmarket\&txs=W3sidHhEYXRhIjoiMHg0ZTcxZDkyZCIsImVzdGltYXRlZEdhcyI6MTIxMTI3LCJmcm9tIjoiMHhhY2FGQjRGMWQ5RERGMTQwNWViZEJGZWM5NTlBNzI4MTk0QjAyMzhhIiwidG8iOiIweDc0ZTVDNDA1RURFNEUzN2U3ODBEQjk2NTI1NDE1MzhkZDhBNzlBN2QiLCJub25jZSI6MjYsImZlZUN1cnJlbmN5QWRkcmVzcyI6IjB4NzY1REU4MTY4NDU4NjFlNzVBMjVmQ0ExMjJiYjY4OThCOEIxMjgyYSIsInZhbHVlIjoiMCJ9XQ%3D%3D"
1 change: 1 addition & 0 deletions packages/mobile/src/dappkit/DappKitSignTxScreen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ class DappKitSignTxScreen extends React.Component<Props> {
size={BtnSizes.MEDIUM}
text={t('allow')}
onPress={this.linkBack}
testID="DappkitAllow"
/>
</ScrollView>
</SafeAreaView>
Expand Down
3 changes: 2 additions & 1 deletion packages/mobile/src/navigator/DrawerNavigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
CommonActions,
DrawerActions,
DrawerNavigationState,
ParamListBase,
useLinkBuilder,
} from '@react-navigation/native'
import { TransitionPresets } from '@react-navigation/stack'
Expand Down Expand Up @@ -71,7 +72,7 @@ const TAG = 'NavigationService'
const Drawer = createDrawerNavigator()

type CustomDrawerItemListProps = Omit<DrawerContentOptions, 'contentContainerStyle' | 'style'> & {
state: DrawerNavigationState
state: DrawerNavigationState<ParamListBase>
navigation: DrawerNavigationHelpers
descriptors: DrawerDescriptorMap
protectedRoutes: string[]
Expand Down
2 changes: 1 addition & 1 deletion packages/mobile/src/navigator/Navigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ import VerificationLoadingScreen from 'src/verify/VerificationLoadingScreen'
const Stack = createStackNavigator<StackParamList>()
const RootStack = createStackNavigator<StackParamList>()

type NavigationOptions = StackScreenProps<StackParamList>
type NavigationOptions = StackScreenProps<StackParamList, keyof StackParamList>

export const modalScreenOptions = ({ route, navigation }: NavigationOptions) =>
Platform.select({
Expand Down
124 changes: 66 additions & 58 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -5602,60 +5602,60 @@
resolved "https://registry.yarnpkg.com/@react-native-firebase/storage/-/storage-6.7.1.tgz#fe5c99e8fac55529869ff502ecb775f87e9eca2a"
integrity sha512-NqiwgOaYIPlxUn2Ith/bJNBy4aV0MNAKmWLzRxnW7rczz6BxtLbKC46NVzlA3S2LKaE3Abbx74dFisiOhp9vBA==

"@react-navigation/compat@^5.2.1":
version "5.2.1"
resolved "https://registry.yarnpkg.com/@react-navigation/compat/-/compat-5.2.1.tgz#35da7b9a3cb3398ba60e51aa4b02f1e4d3b60e94"
integrity sha512-ppNJcupL0MouzO9zy/gVTDkedS+awK6swUD1+ObjOr0bMxu9A6LIZVmpFD1yI8NBRnK5eACMKchsktgE1Zf4yw==
"@react-navigation/compat@^5.3.9":
version "5.3.9"
resolved "https://registry.yarnpkg.com/@react-navigation/compat/-/compat-5.3.9.tgz#4523e0207a089df71cbc29b45e001ecda6200aa3"
integrity sha512-ZVidNiq8wXdHcQwUKLCnZwN9xTAIXf53zktnnU06Dc6rhx42lKU9kwvGuFZrWhc3ppl25iZncZ0ZNngE17S8EA==

"@react-navigation/core@^5.12.1":
version "5.12.1"
resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.12.1.tgz#46817ebf19ca9dc32559aaa70130c294deb3d7e0"
integrity sha512-/0IQ/MzsLHD1JthTPd1AwpIEWMejPksh0qAloynEwL+ILLZMq9jJF3b7T8rFxHVbsBuaM7lKOWUcULDvnOxksQ==
"@react-navigation/core@^5.14.3":
version "5.14.3"
resolved "https://registry.yarnpkg.com/@react-navigation/core/-/core-5.14.3.tgz#6bbbfe1fb90aa64068fdb69bbb6c55120b7b24f1"
integrity sha512-l4zCfIfPC4DYuDcluiisaWKg7GO5yAjBrIL0pzEw8bIBj+R6vnZnyG9AWgnwo5fl241DX+1sfgzGEUQgpIJNew==
dependencies:
"@react-navigation/routers" "^5.4.9"
"@react-navigation/routers" "^5.6.2"
escape-string-regexp "^4.0.0"
nanoid "^3.1.9"
query-string "^6.13.1"
nanoid "^3.1.15"
query-string "^6.13.6"
react-is "^16.13.0"
use-subscription "^1.4.0"

"@react-navigation/drawer@^5.8.6":
version "5.8.6"
resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-5.8.6.tgz#390f4dc267f833cc4f5f12ce535a916ad295561f"
integrity sha512-MuD/aIHQ3dNxB9dDzuW5B7X9e3o26I9bsjO0IB3I4MtwaQ3M4QqpBPCwWv3u35SQ7JMztnkc/bZ6WYRm5yrF4Q==
"@react-navigation/drawer@^5.11.3":
version "5.11.3"
resolved "https://registry.yarnpkg.com/@react-navigation/drawer/-/drawer-5.11.3.tgz#0bc3c57861a0e033fda3df558c95685facb2e196"
integrity sha512-Xuc4RVO6hBil1IGNWoHll7553V1A4/dL0p/SYOg0KPDlG+/ItdGXOga+yrVzYe987RNle2yfpvHInz/+RhOLOg==
dependencies:
color "^3.1.2"
react-native-iphone-x-helper "^1.2.1"
color "^3.1.3"
react-native-iphone-x-helper "^1.3.0"

"@react-navigation/material-top-tabs@^5.2.14":
version "5.2.14"
resolved "https://registry.yarnpkg.com/@react-navigation/material-top-tabs/-/material-top-tabs-5.2.14.tgz#7842880f6c76e8237dd475e3315f448efd0e058c"
integrity sha512-N0jI5YOamsi8a5r0bmyKl/d7hWnStCASz8u1wbTFXjwUMUchPi2KGkaR36cxIsm3YXBkF7X/JIVHJE+DlEn78Q==
"@react-navigation/material-top-tabs@^5.3.9":
version "5.3.9"
resolved "https://registry.yarnpkg.com/@react-navigation/material-top-tabs/-/material-top-tabs-5.3.9.tgz#8a43c3213313abdc896bf5d59eb447ec67a66593"
integrity sha512-y7Ny5Emjuo5NsmiXX5mkAn1j160dzYocV+r8H/tiQUfR9cTLRu22jym7eLGpeKM0yzpeT2o2D+kRclom4oxMjg==
dependencies:
color "^3.1.2"
color "^3.1.3"

"@react-navigation/native@^5.7.1":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.7.1.tgz#5a59be6f7c1bf4cdf5e16625bf59688aeab808f8"
integrity sha512-dhxH+CGC8YoVrjm05/gU/GeLfNpJGQO/KWyzSkEsns+nzxJ/jFZWG2uIksZym5zknJcYn9Ze7jecI7r+0SWAzA==
"@react-navigation/native@^5.8.9":
version "5.8.9"
resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-5.8.9.tgz#67ee2afef6af6ef40c425e02264bd25d1530b361"
integrity sha512-d1oihLxp9UDVsZyvHNcwJfj+LKsEo0m8vEBBV6jhLJAXs1d2DEBzBXGeP907uG+877TK7luh2h79Or4w7/+p+g==
dependencies:
"@react-navigation/core" "^5.12.1"
nanoid "^3.1.9"
"@react-navigation/core" "^5.14.3"
escape-string-regexp "^4.0.0"
nanoid "^3.1.15"

"@react-navigation/routers@^5.4.9":
version "5.4.9"
resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.4.9.tgz#f2f06ab6d3fc7fa8bf06d1885542cf4e0101141e"
integrity sha512-dYD5qrIKUmuBEp+O98hB0tDYpEsGQgCQFQgMEoFKBmVVhx2JnJJ1zxRjU7xWcCU4VdBA8IOowgHQHJsVNKYyrg==
"@react-navigation/routers@^5.6.2":
version "5.6.2"
resolved "https://registry.yarnpkg.com/@react-navigation/routers/-/routers-5.6.2.tgz#accc008c3b777f74d998e16cb2ea8e4c1fe8d9aa"
integrity sha512-XBcDKXS5s4MaHFufN44LtbXqFDH/nUHfHjbwG85fP3k772oRyPRgbnUb2mbw5MFGqORla9T7uymR6Gh6uwIwVw==
dependencies:
nanoid "^3.1.9"
nanoid "^3.1.15"

"@react-navigation/stack@^5.7.1":
version "5.7.1"
resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.7.1.tgz#847b4f7087a87e01086e5e09f49111e42319abde"
integrity sha512-Gbzimr3ZkEpTge44J2/jkEkSKQ/R+wcHT7XPfukhItTm+p3jMD9RcqoshWJaUdWG93wDOHPm4BgbhQmuSgCLWA==
"@react-navigation/stack@^5.12.6":
version "5.12.6"
resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-5.12.6.tgz#a6f2caf66da78ad2afa80f7a960c36db6b83bcff"
integrity sha512-pf9AigAIVtCQuCpZAZqBux4kNqQwj98ngvd6JEryFrqTQ1CYsUH6jfpQE7SKyHggVRFSQVMf24aCgwtRixBvjw==
dependencies:
color "^3.1.2"
react-native-iphone-x-helper "^1.2.1"
color "^3.1.3"
react-native-iphone-x-helper "^1.3.0"

"@redux-saga/core@^1.1.3":
version "1.1.3"
Expand Down Expand Up @@ -11933,6 +11933,14 @@ color-string@^1.5.2:
color-name "^1.0.0"
simple-swizzle "^0.2.2"

color-string@^1.5.4:
version "1.5.4"
resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6"
integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==
dependencies:
color-name "^1.0.0"
simple-swizzle "^0.2.2"

color-support@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
Expand All @@ -11946,13 +11954,13 @@ color@3.0.x:
color-convert "^1.9.1"
color-string "^1.5.2"

color@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
integrity sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==
color@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
dependencies:
color-convert "^1.9.1"
color-string "^1.5.2"
color-string "^1.5.4"

colorette@1.1.0, colorette@^1.0.7:
version "1.1.0"
Expand Down Expand Up @@ -24331,10 +24339,10 @@ nano-json-stream-parser@^0.1.2:
resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f"
integrity sha1-DMj20OK2IrR5xA1JnEbWS3Vcb18=

nanoid@^3.1.9:
version "3.1.10"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.10.tgz#69a8a52b77892de0d11cede96bc9762852145bc4"
integrity sha512-iZFMXKeXWkxzlfmMfM91gw7YhN2sdJtixY+eZh9V6QWJWTOiurhpKhBMgr82pfzgSqglQgqYSCowEYsz8D++6w==
nanoid@^3.1.15:
version "3.1.16"
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64"
integrity sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==

nanomatch@^1.2.9:
version "1.2.9"
Expand Down Expand Up @@ -27796,10 +27804,10 @@ query-string@^5.0.1:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"

query-string@^6.1.0, query-string@^6.13.1:
version "6.13.1"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.1.tgz#d913ccfce3b4b3a713989fe6d39466d92e71ccad"
integrity sha512-RfoButmcK+yCta1+FuU8REvisx1oEzhMKwhLUNcepQTPGcNMp1sIqjnfCtfnvGSQZQEhaBHvccujtWoUV3TTbA==
query-string@^6.1.0, query-string@^6.13.6:
version "6.13.7"
resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.13.7.tgz#af53802ff6ed56f3345f92d40a056f93681026ee"
integrity sha512-CsGs8ZYb39zu0WLkeOhe0NMePqgYdAuCqxOYKDR5LVCytDZYMGx3Bb+xypvQvPHVPijRXB0HZNFllCzHRe4gEA==
dependencies:
decode-uri-component "^0.2.0"
split-on-first "^1.0.0"
Expand Down Expand Up @@ -28194,10 +28202,10 @@ react-native-gesture-handler@^1.6.1:
jwt-decode "^2.2.0"
react-native-securerandom "^1.0.0"

react-native-iphone-x-helper@^1.0.3, react-native-iphone-x-helper@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz#645e2ffbbb49e80844bb4cbbe34a126fda1e6772"
integrity sha512-/VbpIEp8tSNNHIvstuA3Swx610whci1Zpc9mqNkqn14DkMbw+ORviln2u0XyHG1kPvvwTNGZY6QpeFwxYaSdbQ==
react-native-iphone-x-helper@^1.0.3, react-native-iphone-x-helper@^1.3.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.3.1.tgz#20c603e9a0e765fd6f97396638bdeb0e5a60b010"
integrity sha512-HOf0jzRnq2/aFUcdCJ9w9JGzN3gdEg0zFE4FyYlp4jtidqU03D5X7ZegGKfT1EWteR0gPBGp9ye5T5FvSWi9Yg==

react-native-keep-awake@^4.0.0:
version "4.0.0"
Expand Down Expand Up @@ -33711,7 +33719,7 @@ usb@^1.6.0:
nan "2.13.2"
prebuild-install "^5.2.4"

use-subscription@1.4.1, use-subscription@^1.0.0, use-subscription@^1.4.0:
use-subscription@1.4.1, use-subscription@^1.0.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.4.1.tgz#edcbcc220f1adb2dd4fa0b2f61b6cc308e620069"
integrity sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==
Expand Down

0 comments on commit dbac500

Please sign in to comment.