From 1c20e44bb214974413e4ea0ebb1e50d3e44db9d3 Mon Sep 17 00:00:00 2001 From: Harley Catubag Date: Tue, 14 Jun 2022 11:47:49 +0800 Subject: [PATCH] Checkpoint commit. Fixed some error from trello --- app/components/elements.js | 113 ++- app/components/paymaya/form.js | 10 +- app/components/safeArea.component.js | 29 +- app/screens/apply/index.js | 52 +- app/screens/login/apply/details.js | 78 +- app/screens/login/index.js | 143 ++- app/screens/login/t&c.js | 2 +- app/screens/main/home.js | 871 +----------------- app/screens/main/rewards.js | 149 +-- app/screens/myprofile/profile/edit.js | 565 +----------- app/screens/route.js | 2 +- app/screens/topup/form.js | 154 +--- app/screens/topup/index.js | 501 +--------- .../project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 145913 -> 141418 bytes package.json | 1 + yarn.lock | 9 +- 17 files changed, 308 insertions(+), 2375 deletions(-) diff --git a/app/components/elements.js b/app/components/elements.js index 868bf4a6..61701f12 100644 --- a/app/components/elements.js +++ b/app/components/elements.js @@ -1,6 +1,6 @@ import * as React from 'react'; import {useEffect, useState, useRef} from 'react'; -import { Platform, View, Text, Image, TouchableOpacity, ScrollView, StyleSheet, TextInput, Modal, TouchableWithoutFeedback, ActivityIndicator, Alert } from 'react-native' +import { Platform, View, Text, Image, TouchableOpacity, ScrollView, StyleSheet, TextInput, Modal, TouchableWithoutFeedback, ActivityIndicator, Alert, KeyboardAvoidingView } from 'react-native' import { Card, ListItem, Button, Icon, Divider, Input, Overlay, CheckBox } from 'react-native-elements' import {ActionSheet} from 'native-base'; import DateTimePicker from '@react-native-community/datetimepicker'; @@ -161,22 +161,18 @@ const loyaltycard = function(props){ } const card = function(props){ - let h = props.height ? props.height : 200 + let h = props.height ? props.height : 130 return ( - - + + @@ -302,30 +298,31 @@ const custominput = function(props){ let activeborderwidth = props.activeborderwidth || 1.5 const input = () => { return ( - - {props.title} - - {props.bottomText ? {props.bottomText} : null} - {props.bottomOption ? - If you wish to change this, please contact - - Unioil Customer Service - : null } - {props.hasError ? {props.errorMessage} : null} - ) + + {props.title} + + {props.bottomText ? {props.bottomText} : null} + {props.bottomOption ? + If you wish to change this, please contact + + Unioil Customer Service + : null } + {props.hasError ? {props.errorMessage} : null} + + ) } const select = () => { return ( @@ -710,6 +707,49 @@ const nointernet2 = function(){ ); } +const customAlert = function(props) { + const { + open, + yesCB, + noCB, + title, + body, + yesText, + noText + } = props; + + if(!open) return null; + + return ( + + + {title} + {body} + + + {noText ? noText : "Cancel"} + {yesText ? yesText : "Yes"} + + + + + ) +} + const bottomselectmodal = function(props){ let color = Theme.colors.textPrimary let items = props.items || [] @@ -952,5 +992,6 @@ export default { CustomMonthPicker, ActionOption, ModalDialogContainer, - loaderView + loaderView, + customAlert } diff --git a/app/components/paymaya/form.js b/app/components/paymaya/form.js index e82d64f6..6a5c384d 100644 --- a/app/components/paymaya/form.js +++ b/app/components/paymaya/form.js @@ -63,12 +63,10 @@ class RegisterCardFrom extends React.Component { expiry: "MM/YY", cvc: "CVC" }} onChange={this._onChange}/> - - - Full Name - this.setState({ name: value })} /> - - + + Full Name + this.setState({ name: value })} /> + this.send()} style={{padding: 15}}> diff --git a/app/components/safeArea.component.js b/app/components/safeArea.component.js index 8192b279..a7533cff 100644 --- a/app/components/safeArea.component.js +++ b/app/components/safeArea.component.js @@ -1,10 +1,20 @@ import React, { useEffect, useState } from 'react'; -import { StyleSheet, SafeAreaView,Platform} from 'react-native'; +import { + Platform, + SafeAreaView, + StyleSheet, + View, + NativeModules +} from 'react-native'; import { Dimensions } from 'react-native' +import Theme from '../components/theme.style.js'; const { height } = Dimensions.get('window'); -const CustomSafeArea = ({children}) => { +const { StatusBarManager } = NativeModules; +const statusBarHeight = StatusBarManager.HEIGHT; +const OS = Platform.OS; +const CustomSafeArea = ({customStatusBar, children}) => { const [isIphone11,setIsIphone11] = useState(false); useEffect(() =>{ @@ -17,6 +27,14 @@ const CustomSafeArea = ({children}) => { } },[]) + if(customStatusBar && OS === "ios") { + return ( + + + {children} + + ) + } return ( @@ -26,10 +44,13 @@ const CustomSafeArea = ({children}) => { }; const styles = StyleSheet.create({ - customSafeArea:{ flex: 1 - + }, + statusBarHeight: { + height: statusBarHeight, + backgroundColor: Theme.colors.primary, + width: '100%' } }); export default CustomSafeArea; \ No newline at end of file diff --git a/app/screens/apply/index.js b/app/screens/apply/index.js index 6ca2e437..9df1d881 100644 --- a/app/screens/apply/index.js +++ b/app/screens/apply/index.js @@ -157,36 +157,34 @@ class ActivateAccountCard extends React.PureComponent { color={this.props.app_theme?.theme.colors.text} visible={this.state.loading} /> - - - - + + + + + + Enroll Card + + Have a new card? + + + Please enter your card number. + + + { + this.setState({ cardnumber: val, valid: val.length == 16 ? true : false }) + }} + /> - - Enroll Card - - Have a new card? - - - Please enter your card number. - - - { - this.setState({ cardnumber: val, valid: val.length == 16 ? true : false }) - }} - /> - - - this.onSubmit()} disabled={!this.state.valid} style={{padding: 20, paddingTop: 15, width: Theme.screen.w - 80, paddingBottom: 15, borderRadius: 10, backgroundColor: this.state.valid ? Theme.colors.primary : this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.border : Theme.colors.primary + "15"}}> - Next - - + + this.onSubmit()} disabled={!this.state.valid} style={{padding: 20, paddingTop: 15, width: Theme.screen.w - 80, paddingBottom: 15, borderRadius: 10, backgroundColor: this.state.valid ? Theme.colors.primary : this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.border : Theme.colors.primary + "15"}}> + Next + - + ); } diff --git a/app/screens/login/apply/details.js b/app/screens/login/apply/details.js index c9cbe58c..9d644135 100644 --- a/app/screens/login/apply/details.js +++ b/app/screens/login/apply/details.js @@ -131,53 +131,55 @@ class ApplyCardDetails extends React.Component { - + {this.card.name} - + {this.card.description} - - - Enter ID Number - - - {this.card.id_number_description ? this.card.id_number_description : ""} - - Alert.alert("Information", this.state.info ? this.state.info.value : "")} style={{padding: 10, paddingLeft: 0}}> - - + + + + Enter ID Number + {/* + + {this.card.id_number_description ? this.card.id_number_description : ""} + + Alert.alert("Information", this.state.info ? this.state.info.value : "")} style={{padding: 10, paddingLeft: 0}}> + + + */} + + + + + ID Number + { + this.setState({ cardid: value }) + if(value != "") this.setState({ valid: true }) + else this.setState({ valid: false }) + }} + /> + + + { + this.state.canProceed ? + this.onNext()} style={{backgroundColor: !this.handleShowForm() ? Theme.colors.primary : this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.border : Theme.colors.primary, padding: 15, marginTop: 20, width: '100%', borderRadius: 10, elevation: 3}}> + Next + : + this.onNext()} style={{backgroundColor: this.state.valid ? Theme.colors.primary : this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.border : Theme.colors.primary + "15", padding: 15, marginTop: 20, width: '100%', borderRadius: 10, elevation: this.state.valid ? 3 : 0}}> + Next + + } - - - - - ID Number - { - this.setState({ cardid: value }) - if(value != "") this.setState({ valid: true }) - else this.setState({ valid: false }) - }} - /> - - - { - this.state.canProceed ? - this.onNext()} style={{backgroundColor: !this.handleShowForm() ? Theme.colors.primary : this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.border : Theme.colors.primary, padding: 15, marginTop: 20, width: '100%', borderRadius: 10, elevation: 3}}> - Next - : - this.onNext()} style={{backgroundColor: this.state.valid ? Theme.colors.primary : this.props.app_theme?.theme.dark ? this.props.app_theme?.theme.colors.border : Theme.colors.primary + "15", padding: 15, marginTop: 20, width: '100%', borderRadius: 10, elevation: this.state.valid ? 3 : 0}}> - Next - - } diff --git a/app/screens/login/index.js b/app/screens/login/index.js index c387df9d..70eb5fb4 100644 --- a/app/screens/login/index.js +++ b/app/screens/login/index.js @@ -21,6 +21,7 @@ import REQUEST from '../../components/api/'; import DB from '../../components/storage/'; import CustomInput from '../../components/custominput'; import CustomSafeArea from '../../components/safeArea.component'; +import { StatusBar } from 'native-base'; class AddAccountCard extends React.PureComponent { @@ -135,87 +136,85 @@ class AddAccountCard extends React.PureComponent { render() { let version = `v${DeviceInfo.getReadableVersion()}` return ( - - - - - - - - - - Make Life Rewarding - - Enter your mobile number. - - - { - let value = val.includes(".") ? val.replace(".", "") : val - this.setState({ mobilenumber: value, valid: value.length == 13 ? true : false, agree: false }) - }} - /> - - this.state.valid ? this.onAgree() : null} style={{flex: 0, padding: 8}}> - {!this.state.agree || !this.state.valid ? : } - - - I agree to Unioil's - this.props.navigation.navigate("TermsConditions")}> - Data Privacy Policy. + + + + + + + + + + Make Life Rewarding + + Enter your mobile number. + + + { + let value = val.includes(".") ? val.replace(".", "") : val + this.setState({ mobilenumber: value, valid: value.length == 13 ? true : false, agree: false }) + }} + /> + + this.state.valid ? this.onAgree() : null} style={{flex: 0, padding: 8}}> + {!this.state.agree || !this.state.valid ? : } + + I agree to Unioil's + this.props.navigation.navigate("TermsConditions")}> + Data Privacy Policy. + + - - - - this.onSubmit()} disabled={(!this.state.agree || !this.state.valid)} style={{padding: 20, paddingTop: 15, width: Theme.screen.w - 80, paddingBottom: 15, borderRadius: 10, backgroundColor: (this.state.agree && this.state.valid) ? Theme.colors.primary : Theme.colors.darkGray + "40"}}> - Log In - - + + + this.onSubmit()} disabled={(!this.state.agree || !this.state.valid)} style={{padding: 20, paddingTop: 15, width: Theme.screen.w * .73, paddingBottom: 15, borderRadius: 10, backgroundColor: (this.state.agree && this.state.valid) ? Theme.colors.primary : Theme.colors.darkGray + "40"}}> + Log In + + - - or - - - - this.props.navigation.navigate("EnrollActivate", {screen: "Login"}) } style={{padding: 15, paddingTop: 12, width: Theme.screen.w - 80, paddingBottom: 12, borderRadius: 10, borderWidth: 2, borderColor: Theme.colors.white}}> - Activate your Card - - - - this.props.navigation.navigate("ApplySelectCard") } style={{padding: 15, paddingTop: 12, width: Theme.screen.w - 80, paddingBottom: 12, borderRadius: 10, borderWidth: 2, borderColor: Theme.colors.white}}> - Apply for a Card - - - - this.props.navigation.navigate("TermsConditions") } style={{padding: 15, paddingTop: 12, width: Theme.screen.w - 80, paddingBottom: 12}}> + + or + + + + this.props.navigation.navigate("EnrollActivate", {screen: "Login"}) } style={{padding: 15, paddingTop: 12, width: Theme.screen.w * .65, paddingBottom: 12, borderRadius: 10, borderWidth: 2, borderColor: Theme.colors.white}}> + Activate your Card + + + + this.props.navigation.navigate("ApplySelectCard") } style={{padding: 15, paddingTop: 12, width: Theme.screen.w * .65, paddingBottom: 12, borderRadius: 10, borderWidth: 2, borderColor: Theme.colors.white}}> + Apply for a Card + + + this.props.navigation.navigate("TermsConditions") } style={{paddingHorizontal: 15, width: Theme.screen.w - 80, paddingBottom: 12}}> Enter as Guest - - - {ContactOptions()}} style={{padding: 15, alignItems: 'flex-start', flex: 1}}> - Contact Us - - {}} style={{padding: 15, justifyContent: 'flex-end', flex: 1}}> - {version} - - - - + + {ContactOptions()}} style={{padding: 15, alignItems: 'flex-start', flex: 1}}> + Contact Us + + {}} style={{padding: 15, justifyContent: 'flex-end', flex: 1}}> + {version} + + + + ) } } diff --git a/app/screens/login/t&c.js b/app/screens/login/t&c.js index da95b366..5b590924 100644 --- a/app/screens/login/t&c.js +++ b/app/screens/login/t&c.js @@ -116,7 +116,7 @@ class TermsConditions extends React.PureComponent { {this.state.connection && !this.sender ? this.setGuest() }> - I Agree + I Accept : null } diff --git a/app/screens/main/home.js b/app/screens/main/home.js index d5f7bd66..4a8dd506 100644 --- a/app/screens/main/home.js +++ b/app/screens/main/home.js @@ -473,873 +473,4 @@ const mapDispatchToProps = { saveUserInfo } -export default connect(mapStateToProps, mapDispatchToProps)(Home) - -// const Home = (props) => { - -// const navigate = (screen, params) => { props.navigation.navigate(screen, params) } -// const whats_hot = (props.whats_hot != undefined && props.whats_hot.length > 0) ? props.whats_hot : [] -// const whats_promos = (props.promos != undefined && props.promos.length > 0) ? props.promos : [] -// const [loading, setloading] = useState(true) -// const [refresh, setRefresh] = useState(false) -// const [connected, setconnection] = useState(false) -// const [infodialog, setinfodialog] = useState(true) -// const [promos, setpromos] = useState(whats_promos) -// const [promogps, setpromogps] = useState([]) -// const [showpromogps, setshowpromogps] = useState(false) -// const [promogpsindex, setpromogpsindex] = useState(null) -// const [_carousel, setcarousel] = useState("") -// const [whatsHot, setwhatsHot] = useState(whats_hot) -// const [activeSlide, setactiveSlide] = useState(0) -// const [session, setsession] = useState(null) -// const [userProfile, setUserProfile] = useState({}) -// const [notifications, setnotifications] = useState([]) -// const [isGuest, setisGuest] = useState(false) -// var backPressCount = 0 -// var backPressDuration = 0 - -// const loadUserProfile = async () => { -// const SESSION = await DB.session() -// props.saveUserInfo({ token: SESSION.token, card_number: SESSION.user.card_number }).then(res => { -// setUserProfile(res) -// }) -// } - -// const load = async () => { -// const SESSION = await DB.session() -// const USERPROFILE = await DB.profile() -// const isGuest = await DB.get('is_guest') - -// if(isGuest == 'true'){ -// loadIsGuest() -// return -// } - -// try{ -// await setsession(SESSION) -// await setUserProfile(USERPROFILE) -// props.saveWhatshot({ token: SESSION.token, lcard_uuid: `lcard_uuid=${SESSION.user.lcard_uuid}` }).then(res => { -// setwhatsHot(res) -// }) -// props.savePromos({ token: SESSION.token, lcard_uuid: `lcard_uuid=${SESSION.user.lcard_uuid}` }).then(res => { -// setpromos(res) -// }) - -// Geolocation.getCurrentPosition( -// info => { -// REQUEST("promo_gps", "post", { -// Authorization: SESSION.token -// }, {}, { -// lcard_uuid: SESSION.user.lcard_uuid, -// longitude: info.coords.longitude, -// latitude: info.coords.latitude -// }, function(res){ -// setpromogps(res.data) -// setshowpromogps(true) -// }, function(error){ -// console.log(error) -// }) -// }, -// error => console.log(error) -// ) -// await setloading(false) - -// } catch(error) { -// setloading(false) -// } -// loadNotifications() -// } - -// const loadIsGuest = async () => { -// setisGuest(true) -// setloading(false) -// await REQUEST("promos", "get", {}, {}, {}, -// function(res){ -// if(res.status == 1 && res.data.length > 0){ -// let wh = [] -// for(var x=0;x 0){ -// setpromos(res.data) -// }else{ -// console.log(res.message, res.data) -// } -// }, function(error){ -// console.log(error) -// }) -// await setUserProfile({}) -// } - -// const init = () => { -// NetInfo.netstatus(isConnected => { -// if(isConnected) { -// if(refresh) { -// load() -// setRefresh(false) -// } else { -// if(props.userinfo == undefined && props.userinfo == null) { -// loadUserProfile() -// } else { -// setUserProfile(props.userinfo) -// } -// if(props.whats_hot == undefined && props.promos == undefined) { -// load() -// } else { -// setloading(false) -// } -// } -// } else { -// setloading(false) -// Elements.nointernet2() -// } -// }) -// } - -// const onBackPress = () => { -// let listener = setInterval(() => { -// backPressDuration += 1 -// if(backPressDuration >= 15){ -// backPressCount = 0 -// backPressDuration = 0 -// clearInterval(listener) -// } -// }, 100) -// backPressCount += 1 -// console.log("Back Press Count", backPressCount, typeof backPressCount) -// if(backPressCount == 2){ -// backPressCount = 0 -// backPressDuration = 0 -// BackHandler.exitApp() -// return false -// }else{ -// ToastAndroid.show("Press back again to exit.", ToastAndroid.SHORT) -// return true -// } -// } - -// useEffect(() => { -// BackHandler.addEventListener('hardwareBackPress', onBackPress) -// return () => { -// BackHandler.removeEventListener('hardwareBackPress', onBackPress) -// } -// }, []) - -// const softLoad = async () => { -// NetInfo.fetch().then(async state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ -// setloading(true) -// if(isGuest == 'true'){ -// loadIsGuest() -// return -// } -// const SESSION = await DB.session() -// await REQUEST("user_profile", "get", { -// Authorization: SESSION.token, -// card_number: SESSION.user.card_number -// }, {}, {}, function(data){ -// console.log("FETCH USER PROFILE"); -// if(data.status == 1){ -// DB.updateProfile(data, function(){ -// console.log("USER PROFILE SAVED! ") -// setUserProfile(data) -// }, function(error){ -// console.log("Error saving profile", error) -// }) -// } -// setloading(false) -// }, function(error){ -// setloading(false) -// console.log(error) -// }) -// }else{ -// setloading(false) -// Elements.nointernet2() -// } -// }) -// } - -// useEffect(() => { -// init() -// console.log("LOAD DATA"); -// }, []) - - -// const loadNotifications = async () => { -// let allnotifs = await DB.get("notifications") -// let notifs = allnotifs ? JSON.parse(allnotifs) : notifications -// await setnotifications(notifs) -// } - -// useEffect(() => { -// const unsubscribe = messaging().onMessage(async remoteMessage => { -// setTimeout(async () => { -// if(Platform.OS == 'ios'){ -// let allnotifs = await DB.get("notifications") -// let notifs = allnotifs ? JSON.parse(allnotifs) : notifications -// await setnotifications(notifs) -// console.log("A new notification has recieved on home page", notifications, allnotifs) -// }else{ -// let allnotifs = await DB.get("notifications") -// let notifs = allnotifs ? JSON.parse(allnotifs) : notifications -// await setnotifications(notifs) -// console.log("A new notification has recieved on home page", notifications) -// } -// }, 300); -// }) -// return unsubscribe; -// }, []); - -// const validate = async (tkn) => { -// const SESSION = await DB.session() -// if(!SESSION.token){ -// alert("You are not logged in!"); -// setloading(false) -// props.navigation.navigate("Login") -// } -// } - -// const renderwhatsHot = ({item, index}) => { -// return ( -// -// -// ) -// } - -// const renderPromos = () => { -// return promos.map((promo, index) => { -// return ( -// { -// console.log("CLICKED!!!") -// navigate('PromoDetails', {data: promo, type: "promo", onBackPress: softLoad}); -// }} -// image={{uri: promo.image}} />) -// }) -// } - -// const renderPromoGPS = () => { -// if(!promogps || promogps.length == 0) return null -// return promogps.map((promo, i) => { -// return { -// setpromogpsindex(i) -// setshowpromogps(false) -// }} -// onOpen={() => { -// setshowpromogps(false) -// navigate('PromoDetails', {data: promo, type: "promogps", onBackPress: softLoad}); -// }} -// /> -// }) -// } - -// const renderNotifications = () => { -// return notifications.map((notif, index) => { -// return { -// let nfcopy = notifications -// nfcopy[index].visible = false -// await setnotifications([]) -// await setnotifications(nfcopy) -// await DB.set("notifications", JSON.stringify(nfcopy), (res) => console.log(res), (e) => console.log(e)) -// console.log("Close notification triggered") -// }} -// onDismiss={async () => { -// let nfcopy = notifications -// nfcopy[index].visible = false -// await setnotifications([]) -// await setnotifications(nfcopy) -// console.log("Dismissed") -// }} -// /> -// }) -// } - -// return ( -// -// -// {renderNotifications()} -// - -// {isGuest ? : null} - -// {loading && !isGuest ? : !isGuest ? -// : null } - -// { -// setRefresh(true) -// init() -// }} /> -// }> -// WHAT'S HOT? -// -// -// -// PROMOS -// -// {renderPromos()} -// -// {renderPromoGPS()} -// -// -// -// ); -// } - -// const mapStateToProps = (state) => { -// console.log(state); -// return { -// userinfo: state.appUserInfoReducer.userinfo, -// whats_hot: state.appWhatshotAndPromosReducer.whats_hot, -// promos: state.appWhatshotAndPromosReducer.promos -// } -// } - -// const mapDispatchToProps = { -// saveWhatshot, -// savePromos, -// saveUserInfo -// } - -// export default connect(mapStateToProps, mapDispatchToProps)(Home) - - - - -// export default function Home(navigation) { - -// const navigate = (screen, params) => { navigation.navigation.navigate(screen, params) } -// const [loading, setloading] = useState(true); -// const [connected, setconnection] = useState(false); -// const [infodialog, setinfodialog] = useState(true); -// const [promos, setpromos] = useState([]); -// const [promogps, setpromogps] = useState([]); -// const [showpromogps, setshowpromogps] = useState(false) -// const [promogpsindex, setpromogpsindex] = useState(null) -// const [_carousel, setcarousel] = useState(""); -// const [whatsHot, setwhatsHot] = useState([]); -// const [activeSlide, setactiveSlide] = useState(0); -// const [session, setsession] = useState(null); -// const [userProfile, setUserProfile] = useState({}); -// const [notifications, setnotifications] = useState([]); -// const [isGuest, setisGuest] = useState(false) -// var backPressCount = 0 -// var backPressDuration = 0 - -// var sampledata = {} -// // var sampledata = {"data": {"address": "", "birthdate": "January 01, 1990", "card_bg_image": "https://s3-ap-southeast-1.amazonaws.com/unioil.mobiletestbucket/mobileapp/cardTypes_bg_image/1582093000.jpg", "card_black_label": 0, "card_code": "PUVCARD", "card_image": "https://s3-ap-southeast-1.amazonaws.com/unioil.mobiletestbucket/mobileapp/cardTypes/1582093256.jpg", "card_number": "1119000000000020", "card_type": "PASADANG UNIOIL VALUE CARD", "city_name": "", "civilstatus_code": "SE", "email": "bry.rnr@gmail.com", "expiry_date": "2023-02-07", "firstname": "RNR", "fueltype_code": "0", "gender_code": "F", "lastname": "PUV", "lcard_uuid": "5fd8f34c-49ca-11ea-9ba4-02189255205c", "middlename": "", "mobile": "639957951241", "photo": "https://s3-ap-southeast-1.amazonaws.com/unioil.mobiletestbucket/mobileapp/memberPhoto/1581094497.jpg", "pin": "03444748", "points": 1600, "vo_code": "0"}, "message": "Success", "retrieved": {"address": "", "card_number": "1119000000000020", "card_type_code": "PUVCARD", "card_type_desc": "PASADANG UNIOIL VALUE CARD", "civil_status_code": "SE", "civil_status_desc": "SEPARATED", "email": "bry.rnr@gmail.com", "first_name": "RNR", "fuel_type_code": "0", "fuel_type_desc": "NO DATA ENTERED", "gender_code": "F", "gender_desc": "FEMALE", "is_bdo": "0", "is_caltex": "0", "is_cebupacific": "0", "is_flyingv": "0", "is_happy": "0", "is_jetti": "0", "is_mabuhay": "0", "is_mercury": "0", "is_national": "0", "is_petron": "0", "is_petronv": "0", "is_phoenix": "0", "is_ptt": "0", "is_robinson": "0", "is_s&r": "0", "is_seaoil": "0", "is_shell": "0", "is_sm": "0", "is_starbucks": "0", "is_total": "0", "last_name": "PUV", "middle_initial": "", "mobile": "639957951241", "number_cars": "0", "occupation": "0", "vehicle_own_code": "0", "vehicle_own_desc": "NO DATA ENTERED"}, "status": 1} - -// // async function requestUserPermission() { -// // const authStatus = await messaging().requestPermission(); - -// // if (authStatus) { -// // console.log('Permission status:', authStatus); -// // } -// // // const enabled = -// // // authStatus === AuthorizationStatus.AUTHORIZED || authStatus === AuthorizationStatus.PROVISIONAL; - -// // // if (enabled) { -// // // console.log('Firebase Notification Authorization status:', authStatus); -// // // } -// // } - -// const load = async () => { - -// const SESSION = await DB.session() -// const USERPROFILE = await DB.profile() -// const isGuest = await DB.get('is_guest') - -// if(isGuest == 'true'){ -// loadIsGuest() -// return -// } - -// try{ - -// setloading(true) -// await setsession(SESSION) -// await setUserProfile(USERPROFILE) -// // await validate() -// await REQUEST("user_profile", "get", { -// Authorization: SESSION.token, -// card_number: SESSION.user.card_number -// }, {}, {}, function(data){ -// console.log("FETCH USER PROFILE"); -// if(data.status == 1){ -// DB.updateProfile(data, function(){ -// console.log("USER PROFILE SAVED! ", data) -// setUserProfile(data) -// }, function(error){ -// console.log("Error saving profile", error) -// }) -// } -// }, function(error){ -// console.log(error) -// }) -// await REQUEST("whats_hot", "get", { -// Authorization: SESSION.token, -// }, `lcard_uuid=${SESSION.user.lcard_uuid}`, {}, -// function(res){ -// if(res.status == 1 && res.data.length > 0){ -// let wh = [] -// for(var x=0;x 0){ -// setpromos(res.data) -// }else{ -// console.log(res.message, res.data) -// } -// }, function(error){ -// console.log(error) -// }) -// Geolocation.getCurrentPosition( -// info => { -// REQUEST("promo_gps", "post", { -// Authorization: SESSION.token -// }, {}, { -// lcard_uuid: SESSION.user.lcard_uuid, -// longitude: info.coords.longitude, -// latitude: info.coords.latitude -// }, function(res){ -// setpromogps(res.data) -// setshowpromogps(true) -// }, function(error){ -// console.log(error) -// }) -// }, -// error => { -// console.log(error) -// } -// ) -// await setloading(false) - -// }catch(error){ -// console.log(error) -// setloading(false) -// } - -// loadNotifications() - -// } - -// const loadIsGuest = async () => { -// setisGuest(true) -// setloading(false) -// await REQUEST("promos", "get", {}, {}, {}, -// function(res){ -// if(res.status == 1 && res.data.length > 0){ -// let wh = [] -// for(var x=0;x 0){ -// setpromos(res.data) -// }else{ -// console.log(res.message, res.data) -// } -// }, function(error){ -// console.log(error) -// }) -// await setUserProfile({}) -// } - -// const init = () => { -// NetInfo.fetch().then(state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ -// load() -// }else{ -// setloading(false) -// Elements.nointernet2() -// } -// }); -// } - -// const onBackPress = () => { -// let listener = setInterval(() => { -// backPressDuration += 1 -// if(backPressDuration >= 15){ -// backPressCount = 0 -// backPressDuration = 0 -// clearInterval(listener) -// } -// }, 100) -// backPressCount += 1 -// console.log("Back Press Count", backPressCount, typeof backPressCount) -// if(backPressCount == 2){ -// backPressCount = 0 -// backPressDuration = 0 -// BackHandler.exitApp() -// return false -// }else{ -// ToastAndroid.show("Press back again to exit.", ToastAndroid.SHORT) -// return true -// } -// } - -// useEffect(() => { -// BackHandler.addEventListener('hardwareBackPress', onBackPress) -// return () => { -// BackHandler.removeEventListener('hardwareBackPress', onBackPress) -// } -// }, []) - -// const softLoad = async () => { -// NetInfo.fetch().then(async state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ -// setloading(true) -// if(isGuest == 'true'){ -// loadIsGuest() -// return -// } -// const SESSION = await DB.session() -// await REQUEST("user_profile", "get", { -// Authorization: SESSION.token, -// card_number: SESSION.user.card_number -// }, {}, {}, function(data){ -// console.log("FETCH USER PROFILE"); -// if(data.status == 1){ -// DB.updateProfile(data, function(){ -// console.log("USER PROFILE SAVED! ") -// setUserProfile(data) -// }, function(error){ -// console.log("Error saving profile", error) -// }) -// } -// setloading(false) -// }, function(error){ -// setloading(false) -// console.log(error) -// }) -// }else{ -// setloading(false) -// Elements.nointernet2() -// } -// }) -// } - -// useEffect(() => { -// init() -// console.log("LOAD DATA"); -// }, []) - - -// const loadNotifications = async () => { - -// //RESET NOTIFICATIONS -// // await DB.remove("notifications") - -// let allnotifs = await DB.get("notifications") -// let notifs = allnotifs ? JSON.parse(allnotifs) : notifications -// await setnotifications(notifs) -// // console.log("Notifications", notifs) -// } - -// useEffect(() => { -// const unsubscribe = messaging().onMessage(async remoteMessage => { -// setTimeout(async () => { -// if(Platform.OS == 'ios'){ -// let allnotifs = await DB.get("notifications") -// let notifs = allnotifs ? JSON.parse(allnotifs) : notifications -// await setnotifications(notifs) -// console.log("A new notification has recieved on home page", notifications, allnotifs) -// }else{ -// let allnotifs = await DB.get("notifications") -// let notifs = allnotifs ? JSON.parse(allnotifs) : notifications -// await setnotifications(notifs) -// console.log("A new notification has recieved on home page", notifications) -// } -// }, 300); -// }) -// return unsubscribe; -// }, []); - -// const validate = async (tkn) => { -// const SESSION = await DB.session() -// if(!SESSION.token){ -// alert("You are not logged in!"); -// setloading(false) -// navigation.navigation.navigate("Login") -// } -// } - -// const renderwhatsHot = ({item, index}) => { -// return ( -// -// -// ) -// } - -// const renderPromos = () => { -// return promos.map((promo, index) => { -// return ( -// { -// console.log("CLICKED!!!") -// navigate('PromoDetails', {data: promo, type: "promo", onBackPress: softLoad}); -// }} -// image={{uri: promo.image}} />) -// }) -// } - -// const renderPromoGPS = () => { -// if(!promogps || promogps.length == 0) return null -// return promogps.map((promo, i) => { -// return { -// setpromogpsindex(i) -// setshowpromogps(false) -// }} -// onOpen={() => { -// setshowpromogps(false) -// navigate('PromoDetails', {data: promo, type: "promogps", onBackPress: softLoad}); -// }} -// /> -// }) -// } - -// const renderNotifications = () => { -// return notifications.map((notif, index) => { -// return { -// let nfcopy = notifications -// nfcopy[index].visible = false -// await setnotifications([]) -// await setnotifications(nfcopy) -// await DB.set("notifications", JSON.stringify(nfcopy), (res) => console.log(res), (e) => console.log(e)) -// console.log("Close notification triggered") -// // console.log("tried to close notification", notifications) -// }} -// onDismiss={async () => { -// let nfcopy = notifications -// nfcopy[index].visible = false -// await setnotifications([]) -// await setnotifications(nfcopy) -// console.log("Dismissed") -// }} -// /> -// }) -// } - -// return ( -// -// -// {renderNotifications()} -// - -// {isGuest ? : null} - -// {loading && !isGuest ? : !isGuest ? -// : null } - -// -// }> -// WHAT'S HOT? -// -// -// -// PROMOS -// -// {renderPromos()} -// -// {renderPromoGPS()} -// -// -// -// ); -// } - -// // useEffect(() => { -// // setnotifications([{ -// // title: "Unioil", -// // body: "Welcome to Unioil Loyalty App", -// // visible: true -// // },{ -// // title: "Membership", -// // body: "Redeem points and use your points to buy our products", -// // visible: true -// // }]) -// // }, []) - -// /* -// // await setpromos([ -// // { -// // title: 'Dixie Ganda', -// // image: Assets.test.dixie[Math.floor(Math.random() * Assets.test.dixie.length - 1)], -// // description: 'asd asd' -// // }, -// // { -// // title: 'Ganda Dixie', -// // image: Assets.test.dixie[Math.floor(Math.random() * Assets.test.dixie.length - 1)], -// // description: 'asd asdasdasd' -// // } -// // ]) -// // await setwhatsHot([ -// // { -// // title: 'Dixie Ganda', -// // image: Assets.test.zuvapit[Math.floor(Math.random() * Assets.test.zuvapit.length - 1)], -// // description: 'asd asd' -// // }, -// // { -// // title: 'Ganda Dixie', -// // image: Assets.test.mina[Math.floor(Math.random() * Assets.test.mina.length - 1)], -// // description: 'asd asdasdasd' -// // }, -// // { -// // title: 'Ganda Dixie', -// // image: Assets.test.zuvapit[Math.floor(Math.random() * Assets.test.zuvapit.length - 1)], -// // description: 'asd asdasdasd' -// // }, -// // { -// // title: 'Ganda Dixie', -// // image: Assets.test.mina[Math.floor(Math.random() * Assets.test.mina.length - 1)], -// // description: 'asd asdasdasd' -// // } -// // ]) - -// {/* { -// navigate('PromoDetails', promos[0]); -// }} -// image={promos[0]?.image || Assets.dixie} /> - -// { -// navigate('PromoDetails', promos[1]); -// }} -// image={promos[1]?.image || Assets.dixie} /> } - -// */ \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(Home) \ No newline at end of file diff --git a/app/screens/main/rewards.js b/app/screens/main/rewards.js index a4789551..8e603653 100644 --- a/app/screens/main/rewards.js +++ b/app/screens/main/rewards.js @@ -70,7 +70,7 @@ class Rewards extends React.Component { } } - render = () => { + toRender = () => { if(!this.state.connection){ return ( - + { !this.state.guest ? - {this.render()} + {this.toRender()} : @@ -157,141 +161,4 @@ export const styles = StyleSheet.create({ alignItems: 'center', textAlign: 'center', } -}) - -// export default function Rewards(navigation) { - -// const [data, setdata] = useState("") -// const [connection, setconnection] = useState(false) -// const netInfo = useNetInfo(); -// const [guest, setGuest] = useState(false) - -// const init = async () => { -// let isGuest = await DB.get("is_guest"); -// setGuest(isGuest) -// setconnection(true) -// const SESSION = await DB.session() -// try{ -// await REQUEST("shared_treats", "get", { -// Authorization: SESSION.token -// }, {}, {}, -// async (res) => { -// if(res.status == 1 && res.data){ -// await setdata(await res.data) -// }else{ -// console.log(res.message, res.data) -// } -// }, function(error){ -// console.log(error) -// } -// ) -// }catch(error){ -// console.log(error) -// } -// } - -// const styles = StyleSheet.create({ -// enrollBtn: { -// backgroundColor: '#e74610', -// height: Theme.screen.h / 19, -// marginHorizontal: 15, -// borderRadius: 10, -// alignItems: 'center', -// justifyContent: 'center', -// marginVertical: 15, -// paddingHorizontal: 15, -// elevation: 2 -// }, -// enrollBtnTxt: { -// textAlign: 'center', -// alignItems: 'center', -// color: '#fff', -// fontWeight: '600', -// fontSize: 14 -// }, -// viewStyle: { -// height: Theme.screen.h, -// flex: 1, -// flexDirection: 'row', -// justifyContent: 'center' -// }, -// viewStyle1: { -// justifyContent: 'center', -// alignItems: 'center', -// textAlign: 'center', -// } -// }) - -// useEffect(() => { -// NetInfo.fetch().then(state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ - -// // Alert.alert("System Advisory", "We're working on more exciting rewards for you! Redemption of points will be temporarily unavailable. A notification will be sent once this feature has been restored. \nWe apologize for the inconvenience."); -// init() - -// }else{ -// Elements.nointernet2() -// } -// }); -// }, []) - -// console.log(data.site) - -// const render = () => { -// if(!connection){ -// return ( -// { -// NetInfo.fetch().then(state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ -// init() -// }else{ -// Elements.nointernet2() -// } -// }) -// }} -// /> -// ) -// } -// return ( -// ) -// } - -// return ( -// -// -// { -// !guest ? -// -// {render()} -// -// : -// -// -// -// You won't be able to access some of the pages unless you will enroll your card or login. -// -// { navigation.navigation.navigate('Login') }}> -// Enroll Card -// -// -// -// } -// -// ); -// } \ No newline at end of file +}) \ No newline at end of file diff --git a/app/screens/myprofile/profile/edit.js b/app/screens/myprofile/profile/edit.js index 0c1ab423..2d2422e5 100644 --- a/app/screens/myprofile/profile/edit.js +++ b/app/screens/myprofile/profile/edit.js @@ -3,7 +3,6 @@ import { SafeAreaView, ScrollView, TouchableOpacity, View, Text, Alert } from 'r import { Avatar } from 'react-native-elements'; import { connect } from "react-redux"; import { saveUserInfo, savePlainUserInfo } from "../../../redux/actions/AppUserInfoActions"; -import { StackActions } from '@react-navigation/native'; import CustomHeader from '../../../components/header.js'; import Assets from '../../../components/assets.manager.js'; import Theme from '../../../components/theme.style.js'; @@ -25,6 +24,7 @@ class EditProfile extends React.PureComponent { } state = { + openModal: false, loading: false, userProfile: null, focused: false, @@ -150,7 +150,13 @@ class EditProfile extends React.PureComponent { } if(!this.state.fuelType && this.state.userProfile.fueltype_code == "0"){ res = Object.assign(this.state.errors, {fuelType : ["This field is required"]}) - } + } + if(this.state.maritalStatus === null) { + res = Object.assign(this.state.errors, {maritalStatus : ["This field is required"]}) + } + if(this.state.gender === null) { + res = Object.assign(this.state.errors, {gender : ["This field is required"]}) + } this.setState({ errors: res, loading: false }) return Object.keys(this.state.errors).length > 0 ? false : true } @@ -301,10 +307,7 @@ class EditProfile extends React.PureComponent { } else { this.responseHandler(success, handler => { this.props.route.params.onGoBack(success.data); - this.props.navigation.dispatch({ - routName: "MenuTab", - type: "GoToRoute" - }); + this.props.navigation.pop(2); }) } }, error => { @@ -329,28 +332,18 @@ class EditProfile extends React.PureComponent { }) } - onSubmit = () => { - this.setState({ focused: false }) + onSubmit = async () => { + this.setState({ focused: false, openModal: false }) if(this.hasChanges()){ - Alert.alert( - "Update Profile", - '\nAre you sure you want to save changes to your profile?\n', - [{ - text: 'Cancel', - style: 'cancel', - },{ - text: 'OK', onPress: async () => { - let validation = await this.FormValidate() - if(!validation) return - if(this.state.newmobile != "" && this.state.newmobile.replace("+", "") != this.state.userProfile.mobile){ - this.SaveWithOtp() - }else{ - this.SaveNoOtp() - } - } - }], - {cancelable: true} - ); + let validation = await this.FormValidate(); + + if(!validation) return + + if(this.state.newmobile != "" && this.state.newmobile.replace("+", "") != this.state.userProfile.mobile){ + this.SaveWithOtp() + }else{ + this.SaveNoOtp() + } }else{ this.props.navigation.goBack() } @@ -384,6 +377,7 @@ class EditProfile extends React.PureComponent { render() { return ( + <> { this.onInputFocus(9) this.onSelectPress(3) + delete this.state.errors["maritalStatus"] }} - error={"This field is required"} /> + hasError={this.state.errors && this.state.errors.maritalStatus ? true : false} + errorMessage={"This field is required"} /> { this.onInputFocus(10) this.onSelectPress(4) + delete this.state.errors["gender"] }} - error={"This field is required"} /> + hasError={this.state.errors && this.state.errors.gender ? true : false} + errorMessage={"This field is required"} /> - this.onSubmit()} style={{width: '92%', padding: 15, borderRadius: 10, backgroundColor: Theme.colors.primary}}> + this.setState({ openModal: true })} style={{width: '92%', padding: 15, borderRadius: 10, backgroundColor: Theme.colors.primary}}> Save Changes + this.setState({ openModal: false })} + yesCB={this.onSubmit} + /> + ) } } @@ -654,501 +660,4 @@ const mapDispatchToProps = { saveUserInfo } -export default connect(mapStateToProps, mapDispatchToProps)(EditProfile) - - -// export default function EditProfile(navigation) { - -// const [loading, setloading] = useState(false) -// const [userProfile, setUserProfile] = useState(null) -// const [focused, setfocused] = useState(false); -// const [editprofileselect, seteditprofileselect] = useState(false) -// const [customerserviceselect, setcustomerserviceselect] = useState(false) -// const [currentFocus, setCurrentFocus] = useState(null); - -// const [opendialog, setopendialog] = useState(false); -// const [currentDialog, setCurrentDialog] = useState(null); - -// const [currentphoto, setcurrentphoto] = useState(null) -// const [newphoto, setnewphoto]= useState(null) -// const [newmobile, setnewmobile]= useState("") -// const [newemail, setnewemail]= useState(null) -// const [newaddress, setnewaddress]= useState(null) -// const [newcity, setnewcity]= useState(null) - -// const [vehicleType, setVehicleTyle] = useState(null); -// const [fuelType, setFuelType] = useState(null); -// const [maritalStatus, setMaritalStatus] = useState(null); -// const [gender, setGender] = useState(null); -// const [is_deleted, setdeleted] = useState(false); - -// const [errors, seterrors] = useState({}); - - -// useEffect(() => { -// // navigation.route.params.data.photo = '' -// setloading(true) -// setUserProfile(navigation.route?.params.data) -// setloading(false) -// console.log("PROFILE", navigation.route?.params.data) -// }, []) - -// const onInputFocus = (index) => { -// setfocused(true) -// setCurrentFocus(index) -// } -// const onSelectPress = (index) => { -// setopendialog(true) -// setCurrentDialog(index) -// } - -// const getFT = (type) => { -// let types = Assets.fueltypes -// for(var x=0;x { -// let types = Assets.vehicletypes -// for(var x=0;x { -// let types = Assets.civilstatus -// for(var x=0;x { -// let types = Assets.gender -// for(var x=0;x { - -// } - -// const onDeletePhoto = () => { -// setdeleted(true) -// setcurrentphoto(Assets.logo.profileHolder) -// } - -// const onEditPhoto = () => { -// ImagePicker.launchImageLibrary({}, (response) => { -// // let b64 = response.data -// // response.data = '' -// if(!response.didCancel){ -// if(is_deleted){ -// setdeleted(false) -// setcurrentphoto(null) -// } -// setnewphoto(response) -// } -// // console.log(response) -// }); -// } - -// const FormValidate = async () => { -// let res = {} -// setloading(true) -// if(newemail == ""){ -// res = Object.assign(errors, {email: ["This field is required"]}) -// } -// if(newaddress == "" || newaddress == null && userProfile.address == ""){ -// // seterrors(Object.assign(errors, {address: ["This field is required"]})) -// res = Object.assign(errors, {address: ["This field is required"]}) -// } -// if(!vehicleType && userProfile.vo_code == "0"){ -// // seterrors(Object.assign(errors, {vehicleType: ["This field is required"]})) -// res = Object.assign(errors, {vehicleType: ["This field is required"]}) -// } -// if(!fuelType && userProfile.fueltype_code == "0"){ -// // seterrors(Object.assign(errors, {fuelType : ["This field is required"]})) -// res = Object.assign(errors, {fuelType : ["This field is required"]}) -// } -// seterrors(res) -// setloading(false) -// return Object.keys(errors).length > 0 ? false : true -// } - -// const Body = function(){ -// return { -// image: newphoto ? newphoto.uri : null, -// mobile: newmobile, -// email: newemail, -// address: newaddress, -// city: newcity, -// vo_code: vehicleType ? vehicleType.value : null, -// fueltype_code: fuelType ? fuelType.value : null, -// civilstatus_code: maritalStatus ? maritalStatus.value : null, -// gender_code: gender ? gender.value : null, -// is_deleted: is_deleted -// } -// } - -// const SaveNoOtp = async () => { - -// let SESSION = await DB.session() -// if(newphoto){ -// // console.log("BLOB BODY", blobBody.image.uri) -// setloading(true) -// RNFETCHBLOB("update_profile_no_otp", "POST", -// {Authorization: SESSION.token}, {}, Utils.blobBody({newphoto, userProfile, newmobile, newemail, newaddress, newcity, vehicleType, fuelType, maritalStatus, gender, is_deleted}), -// function(res){ -// console.log(res) -// setloading(false) -// Utils.responseHandler(res, () => { -// navigation.route.params.onGoBack() -// navigation.navigation.goBack() -// }, (errors) => { -// seterrors(errors) -// }) -// }, function(err){ -// setloading(false) -// setTimeout(() => { -// if(newphoto) Alert.alert("Error", "Failed to upload image") -// }, 300) -// }) - -// }else{ -// setloading(true) -// await REQUEST("update_profile_no_otp", "post", { -// Authorization: SESSION.token, -// "Content-Type": "multipart/form-data", -// }, {}, Utils.formData({userProfile, newmobile, newemail, newaddress, newcity, vehicleType, fuelType, maritalStatus, gender, is_deleted}), -// function(res){ -// setloading(false) -// console.log("Update Res", res) -// Utils.responseHandler(res, () => { -// navigation.route.params.onGoBack() -// navigation.navigation.goBack() -// }, (errors) => { -// seterrors(errors) -// }) -// }, function(error){ -// console.log("Failed", error) -// setloading(false) -// setTimeout(() => { -// if(newphoto) Alert.alert("Error", "Failed to upload image") -// }, 300) -// }) -// } - -// } - -// const SaveWithOtp = () => { - -// navigation.navigation.navigate("AccountSendOtp", { -// data: { -// lcard_uuid: userProfile.lcard_uuid, -// mobile_number: newmobile.replace("+", "") -// }, -// type: 'edit', -// callback: (res) => { -// if(res == "valid") SaveNoOtp() -// }, -// }) -// } - -// const onSubmit = () => { -// setfocused(false) -// if(hasChanges()){ -// Alert.alert( -// "Update Profile", -// '\nAre you sure you want to save changes to your profile?\n', -// [{ -// text: 'Cancel', -// style: 'cancel', -// },{ -// text: 'OK', onPress: async () => { -// let validation = await FormValidate() -// if(!validation) return -// if(newmobile != "" && newmobile.replace("+", "") != userProfile.mobile){ -// SaveWithOtp() -// }else{ -// SaveNoOtp() -// } -// } -// }], -// {cancelable: true} -// ); -// }else{ -// navigation.navigation.goBack() -// } -// } - -// const hasChanges = () => { -// let values = Object.values(Body()) -// for(var x=0;x { -// Elements.ActionOption({ -// options: ['Edit Photo', 'Delete Photo', 'Cancel'], -// functions: [{ -// execute: () => onEditPhoto() -// }, { -// execute: () => onDeletePhoto() -// }] -// }) -// } - -// const renderProfilePhoto = () => { -// if(currentphoto) return Assets.logo.profileHolder -// else if(!currentphoto && newphoto || newphoto) return {uri: newphoto.uri} -// else if(!currentphoto && !newphoto && userProfile && userProfile.photo) return {uri: userProfile.photo} -// else return Assets.logo.profileHolder -// } - -// return ( -// -// -// setopendialog(!opendialog)} -// onSelect={(value, string) => { -// setVehicleTyle({ -// value: value, -// string: string -// }) -// setopendialog(!opendialog) -// }} -// items={Assets.vehicletypes} -// /> -// setopendialog(!opendialog)} -// onSelect={(value, string) => { -// setFuelType({ -// value: value, -// string: string -// }) -// setopendialog(!opendialog) -// }} -// items={Assets.fueltypes} -// /> -// setopendialog(!opendialog)} -// onSelect={(value, string) => { -// setMaritalStatus({ -// value: value, -// string: string -// }) -// setopendialog(!opendialog) -// }} -// items={Assets.civilstatus} -// /> -// setopendialog(!opendialog)} -// onSelect={(value, string) => { -// setGender({ -// value: value, -// string: string -// }) -// setopendialog(!opendialog) -// }} -// items={Assets.gender} -// /> - -// { -// if(hasChanges()){ -// Alert.alert( -// null, -// 'You have an unsaved profile information, are you sure you want to navigate back?\n', -// [{ -// text: 'Cancel', -// style: 'cancel', -// }, -// { -// text: 'OK', onPress: () => navigation.navigation.navigate("MyProfile") -// }, -// ], -// {cancelable: true} -// ); -// }else{ -// navigation.navigation.navigate("MyProfile") -// } -// }} -// navigation={navigation} -// /> - -// - -// -// -// {/* */} -// -// -// -// {userProfile && userProfile.photo && !is_deleted || userProfile && !userProfile.photo && newphoto && !is_deleted ? -// -// Edit Photo -// : -// onEditPhoto()}> -// Add Photo -// -// } -// -// -// -// -// - -// - -// - -// { -// setnewmobile(value) -// console.log(value) -// }} -// focused={focused && currentFocus == 3 ? true : false} -// onFocus={() => onInputFocus(3)} -// error={"This field is required"} /> - -// onInputFocus(4)} -// onChangeText={(value) => { -// setnewemail(value) -// delete errors["email"] -// }} -// hasError={errors && errors.email ? true : false} -// errorMessage={errors && errors.email ? errors.email[0] : "Invalid email"} -// /> - -// onInputFocus(5)} -// onChangeText={(value) => { -// setnewaddress(value) -// delete errors["address"] -// }} -// hasError={errors && errors.address ? true : false} -// errorMessage={errors && errors.address ? errors.address[0] : "Invalid address"} -// /> - -// {/* onInputFocus(6)} -// onChangeText={(value) => setnewcity(value)} -// error={"This field is required"} /> */} - -// { -// onInputFocus(7) -// onSelectPress(1) -// delete errors["vehicleType"] -// }} -// hasError={errors && errors.vehicleType ? true : false} -// errorMessage={errors && errors.vehicleType ? errors.vehicleType[0] : "Invalid vehicle type"} -// /> - -// { -// onInputFocus(8) -// onSelectPress(2) -// delete errors["fuelType"] -// }} -// hasError={errors && errors.fuelType ? true : false} -// errorMessage={errors && errors.fuelType ? errors.fuelType[0] : "Invalid fuel type"} -// /> - -// { -// onInputFocus(9) -// onSelectPress(3) -// }} -// error={"This field is required"} /> - -// { -// onInputFocus(10) -// onSelectPress(4) -// }} -// error={"This field is required"} /> - -// -// -// -// -// Save Changes -// -// -// -// -// ); -// } \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(EditProfile); diff --git a/app/screens/route.js b/app/screens/route.js index e35df087..a8f1af38 100644 --- a/app/screens/route.js +++ b/app/screens/route.js @@ -14,7 +14,7 @@ import Theme from '../components/theme.style.js'; import Notch from '../components/notch.js'; import REQUEST from '../components/api'; -import MainMenu from './main/'; +import MainMenu from './main/drawer.js'; import Login from './login/'; import Splash from './splash/'; diff --git a/app/screens/topup/form.js b/app/screens/topup/form.js index 5b271d73..5553d425 100644 --- a/app/screens/topup/form.js +++ b/app/screens/topup/form.js @@ -128,7 +128,7 @@ class TokenizationForm extends React.Component { let addedCard = await Tokenization.initNewAddCard(this.props.customerId, merchant) if(addedCard.status == 'failed') { this.setState({ loading: false, isVisibleModal: false }) - let message = addedCard?.result?.merchant?.parameters != undefined ? addedCard?.result?.merchant?.parameters[0].description : checkout?.card != undefined ? checkout?.card.parameters[0].description : "Invalid card" + let message = addedCard?.result?.merchant?.parameters != undefined ? addedCard?.result?.merchant?.parameters[0].description : addedCard?.card != undefined ? addedCard?.card.parameters[0].description : "Invalid card" Platform.OS == 'ios' ? setTimeout(() => { Alert.alert("Top Up", message) }, 800) : Alert.alert("Top Up", message) @@ -276,154 +276,4 @@ const mapStateToProps = (state) => { } } -export default connect(mapStateToProps, null)(TokenizationForm) - -// export default function TokenizerForm(props){ -// let { -// isVisible, -// onGoBack, -// amount, -// onSuccess, -// } = props; -// const [loading, setloading] = useState(false) - -// const onCreateVault = async (card) => { - -// setloading(true) -// let merchant = await UTILS.createMerchantDetails() -// merchant.card = {card: {name: card.name, number: card.credit_card, expMonth: card.expmonth, expYear: card.expyear, cvc: card.cvv}} -// console.log(merchant) - -// let checkout = await Tokenization.initCheckOut("", "", merchant, amount) -// if(checkout.status == 'failed'){ - -// if(checkout.result.merchant.parameters){ -// Platform.OS == 'ios' ? setTimeout(() => { -// Alert.alert("Top Up", "\nUpdate your profile first before using this feature.") -// }, 300) : Alert.alert("Top Up", "\nUpdate your profile first before using this feature.") -// } - -// // alert(JSON.stringify(checkout.result, null, '\t')) -// console.log("RESULT CARD", checkout.result.card) -// console.log("RESULT MERCHANT", checkout.result.merchant) -// setloading(false) -// }else if(checkout.status == 'success'){ -// console.log("RESULT", checkout) -// setloading(false) -// onGoBack(); -// onSuccess({ -// amount: amount, -// data: {redirectUrl: checkout.verificationUrl, card_number: checkout.card_number, type: 'create'}, -// // onBack: (res, msg) => props.route.params.onReload(res, msg) -// onBack: (res, msg) => alert(msg) -// }); -// } - -// setloading(false) -// props.onGoBack() - -// // let client = {} -// // client.card = { -// // card: { -// // number: card.card_number, -// // expMonth: card.expmonth, -// // expYear: card.expyear, -// // cvc: card.cvv -// // } -// // } - -// } - -// const onAddVault = async (card) => { -// setloading(true) -// let ccard = {card: {name: card.name, number: card.credit_card, expMonth: card.expmonth, expYear: card.expyear, cvc: card.cvv}} -// let checkout = await Tokenization.initAdd(ccard, props.customerId) -// if(checkout.status == 'failed'){ -// setTimeout(() => { -// alert(JSON.stringify(checkout, null, '\t')) -// }, 700) -// console.log("RESULT CARD", checkout) -// setloading(false) -// }else if(checkout.status == 'success'){ -// console.log("RESULT", checkout.link.maskedPan) -// console.log("CUST ID", props.customerId) - -// if(checkout.link.code){ -// console.log(props.customerId) -// }else{ -// onSuccess({ -// amount: amount, -// data: {redirectUrl: checkout.link.verificationUrl, card_number: checkout.link.maskedPan, type: 'add'}, -// // onBack: (res, msg) => props.route.params.onReload(res, msg) -// onBack: (res, msg) => { -// Platform.OS == 'ios' ? setTimeout(() => { -// Alert.alert( -// 'Add Card', -// `\nYour new credit card has successfully added to your account.`, -// [ -// { -// text: "OK", -// onPress: async () => { -// await props.onDone() -// } -// }, -// ] -// ) -// }, 700) : -// null -// } -// }); -// } -// } - -// setloading(false) -// props.onGoBack() -// } - -// const handleJustu = async (card) => { -// if(props.type == "create"){ -// Platform.OS == 'ios' ? setTimeout(() => { -// Alert.alert( -// 'Confirm Top Up', -// `\nYour credit card will be used to pay ${parseFloat(props.amount).toFixed(2)} points.`, -// [ -// { -// text: "NO", -// style: "cancel" -// }, -// { -// text: "YES", -// onPress: () => { -// onCreateVault(card) -// } -// }, -// ] -// ) -// }, 700) : -// null -// }else if(props.type == 'add'){ -// onAddVault(card) -// } -// } - -// return ( -// -// -// -// -// -//
-// -// -// -// ) -// } \ No newline at end of file +export default connect(mapStateToProps, null)(TokenizationForm); diff --git a/app/screens/topup/index.js b/app/screens/topup/index.js index f82826e9..750b8cb1 100644 --- a/app/screens/topup/index.js +++ b/app/screens/topup/index.js @@ -342,7 +342,6 @@ class TopUp extends React.Component { } render() { - if(!this.state.connected){ return ( @@ -418,7 +417,7 @@ class TopUp extends React.Component { - {this.state.creditcards.length > 0 ? + {/* {this.state.creditcards.length > 0 ? @@ -442,7 +441,7 @@ class TopUp extends React.Component { - } + } */} {this.state.creditcards.length <= 5 && ( this.initAddCard()} style={{flexDirection: 'row', alignItems: 'center', padding: 15, borderBottomWidth: 0.5, borderColor: 'lightgray'}}> @@ -453,7 +452,7 @@ class TopUp extends React.Component { )} - {this.state.creditcards.length > 0 && this.state.creditcards.map((card, index) => { + {/* {this.state.creditcards.length > 0 && this.state.creditcards.map((card, index) => { return ( @@ -487,7 +486,7 @@ class TopUp extends React.Component { ) - })} + })} */} {this.state.topupCount >= 5 ? null : @@ -515,494 +514,4 @@ const mapDispatchToProps = { saveUserInfo } -export default connect(mapStateToProps, mapDispatchToProps)(TopUp) - -// export default function TopUp(navigation) { - -// const [connected, setconnected] = useState(false); -// const [isCardFormVisible, setCardFormVisibility] = useState(false); -// const [loading, setloading] = useState(false); -// const [popup, setpopup] = useState(false); -// const [Task, setTask] = useState(""); -// const [DisplayAmount, setDisplayAmount] = useState(""); -// const [amount, setAmount] = useState(0); -// const [focused, setfocused] = useState(false); -// const [checkoutResult, setCheckOutResult] = useState(""); -// const [userProfile, setUserProfile] = useState(null); -// const [topupCount, setTopupCount] = useState(0); -// const [merchant, setmerchant] = useState({}); -// const [creditcards, setcreditcards] = useState([]); -// const [activeIndex, setActiveIndex] = useState(0); - -// const init = async () => { -// setconnected(true) -// setloading(true) -// await countTransactions() -// let User = await DB.profile() -// let ses = await DB.session() -// console.log("tkn", ses.token) -// await getMerchant() -// await setUserProfile(User) -// setloading(false) -// } - -// const countTransactions = async () => { -// const SESSION = await DB.session() -// const USERPROFILE = await DB.profile() -// await REQUEST("transactions", "get", { -// Authorization: SESSION.token, -// card_number: SESSION.user.card_number -// }, {}, {}, function(res){ -// let count = 0 -// if(res.data.length > 0){ -// for(var x=0;x 5){ -// setloading(false) -// Platform.OS == 'ios' ? setTimeout(() => { -// Alert.alert("Top Up", "\nYou have reached your maximum top up for this day.") -// }, 700) -// : -// Alert.alert("Top Up", "\nYou have reached your maximum top up for this day.") -// } -// }, function(error){ -// console.log(error) -// }) -// } - -// const handleDelete = (id, token, uuid) => { -// Alert.alert( -// "Delete Payment Card", -// "Are you sure you want to delete this card?", -// [ -// { -// text: "NO", -// style: "cancel" -// }, -// { -// text: "YES", -// onPress: () => { -// setloading(true) -// Tokenization.initRemove(id, token, uuid).then((res) => { -// setloading(false) -// if(res.result == 'OK'){ -// Platform.OS == 'ios' ? -// setTimeout(() => { -// Alert.alert("Deleted Successfully", "\nYour credit card has successfully deleted.", [{text: "OK", onPress: async () => await init()}]) -// }, 700) -// : -// Alert.alert("Deleted Successfully", "\nYour credit card has successfully deleted.", [{text: "OK", onPress: async () => await init()}]) -// } -// }) -// } -// }, -// ] -// ) -// } - -// const getMerchant = async () => { -// const SESSION = await DB.session() -// const USERPROFILE = await DB.profile() -// await REQUEST("paymaya_tokens", "get", {'Authorization': SESSION.token}, {noID: true, value: SESSION.user.card_number}, {}, async (res) => { -// console.log("MERCHANT", res) -// if(res.data && res.data.cards){ -// setmerchant(res.data) -// console.log("MERCHANT", res.data.cards) -// // let accounts = await Tokenization.getAccounts(res.data[0].customer_id) -// setActiveIndex(0) -// for(var x=0;x { -// NetInfo.fetch().then(state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ -// init() -// }else{ -// Elements.nointernet2() -// } -// }) -// }, []) - -// const moneyFormat = (price, sign = 'PHP ') => { -// const pieces = parseFloat(price).toFixed(2).split('') -// let ii = pieces.length - 3 -// while ((ii-=3) > 0) { -// pieces.splice(ii, 0, ',') -// } -// return sign + pieces.join('') -// } - -// const setamount = (value) => { -// setDisplayAmount(moneyFormat(value).toString()) -// setAmount(value) -// } - -// let current = "" -// const onAmountChange = (value) => { -// if(value != current){ -// let parsed = parseFloat(clean(value)) -// if(parsed > 1000000) return false -// let formatted = formatCurrency(parsed) -// current = formatted -// setDisplayAmount(formatted) -// setAmount(parseFloat(parsed/100)) -// console.log(parsed, formatted, current) -// } -// } - -// const clean = (str) => { -// return str.replace("PHP ", "").replace(".", "").replace(",", "").toString() -// } - -// const formatCurrency = (val) => { -// let fv = parseFloat(val / 100).toFixed(2) -// return val.length == 6 ? "PHP " + fv.substr(0, 1) + "," + fv.substr(2, fv.length) : "PHP " + fv -// } - -// const validate = () => { -// if(amount < 100 || amount > 10000){ -// Alert.alert("Invalid top up amount", "\nPlease enter value between 100 - 10,000 pesos only.\n") -// return false -// } -// return true -// } - -// const onReload = (res, msg) => { -// // setTask(msg) -// // setpopup(true) -// // setTimeout(function(){ -// // setpopup(false) -// // }, 1200) -// // navigation.navigation.navigate("Main") -// } - -// const InitCheckout = async () => { - -// if(!validate()) return false - -// console.log('merchant', creditcards[activeIndex]) - -// if(creditcards.length > 0){ -// // HAS AN EXISTING MERCHANT TOKEN -// let mct = creditcards[activeIndex] - -// Platform.OS == 'ios' ? -// setTimeout(() => { -// Alert.alert("Confirm Top Up", "\nYour card number will be used to pay for "+parseFloat(amount).toFixed(2)+" points.", [ -// {text: "NO",style: "cancel"}, -// {text: "YES", -// onPress: async () => { -// setloading(true) -// let payout = await Tokenization.initPayOut(mct.customer_id, mct.cardTokenId, amount) -// console.log(payout) -// if(payout.isPaid){ -// if(payout.status == 'PAYMENT_SUCCESS'){ -// const SESSION = await DB.session() -// REQUEST('topup', 'post', { -// Authorization: SESSION.token, -// card_number: SESSION.user.card_number -// }, {}, { -// amount: amount -// }, function(res){ -// Platform.OS == 'ios' ? setTimeout(() => { -// Alert.alert( -// 'Transaction Completed!', -// `\nYou have successfully paid ${parseFloat(amount).toFixed(2)} points from your credit card \n**** **** **** ${mct.maskedPan}.`, -// [ -// { -// text: "OK", -// onPress: () => { -// navigation.navigation.reset({ -// index: 0, -// routes: [ { name: 'Main' } ], -// }) -// } -// }, -// ]) -// }, 700) : -// null -// }, function(error){ -// console.log(error) -// }) - -// }else{ -// setTimeout(() => alert(JSON.stringify(payout)), 300) -// } -// setloading(false) -// } -// } -// } -// ]) -// }, 300) -// : -// Alert.alert("Confirm Top Up", "\nYour card number will be used to pay for "+parseFloat(amount).toFixed(2)+" points.", [ -// {text: "NO",style: "cancel"}, -// {text: "YES", -// onPress: async () => { -// setloading(true) -// let payout = await Tokenization.initPayOut(mct.customer_id, mct.cardTokenId, amount) -// console.log(payout) -// if(payout.isPaid){ -// if(payout.status == 'PAYMENT_SUCCESS'){ -// Platform.OS == 'ios' ? setTimeout(() => { -// Alert.alert("Topup Success", `\nYou have successfully paid ${parseFloat(amount).toFixed(2)} points from your credit card ${payout.fundSource.details.masked}`) -// }, 300) : -// Alert.alert("Topup Success", `\nYou have successfully paid ${parseFloat(amount).toFixed(2)} points from your credit card ${payout.fundSource.details.masked}`) -// } -// }else{ -// setTimeout(() => alert(JSON.stringify(payout)), 300) -// } -// setloading(false) -// } -// } -// ]) -// }else{ -// //PRE REGISTRATION -// // navigation.navigation.navigate('TokenizationForm', {amount: amount, onBack: (res, msg) => onReload(res, msg)}) -// setCardFormVisibility(true); -// } -// return - -// // navigation.navigation.navigate('CheckOut', { -// // amount: amount, -// // data: {redirectUrl: "https://payments-web-sandbox.paymaya.com/authenticate?id=" + payout.id}, -// // // onBack: (res, msg) => props.route.params.onReload(res, msg) -// // onBack: (res, msg) => alert(msg) -// // }) - -// console.log('initializing...') -// setloading(true) -// const details = { -// "totalAmount": TotalAmount('PHP', amount), -// "buyer": Buyer( -// userProfile.data.firstname, -// userProfile.data.middlename, -// userProfile.data.lastname, -// "+" + userProfile.data.mobile, -// userProfile.data.email), -// "items": [Item('Top up', 1, 'N/A', 'Top up points', TotalAmount('PHP', amount))], -// "redirectUrl": { -// "success": "https://unioil.herokuapp.com/success", -// "failure": "https://unioil.herokuapp.com/failure", -// "cancel": "https://unioil.herokuapp.com/cancel" -// }, -// "requestReferenceNumber": Ref(), -// "metadata": {} -// } - -// CheckOut(PAYMENT_ENV, details, function(result){ -// console.log('CHECKOUT RESULT', result) -// setloading(false) -// navigation.navigation.navigate('CheckOut', {amount: amount, data: result, onBack: (res, msg) => onReload(res, msg)}) -// }) - -// } - -// const InitAddCard = async () => { -// setCardFormVisibility(true) -// } - -// if(!connected){ -// return ( -// -// -// -// { -// NetInfo.fetch().then(state => { -// console.log("Connection type", state.type); -// console.log("Is connected?", state.isConnected); -// if(state.isConnected){ -// init() -// }else{ -// Elements.nointernet2() -// } -// }) -// }} -// /> -// -// -// ) -// } - -// const getDisplayCard = (type) => { -// if(type == "visa") return Assets.icons.stpvisa -// else if(type == "master-card") return Assets.icons.stpmastercard -// else if(type == "jcb") return Assets.icons.stpjcb -// else return Assets.stpunknown -// } - -// return ( - -// -// {isCardFormVisible && ( -// 0 ? 'add' : 'create'} -// customerId={merchant && creditcards.length > 0 ? merchant.customer_id : ''} -// amount={amount} -// onDone={init} -// onBack={(res, msg) => onReload(res, msg)} -// onGoBack={() => setCardFormVisibility(false)} -// onSuccess={data => navigation.navigation.navigate('CheckOut', data)} -// /> -// )} -// -// -// -// -// -// Select Top Up Value Points -// -// - -// -// -// setamount(100)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 2}}> -// 100 -// -// setamount(500)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 2}}> -// 500 -// -// -// -// setamount(1000)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 2}}> -// 1000 -// -// setamount(5000)} style={{flex: 1, margin: 10, padding: 10, borderRadius: 10, borderColor: Theme.colors.primary, borderWidth: 2}}> -// 5000 -// -// -// - -// -// -// Or Enter Desired Value (maximum of 10,000 points) -// -// 0 ? "PHP " + parseFloat(amount) : amount} -// onFocus={() => -// setfocused(true) -// } -// onChangeText={(value) => onAmountChange(value)} -// containerStyle={{padding: 0}} -// inputContainerStyle={{padding: 0, borderBottomWidth: focused ? 1.75 : 1, borderColor: focused ? Theme.colors.accent : "gray" }} -// inputStyle={{padding: 0, fontFamily: 'Arial', fontSize: 16}} -// /> -// Note: Top Up to a maximum of five(5) times per day. -// - -// -// -// Payment Method -// -// - -// {creditcards.length > 0 ? -// -// -// -// -// -// -// {creditcards[activeIndex].cardType.toString().toUpperCase()} {creditcards[activeIndex].maskedPan} -// **** **** **** {creditcards[activeIndex].maskedPan} -// -// -// -// : -// -// -// -// -// -// -// -// 0000 0000 0000 0000 -// -// -// -// } - -// -// -// -// Add New Card -// -// - -// {creditcards.length > 0 && creditcards.map((card, index) => { -// return ( -// -// -// -// -// -// -// { -// Toast.show({ -// text: "**** **** **** " + card.maskedPan + " is selected.", -// buttonText: "", -// duration: 1500 -// }) -// setActiveIndex(index) -// }}> -// {card.cardType.toString().toUpperCase()} -// **** **** **** {card.maskedPan} -// -// -// -// -// -// -// -// ) -// })} -// -// -// -// {topupCount > 5 ? null : -// { -// InitCheckout() -// }} style={{padding: 20, paddingTop: 15, paddingBottom: 15, width: '100%', borderRadius: 10, backgroundColor: Theme.colors.primary}}> -// Next -// -// } -// - -// - -// -// ); -// } \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(TopUp); diff --git a/ios/RNUnioilLoyaltyApp.xcodeproj/project.pbxproj b/ios/RNUnioilLoyaltyApp.xcodeproj/project.pbxproj index c481d973..4d0d24f6 100644 --- a/ios/RNUnioilLoyaltyApp.xcodeproj/project.pbxproj +++ b/ios/RNUnioilLoyaltyApp.xcodeproj/project.pbxproj @@ -1065,7 +1065,7 @@ CODE_SIGN_ENTITLEMENTS = "RNUnioilLoyaltyApp/Unioil Loyalty App.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 4; DEVELOPMENT_TEAM = J29MB7XX75; ENABLE_BITCODE = NO; FRAMEWORK_SEARCH_PATHS = ( @@ -1240,7 +1240,7 @@ CODE_SIGN_ENTITLEMENTS = "RNUnioilLoyaltyApp/Unioil Loyalty App.entitlements"; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 3; + CURRENT_PROJECT_VERSION = 4; DEVELOPMENT_TEAM = J29MB7XX75; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", diff --git a/ios/RNUnioilLoyaltyApp.xcworkspace/xcuserdata/macbookpro2017.xcuserdatad/UserInterfaceState.xcuserstate b/ios/RNUnioilLoyaltyApp.xcworkspace/xcuserdata/macbookpro2017.xcuserdatad/UserInterfaceState.xcuserstate index 8003731e7c2d8dfc81f4417ded0fa636c628cb7f..c9872bfe824fe493a35912b95dd180315606abfa 100644 GIT binary patch delta 46961 zcmZ_V1z;4{_W1FcWF%--XJ%&>O>lR2cXyZIRtPT1#oYo74uPOGC{Wr`B+ydoEmAk? zPTN;E{@=-lLVxN1z4zH}voq(Od(Iu%N#1Y&OZf7Yg!RMZg2#uqNl4q0xIJ-4;-194 ziJ6J_Cq9sPJn>ZGqlr%>o=JQ%@p9rbi7zC+lK5)kjl|ayUr)T5_+jE_iC-mto%mhi z_lZ9w{+alfFV3g=bYB5qL0=)C>9c%Ad?kD(eWiV6d}V#reKmY_eGPq$e9e5#eJy;Q ze4Twge0_cWe1m+0eM5X>edE%6lYFVZ>Ao4hbf54o@vZc&@~!r5@wvVozCFIZzD(c! zz6X5Ad?$UUe2@Ar__BRZ`=0eZ=X>6F!}pr+E#G^-_kADuzVvNHzT1Au zulN)E`TY6)A%EB(@fYzI^%wJ(^OyHm_E-1U@YnP=_BZjj@VD`|^{2J-_we`h_w^6- z5AqN8kMWQ7PxRmCpX#6HpYLDbU+7=zU*=!#-{{ZqyZ#;io&H_^L;l152mHtU$Ni7^ zpY)&gXZxS_U-m!af7O50|C;|T|J(j|{Ga+i^MB>P<^RtAz5fsYp8+YL2DE@4@CO0` zBVY%dKr~P~P$p0zEl?#;HBc?kAkZ+-G|)28D$qL6HP9{4E6^{{KQJJW5*QU27nl^7 z9GDWA6PO!F3oHsO4lD_*3#<=p3TzE*3v3T$1r7v`1Re}L6nHrBc;Jb^xxmH1rNC2x zmjW*bt_5BXyb*Xa@KNC7z~_Ol1K$L`4g4DTE$~-R4#oxJgK33=g@b{h5j2BVuw*bP zSSDB@STR^BSSMIF*f7{M*euvQ*fH2C*e%#A*gM!KI4n3kI4U?UI6gQbI3qYSI5(IU zOb?3Ss^IG2`rxME=HQm#-e6|%K=4TLXz>2vso#{uulz_;W}K$sskAFO)x2AQTQ6Av;twR4i0HR6bN8R3%g+ zR5Mg7)Fjk2)H2jI)GpLM)HBp8)GstBG&nRQG&VFYG$}MSG%b`GS`bPLEeb6QEf1{- zWrQ|`wuW|wc7=9_4u_6}9t<51JrX(*IvY9{x)@5k9C{{nC3H1(E%bWm?a(`+cSE0r zJ`a5p`abkS=;zQcphwl7LJ>x^;BjYpUE8}b98{>Q9 z2X&C~KjTN^cjFJ^Z{xP9nwnYIOf-FFd9#99(X3=vHmjIb&1z=#G_!_T)2wASFdLf9 z%noKpvy<7`>|%B``1@gYH5~k6|nqPzzSN96}5_3MXh31vQ^fqXjQUmT6L|4RwJvi)!gcAb+Niy z-K_4`U~7mq)EZ_Dw^FR})&%Q5YpylVnr|($mRl>Vb=G=oleN{_Y3;SLtS789)|1v* z>zsAox?p8n7p+Uyi`Gll%hoGt);rb*)=ldZ>r?AX>nrP)^<5+(k}r}!QXo<=QYcb5 zk{Izt{EM&POgpvLhEG&qbb(d=&XO@=4^=$Y+tyBVRXOI`U2A`^c}6zazJ8 z-A=H5w%@K{*Rku`4edsDGrPIn+HPZaushma?QV82ySLrn9$*i#huS0U6nm^a&YomX zwx`*t_AGn0JwMG}U@x|p*sJW-_Ii7(z1`kpAFz+u58J2gN9`x<3wE~sw0*^X$$r_s zX1{5_ZQry%vA?pvw|}z#aAYUW(VT)#q7!f|C*l-wlAKab1*eKr%W2>=aauVYoQ_Uc zr?)fE8S0F3MmrOoNzPPfmNVN)a~3%(oU{zbb+$S?on6im=cseP^MLc9^N{nfbHaJd zdE9xzx#(PSo^q}@SDkClb?1ijrt_ZjzVm_ex$}kdrSpUHKj%m1C+FvATr@taMAfJk z)uRc~f>D1o5VfODG#V`uEgCHuEgLNtEgx+jZ4qr5Z53@DZ4+%9Z5M4nG}DU|g>*&>vk zLfI#j!$NsTC?|#TgitOB<+4y-5Xx1dydjkLgz~Xaz7)!LLit%Je+o5Ds0l(XEYy%t zZJ`zyYH6WX6l(Q8Lai&*#zJi=)b>K{D%9RW9W2yQLY*MgsY0D4)CEFaEYy`kT`$xv zLft9UeL_7f)MG+@RH)~KdReG12=%H^-w^71Lj6>zU!SO6T()MbTft>48|$RZnh>b z&=Pm%Ps(3D3)DI?adI-Py7{C!^`<#>t6i6SMP< zbTRQ#;!{GYCY0(zsS_LNiZ{};iO&h8hEQsGBgG}Y=vIrDLvqdB*jMAP%V*tM@pods zk@!yD*zYF3m-xO=>ItR3P@2SIf8@pfIPnvqG!ROo*epJezfQQ=EaotaIo>Q9=8p7D z{B`9q_j^U2vqh7eC;cz+m%Ic0n)qAd??Rz5&4tn?HqhVRK(~F8P+AD3Rn9=ZcuJp? zJJ1#e+Tsn=(iy)a>%`)$>Va$ecwspO!ixf2p{X4EX%SI$={??9D(ReT&t-GtIzD1BlB z)$|6c<*O}}9zy9A8>rqr1HHsRFL?v?j1AN{XP^rCa|SA$QRtBx$-b7pws{9@=WFjH z_kKd@FO(r}W&znO+{GKLtB(W*2xX8rSk%{39i$G5)z8;k&IW@GOmFL#d${R^pyj}ym; z*kmXBrue4hMxM&}Q@!y=x^oK2&m_(C&CMHfo^QU7(+yF_2xYu0d~(rz3%!_&gfcc3 zb7@YzoWr2sg)&Jf_r+pv^OdXX;)Wv&-F&Ue|p;OG8&UV7Vf$?djDuJ1Ng z<$~_spq$Sw8<5W?z2JK#Z`@aXSAExnk|vaNp)AUY`??pG^R|e^ecNpoltb|g$?>L; zTe!s)S@oh`NxJF#ByYe^eV_S07s?W$EEUR%oPb|@0lyK-vRJ_HGHyP>`Eoqt^Wxo@T9TX%Hhn4<^NRn4yfI(&zvO>eD9;Gxicp@9 z#k}Ulye^byV=-U9yUgQXle0n0=VCG6_20}J^F#kfe(vL56v|6Nc{LXEb1&u>LU}nS zru?;=olI9=iADLr|8w3bzxaRk|0WbpIi&J>EXrSAl)r^?!|hgHwru%sW`TG)8)Wuc zdRt$0_xs}V)#N}zpkSWBfkJ`8fkdIaDU`Q_@~(H@2?U872nprwoVbR0_fkvOvq9W< zwzQF(xfjaI&E0Ry$Zk@RK#9DuO9qkx$wJ{?=mVjAloPwG7rUHLZsx?6E4nw!GV>4r ziI&mvrA^6!>VevMqtyx24b&3~w@{x7<%^tXjl5`$h4NV}(`Iq?J-k#4kemRVaUCG^=9d56trd&lk#XvB2pC8Ww1ndu)EqvH7(Z_;X_1Bi)PdXMjnK$OC zz@vfFLd_@C{6Z}hi+RS2`J_+_#A2S8pXa|h$;OZ703GecEEtRVbl};%F`o-OAK;5m zqELN84aQ==;>CPbsQy^Y>-rJ>NGzsWUCstE1F@KI1>VaW^ZmdFftx}N3)K*6Bo^}% zFDBor%vj7X)WhoGSWHgy*&wDBi+L;Xzq~Pj4Ez-MS*VUsqe3kfi}|}3^ADjGiN*X| zeL;O8x1M)am0C3C05~>6wlntbOwRZ{eROhA2`1zjAeb+hKUhGhC4^d1sHMDB8%!jA zkg_DX$6IpW5RBtLvG~eyIUD4heELFNxwM=V2^Ps4vuLnbkngEwgj!ap6>?%GdofE1 zwOlM_*|^DZlVdUO_N%;0%v?hO3$;p4 zT)C0^Y6DI!RWq6{Z|r_hO!j50TVBH*-B8}0)FRj>Z^X92c0s;7*AQw=q1MTX*x8HN zMX0r65xcv?8WFMfe?;sX9GExapy1%(5TVu+Dp@tki8#WGI8vw$Vi8BX-!~>=LvOaO zyQ_)3E@@)$zPyp92B!s6h1x`@O@-RR?bcL|=9}e(nl033u`!5{tRdi@9H@onkQ$CcK&OW-MmH+ni9|_LA*QZ_LZVXM$IR z$^(?XLgnioPaJ|T@D(ulV(=xQ_7m!WSm0OhepmnJvaj~%$P(`S6gjK~Ut@#OZu8di z#*8Af+aw3y34V}ww41>XgC7Z%MKM&UDY4N$^G5qT_=Ql133Wtlw6E_O?FY_bKX~;S zzGV!T+@W!NFKOCNuA8yCc{ncky?e7QU*Frbl^12yZ^5{~1pml8?w`TGf}Gt)3w4Z8 z$Ge#wSwC@9F2u<>_I)s<UniZZli{p8S|(EhwJvqA?#2Zibib*oT!#9|)xV%{&*ZLy3WQWh(V zV@1hdkViuWy`pS){XONZq?4h?^2U5T^hD^4P zV&1(0*y~jxHRJ1Eqmo0F8l@Ok zwzIUid(j{8qOVf_7q=wgP4_|{d1=Pq@Apm){TBKw??8WtZigkI9vA8(LOqpJ?y$lP z!m3bDxXngzPmpl;@VR>*bJ9KDPrjN|IGp!cVmKHMg}E`}HjeZ5SubW{*n5^3w!_@p zJTBBTvA{(Mm;3!!Yrwa+243<{xSfZ{Y3`f>vLPqA8wPOh`@O%MzHv-Fckn>DTT;1j z-iM0e%Hb;EszN<4R66=}Y((#&Vz^egwotQ$dMP$yy}KjIpKwd|i8tcKyCbTN<44Ec za*aXq`i)~&B!^pu^FCAzw+puqcM$3`Lgl*he5_jpbym5X_>K7iArw!r3;UVFnLVZ!FT$Emo#T@CyOcCnKv6y4-#=M*RD_%^I(PTo@ z?LAEHm^3LoHE-}~;neVSp_ zyex0D<>3`!e#!8rP~Q@2&iBdiS})i-q4Gq`TQD1ymz9@u7v%>m$`8ERzms#mJ=Rw) zlJUxV{;u%u@E)PQFVqi&`bo|uG`!#IWmforP;UzLqu3~i@41BD z`JS$R=-wVFZ&Dx3xmJHWQeKyHtqz|E=Y75qek}ZW_z9tYCe+V``cP z7#Hu>ywK0gbFAuJ{H=0%n+sl zw_>4RzZ<$RCovHEJ3=2R@UC<&GyI-Ve@t)eemO=i7P&LlhvAQ<@|j_7Fn-Pqb9(s2 ztuj_FUFD1Lw^I46@R#AQ!e56O^H-t%Ce+`B`bSpyR`|Q{_u(Ie`lnF;5-Rryx822K z<=IyFkMN)2zrufqZ%c`WWXMttIonVS)eVo6YZq08CMBdxLQ{mMU1tm3NHFpl`8j6J z83o<3oqcEM&;>OrKQp`BVYuF_!2w! z=rlcb*zgG{J#x0$&yPdWs=l3j#Qr_DsbQEyeBpL2TQwh+I$})gv6Du2o1QXtcF&Zl z6ZaXGwCdguT^^!WiH{mZ+%eT7uB>2`#_S z3S=3jjWR}AqqNWp3azlv5_#iZ7%z_vRyC?g#@@aBx-cgZX{AxqZ8$+L8>(Z}lZ;HG zuF!m$Mt!0A*~D!&L3Z+a6K`xZF`BwNC&k$Zt4w8xDn2HstfDXII7$E6F>s;k~1Z9FNR&NR*n zt$upL*Nh8BwsDakUNWBI0J)4S#kIc-~C1Tc$V>! z@v`xX@v6`o39XsXS_rLWdWUPqb>jwsUNc@d-ssU}eCMa1$9~!>_EYyvs$4hzTjQ4dbE;fP{?1LFE|2v8WbkXqOyg&v zb;>k;6dT)Beq^7g4NZx;Pmxn2tacpkNLhI&!HeIgd)6M)WHZ#HG znCl_5o^J9Cxl@|o3wEnlTLDIj!SQNXZz-6YsuJewlG_ot%Q~$v{6DEz29sjl{GmW#&|1xtal(k zJX@~ZydNpG8aXy~^3cf;Wc=?Y_JDjx@(}fSW1iD08$q z#vE&o6WUavO%qzG(54G*hR|jnG$)u7%}KmY@lIB=gf?4f8*<(}$cd|>``jFPcB#2$ z8W(wUo;lxKAhbC`n=7<=`^|JNO}B(L-|M0Jr#oh@+`Qs)E|KO6p)E-7@P@hCTw|^^ z*GY-ydUJ!h(abP6$=T)>)8%!Wx!rwxu6(TdI-#xcj=?mct@r-9N@#2UbKzuZsKfJlSxk2)SrUGs_$QfY28HbF`X=rTyN4wn(Ty zaG<%}R>`Fbnh%)|%h^I(Dzs(Zul|N`E#N|Do-j|kx8}=6{66!P`^|hgYMeG7Gav6i zWmxK%*i}wwD}}bgEw(^zGU!S3?0}ZNd$t}sA*CxD>@&|vtM2{5HS+><&t|rl%!m4L zaUDKvTFLRDWwM5ARnc<`+WSa;NCNMDy!d)%gR!pV0QDcerj9lpmK*NQqV^`$XE>^C>C42asFLMuZD`c6R`mC^J2<@QI4(+onD}xindottzoXTQ!7sLTC@)Q|L!>3T@T$W?Nfm$Ldbx)_s+v>gJI8a*aZ?;RUgiEY+7p7s@LVXctzFpWcT=Lxo(m767uCQ zP_R(pM4vwp422ETir7xHNYP@&OO#A<3$BrC>Ag8Uv}@PW?YBnWUN=21T~Ali^ZU~i zeR8^*&ci={!nB8d;Zmi`lr2}jLd6<2>o;%Pu6?JTy?XZ>*eiL`^a&G&_?)V4#kKND zty1MGRjXBZKV2)APmE7b=sl!!kNWj$U#(TUPF;7(S-!H@SSOdPU8f$m_g#jM<1o6` zpkbv(O`3TV8J{wHT7UjIIp>3EnT^v6WHwDtOb=db(Xvvj)@|HX>*R68YSr%0aWG#F zModjfnH0Nj?dwqQdgm^cx^^qpy@wlGFOQR}x@qg>iWO?r?$eiT`|x#P^32?A`_v}O-_P+l0+}GC2#nVPfsnR@Yy|hExC!LbArR&lM(w}lbF2Zj)YRPrv zdU6A~q1;$*DmRx~%5CI!atFDS+(qurm{a7n@+SGWxWaLXab@Bv$JL5!9M>zZPh7va z0dd3QM#oK!n;W+?Zcp6dxQF9T$6btjD(-UJmAL2PUWmIE_icQ9yc(~k#pjE!8s9L! zS$x;{9`OU?7sT(0KNEj8{(O9P{9Exq#Q&mbN$LTlcNDxS^p}NxRp=iH{kBMuL_(ZMh# z2<<(geIT?Ch4yil^}6+j^`^!CTq*t*dRXWc(ktF`5wzaVz2Lp?{SnWg;6GPK>*L%H zZo1i<pA{_LC=l#Y~> zjD3+Z5yt&RXus~W21F`wmKEA>-bU$L<;q2?M{0T7)QHp+8fW0Y{?9fqY?X_QY#8Ae zX-6ZCB8?+WB26RBBF!T$A}u4WBCUmXTj-L|WueCjJznUF&{d&pLf3_!a5U03w*(y{ zog$qnL03wk=gTdDUQpv4B^VL0JVGzvRUzl~pUXpJ zY-GGwfN?@Elo^>I^ul)wFeNh0o7{boGD1(J2KyqZ)&QaVa%xb>t++!jnHHHFSrDth ze6Ip}$g4oAw}rP|p}`|3kC;A@uW21qCXG%VbEoQyBkR19EQu_QEQ>6Utca|Ptct9T ztck1@x*>E^=wurax-E1^=ux2;5qeRf7dskRpIeemk;73_+3CA+d+#ja{o$U#EqfJtFmV}w3g=&3@VDfBr)PZ#NV@_k-r{lmGspY3>ItU2WgL_Gp#+ zL2I|`zdvZ7`$1cG`@cWvlKVk>_v3$m&@=agj&9}s{~DuT?gyRSS^xfEaP9|P-HZSJ zU_|Z*-Q9v&{|YrG_k*5p?|*+VG53Ss?%scYFg5pszV4U*{$OVA2mRey_sg|IcfYUM z^Kw5K=vJ98*Shok)=skpw~#j78Jx-4h@0L$hvlMfkrT2Wu$S7)y$_cOeQ2h=Lg>T1 z50gsR-f!z|&Mm{!JMj2Oe%#(5pRhOD8FIE%!){=^ZpSpaXtF*sT}lvobD@v;=Y~^l zYq>&;-E7)B?47PJUA7f_m%ZDqoGw=zm3v0B_uBjJj=W#!qr5L6JP5PB(~r&RXY_v! z-PCqP?x-!jQDe94_A&brFW7ORkIl4C2z^}6G%DHN@A2)&gg*YiVx6VIX?-hSgw7Hx$-?Vma-$8+jv`6in(vZedrVc8fRPhf|u_5A+|+|Ma+rv{yczJMCUn&1?o z20D*fVkLKc)}H2)a<}46&zx z@PuOb7ThWAl>MhfPC213%`K7R{r!N$#bw!l1s~y+C@pqabiZ38r?%rgxr-fVPCcQo zxD&0R7p;-dSN>PDF?S2z^PXU>ownYrIhC)@bU2%@`FFu5yAK_f!)cwo$dq&Ke?^{n zH*)WLBKL9nd1>aHE1dp9Uw2_Po2X2HrE#m5%q91zxV1@ z;F7Z?_x!rcZTx^d^zP-$*^&Ff9{2bI^1$lOZiinmWI21By-udHPw1IK=aq9@R+f|H z9B>XgoZb!y{h-i!^U%GIhsrs}yxDLfJABXMA?KuX%6ZiC3H^Sd9~Jr$9twF$46dBi z?5T2r_XlmboqL{e&N%1({XEDy?_3c2144h0aeNQSVYkg`Ia<$o+PR$js33L@b)I#+ zzcp~4bDnoNcO4TtNj$ROdC7U%c}3`)RG$#~Ib!Tx%%jWoOXP?<>tT6(Ip;Mm;n#(J z^4^5sa^7~{@e)2Q^hbrxgPWsXae7rG;WCT*EqH3xorG^X{Ce@;2UyN0&Zk1>r2V+N z=9pY2>U`yJvfAf-?R+EjGeUooTOsGWoIA*~?kmUS7D|t16DGLpj>%TNJ3)VO_!5=n z{ObJX{OA8bOgHeM#qoF9@BDn@Uzb|S=EumA)7rjSu^()=k zuvoPCze*oXik9M5F`6v&S2Cleh0X)gLhh{7a`_3-3ennFn`B}7Qv{$ruw2#m~7WyYbrzf9f zMf*kjM+ZbXl0Fyu7efD1=wG>$9+$Vbh>ns@?~jg-j)`)pe=YPMg#PnCkI14EqElE~ z(TUMXQSKP&r?k^?QqHTezBl$bPr_9mD7B4B*~YKHQ0>3ID`lA5RTy#PU8uj#mD$V z;*lauMBtzZilGFOPzp6s8~mcnUmuOo1kKPwN|XGpc+(T}aSmTdQlJ3Jpg9I$AjV=I z7J!5U3$YkWu^cP08f%e>{WyTbxF1X=a2zM`C?3a|G+ti9P5dND{8_aWjG`RKGT0qM zF$|MHl0o(f3M|4BEW-+{!glP$Zcxb}Ndyn#2&ia~B!U-l9Y0D^C@sKCE%d-tY{VWM z1v`Y;Aw&y8kATcW=aG#|cpA^(Sv-&LBq)MPZ+yv{za`1EKt^U~jKd0S1ywNF!MuTQ@e6*%?~-K2BLEhl zRRZNv0hLf2RKjY8_L5}FV0&AI4k}?6NaLjt65&S>VX&%gg4(QVn^M`uzyNjW=&LpE42 z_A_`6FX9zk!)tgG@8Er~sO(ShIlcnzvA@TUpiMR{vj37KiYPgh-qAqWor0j^PJsUN z#X@o{u$5C3l-WrJC3fhiLwTL5ptKG>b?Sk>I!(|Vt(DrI!0V;1IO0R&j-&N8gT8mvbKwqP4}Vh{G=01o4RJcQ#oiPLxjXK?|Sa2e0y z1-uL{HIj1!Z{Tgbhnx5qpW#bClcv_X4xLRa)aZ}h`J48d@uU<}4%67EAPW?&JhVstguf=WhR zP{rsD`XAlJ8%i0?!ee*}Z{Z_+4k{4+8sAD%5oT0`Srn;{E*Jp@DY62zrwDB*@+8iI zk{7uM;uWFnMXumgNh-?ZiZZF9BQZXWmnGN%HZ019McJ_EbD&4X8ln~0q1YU-CW<7IsMgqky;b}YrT3GA{{0Q1u>{q1yE=k3w;3d3`5AiWR z1+y=H3*Up@7yk*rNKy$OA}9*_TB0P9L7PfYl@i@Rt4j1jA3P5REy18A7_n5otYJ+uzYI5Ry<4)ldU0(o%IW6vHtRqc8^VNK$Fy zlqS*ABwD%v3Lz1TKtiRdXlW)|nu?aDqNS;5>EG#pX-ZN0Z%Ha6fvn5;VWSvIfJDla zLT7YEcl1PWuujSls0^(sLu<|{KRt6=c5w6^TKcpoHEme!X25^1dLvftt_ zNh+s-?8}jTIkGQDY0K3`eKZ7zX1Sx1RK6^zMtOc#o}ZO(isopC4(J5dL3!3ed8$=@ zEGA$Q=y~~VV9}Om(WaH(!<$S=su09l@Ii%r$ihJ!#=|&{6F7y_xQv&<3@cp6Yq%{* z73pimc+ifDGeI>fB_I)0wi4r13L}c5^uJPZ-joC@xKa%;t4dAK3@t$BmB_pjnOB;M zk0q({KrpMy{H!uRtDK4%n2$6F(D%wqunEkx@?J2p%1o^Ciy-;RuX-C_lcXxGa0##A zbK zYP6|ZOVFljw5eKJ7hdR7wH_Fb@nBZfm{m1qRgGCy+XGruZ9fixmQ-UMR5w7Ss#B@z zRH{0YsNM!AB&i1Fu0e@wB%u^o-8IUgDyoBIYmjVO4YIA#5xvkC{XuzaEWt9Yz$&bf zq?+*<2HH_`I_PiB*_exkSd67uj+Jmh*=v$`O%ktp2voS{Rb0nw^uOjCym?EKYPAJB z)ncbwyTOjN=vS>Q+>ZzGFj$DSm|?Apcpfi-ptT5Ei?-DI3%4byb{uF?ZIY|K6Gw0i zkKiO8#aa4a`#iF72~UH}YSZ`HAK*iLEJ<|=fs)qoBLqrchlve;`T5JZD zs>iWhZwK~)O4Vc0)nk3sWB+;=@GPiMJt|a>3e{tB^%%S!gV$&5wEFb4zKZ!^=lbki zpPlPJAW039(G$Zk2IDXRlR*C)%mn>!K#3c$e}fEA>IRvh=MCt21A5+o!5c7m0|syK znj|%BgDIFw{~MVXM1X3aJJERC0M@g07^kDxz|DN$oe)Pxc>p+Zd}D2X!Q zFls`AO-Qf_Ni^Z8X~I#{grla(U<}23lGId3J`_M9titnP!8d&$H<9)cFQ4FRkVsP! zX-XnZNu(K>Hw(gojVOwO@-=IR4(Nm~pvTRA!Eay!&6q&*d3X}6f#$TJIW1^T3!2k{ z=I??e(wdV+bCPII63rR3IXkwH5C;X!vIT8uK^t07#ul|fJ6fRH;oGWokp2+Op8vQtr0QvTc481c|jx2D58RLTxL81lslm3$E=zybAVj$A0Y! zgX*+nX6>j>JN9qKdTCbz#A(Om+L2JZ#%P9?^uJwe-b}_+q+$kUV=lgyr1oKyL^)Id zRcX%*+t&uOYTpn|K*092u054$Ph#zdU>K-M`!!gH4U*I$0aT|0NpxsM|2wqdO*^of zJ9Gy#?7$2=48R~v!#oHq#xktHBRGZAcpPVNR+2ih4my%VN0R6`7_5Vitb>j>B&idF zcVa@FqM$OJiqrp2%&rr&>qL1wF|$t9Q4{S!&pVM!Cz9zzuucT)#NeG)V=dNWqa<}^ zL3OSSX4aX$cdmuQcpIPN7QV;-@Du*TZAt2q7RL)accFh>Sj}CEfrPr0LK#rfE+o;V z7g%^*p22tcOOm=OV8L}|R$W;$UHzc%T}{|vmR*@l*9K?`j_an_sG0Se}@dB>l242UTU?q3sywUAbd;yOCZY;#^9Io9-s(U^Z0F~@s z2lYTA-RXOGlIea9pV9yBKl0`eFr)62q=yV<)PtRSu%de~s~#lQgKG4siW;bmx?q9z z7>Q9BgK>CAl6uxh8*~O0?AaYXF#xo&C;Rnezn-Jgc$tGmSPFXEa}`eFG+0I=TL%^DoyIJC7xLbK z^7j4^l(Y9&_y#PT-aq3vuxNTyp*~coj}H;h<37bu0xZ}*ozMl$xDPY#b6Jx5vQ6J| zpn82-4}EKb3ifS8|NGL5zAexiER4Q=Fcc}EqCwNK!vq(~na3BT&C4 zXa-{SJ0(f|6A%W2_b-a#U}5(sk^UTM{i$aE>h!-q+4N_p{vFW`WZj=6`uD>^EWt9Y z01LAJT1grpfj|QYG@vq=*#KrXAPYZ$Dh<>?5(7Ch1{MTsXrKYAHjtzSlGMOTX}nO1 zfep|Y%wQnN44i<;xDTnAfzKsr5HlVW0)Yl`lnk;#QiI;YXZRN1fg}d~h(GYRBn_rz zgE?FWlhk0UGMK>!mqJ=uUMhfD3}zOCnf2g-7!2Alcm!z0U>492W<4YxDp){6@?kER z^^ik2g8T6x9+sq`tcjsD!K8+^1?yvIM|4In^rinpspU`x8_HlqneotBAn4EqNC!cO zK7faCOp=BXaM(;N#wx7AI&8pJ?7(hhVm}_i8C<|6upozB!T0!){tx?^H@`~Ka0VXE zPQ#ha@PjyvqmneDJZQ&=*&v}2tcei}K4K{te8hTWU<*iK1eF*;q9a&@BOU{Tk2s4@ z@dduZH@GE9BfaN8BR9dtHjsUa3EroWL<*%$p_D1daRN_(U@6Qdh1sM$jq7+99J(o= z;B$N_NuyYBqgW@SEU->Sk>IHFxQM54S&~MlHRpwY8T~5W01IjKJ9rNS8%?m$WIURM zHTpZ;mZUKWD1gH7p&lBdF`D8@Ng7)T^+E5)wm>Vi0lgpF4L#9^{*Ud)n=!Z#si3!G zXJa1@fO3vy4U8*=WuRK)sM5Gy*aKQN?lA5LYh)ai8b_tZG0Sn!<0UY;ao6xCn80`$ z@kpcp<8SijTl|Dy@EiV+qzQ3Q!E7fm+X;mb1&K^3iwaLwv`kz{aH?7eQ%s#afx`HaCQqJiuz`sxL1NuCjK2INnkr)lCF`eY5 zPsTjZzUfqB`YNme)tLS`sK)ejxFAV08i8ufIG4r?y_@k2p2hRH3i>zW4ZMwaLGNb# zDM>SBD4>)x^PxIwp$_WdB-nl?)tLDqK9;0ev~SiPa2B0)0;g~qBsD9IY-X{5W?cpe z%p!qVZ{Z_+iZAe$B+U-NLm2KF3d>P4oYjqy-Y}I1!YkUHR=BX zdbgk+sKA00u&5S{#ru?}5!$00dY~8jU@(S(ilwoA8r!GM$5O1oYOKX+Jb@>14i_XT zy)ky;2-1%6!pzf8f^wxZ>vV6UOSp_Hcpc0>onEJZ3T7(&U?#!cRxj|AowcAr)H~2HP%V+l56@oP-v#7#7wAGhNseEzk;+a37{&24+dpA{Nr3+MrsC z8i0KkHNkaBT1?=@rN9DPTp3kS9c;U}A=qwlbF>7NTs#oN=>K9$xR??yri6<(Vl!N9 z17%vgTauQraF(#ck|Ch%OGe;VNm@$arR~51UD_Qz(Hny>6l}M26vkjC(y;`~!6IF{ zCXJUz@i@-lEY3^PG6F4|4|Z6#5R0)?l9p4tXt844##w)q_Fs z)eqt%sL<-iK=9SscnWO0`Z>ISxA8H)z}L8i?-l^=hxPhSly*IfXMGR!!dOfNJzYNwbFd$jc>Q4<#RHPGft9^s3;1jUKilB_ zjJ|F-hSQ)@8_t62ZeU^?nAC>%!OS->^9`R#(ncTB$b4fMCL&;gZOp`NNy;b)KF{Fu z3_j1`^Niw1LTNCwj0#{@8Ew%4oxy}MW@8?xY(}~yZPG9fGr`X`c|Ti7|2Hk>%_^+L z25bT|+jIcTXwz}91~xqkX0VAFY@*kjn87AmvYDWp*JBs5K&3WQsm)YnGy864-_55% zMK(W)t6;rs{s14*|IMHB=5tBfLLaw;V88;E*uvu3LeMQQ;uWy-mg|z_4#0LC0!g~Z z@CX>pJ%e*#p}J4uGH&2K+yu$HjJY)tfizwibSr~yWzek|VD)bOQ2Auqo9uT#40^enAiE#MW0JI|GFE`h_mKIX zJz(HHS-2kzyoZ7Ju+JX$+4CG2Y|n@I1fSzeN!m;M_8Oqodu{L+kka0@Alto9f%5KU zvF)Y2dnxZ;g6t*Zz3+oydp`!1*vtCZds~t+}#tXqR|CXeEg+O-uB8Z|W+Mqo;qBCgCzAwPe`~Ct+>?eu+B(c8$3d4^O zh_$~IDx(@mY=3PG!ElVE|NBSthDEpkT}jH)K#8&_O%@4c6+;P>MFkKji$Ga5&>S5= zQd!;51M`pu7Gu_8(9SFpJwTiT6~TT7YN0ObqZ$1_(2_UI@&L0uz$_08#S9SW06`8c z!%D2iDX<<6Jb@>19@&y~unf9_Bo6ihht|P<;PZpOO41<}1wnNVQJq6UFv&wj801iK za7sNysSa`c9wMPb?Labzx`5donuGc9wqFPmJ47!J6X-ByKFoqTOu)nGU@aYf3aq8W ztfj-OrNgYH!>pyl@8ErWh>zj@{l^hbG)EFZ|BjI15g+QIAsV9@THpu>bmRtJ2LX>Z z0o6LX2>-98I|0+NZuw&nfsAayp-bI>+$3Gj;YKbjybGj z8@t(S{_!e|KZuy(A7QB$1tg;*4q7yUNjPwkMNKHf`$#Ck{1YUUAo_&nw897z+R_f+ zfD)vY@HL7{P+WpD6V|iI{1Y~NqM`(mEiQzE7Jo=n9JqK3{{+F3XOPemcgYe7EqQ@# zWg5BC#cZM+U)C2Q7V(tT=FK(!Uea(p^YrsdSc# zed%G2bBeQ^=OX_F!7>ZBEH#Q-rnqI!Tvm?vsEC4=No<*DmpNyd@h$tENCz%A-{oRj z9*uaGi)XpWmy3M)bY?M!`Fzh0nBVgKC~mppmOFI0(X9wDx)lmqk&>=BXT@Zu;=IJ< zC@xV#k%{#@F~7vdh&|E#65G(0_H;yKiCSDD``^IK(pt6rl3<*A1Gtunt=3S4C`R+--_<5^{X zt3KyTt_Hzs<6Hd_*>T?LD2#CRE{t%slvYb=wUkyL#|T#&;p+1aTYZr`nB(fFL9j-A zYb@IuovbO!+mxUbHh+!I*D7#rEfls^VQY1~*21oB&8M_Oa%(%&pJ9wZ!E2*g&PpOz zdsxf*AXuk^bz3=rdwiWGS@#DgIEO;l{f&;-UFT5{tXJrIv97m#>(fvYMXoQ)yI8>W z2|=*Ia&O4T8)$5U#x`gya>F~Gc;SW$RHiDr+Rz-c+h7+q=xDgwF+K-JEZsRm&GMl;RdZR`+Zo=Md+-Ck8uXv)HjW;odjrW3JQ(Mew(d;2J27>CZbo8$J) zYz=}PmTHF`*zp~b*b&EE=Chb(NM?tH-yxYD`#EC%JC1o`);mrH!Omw%#q*>kJ%jn3 zi(ErmJ8xqjc0NKnyF#A9`*%rkS6=c{kT)>mU3OrX9oW@^-9fP1_nO^rM|yaNa)@nr zMXFPa52%kN+T9*8?(T&MciZ~ivzWs?76ic_BiSS7Jwy3|uNaBc_I%4ECgZNyGlLaG zZt(B}BHXi`tLSi#x$n6X1V6S$%s=ks5WjL1sr`7GKe>QA<;TlB34*;TNsR>eN^ox( zG`P1s6<8Dm`=q?j{zUG3#gkm*As^z}_ZGz{K`AWKzB<%H8vDe#F9Lh9FN)8DV1F`n zxnC;#rLlh@2`s_gu;0x0Yj(e8_iy1Rl79YczuE3T!KonlN##GO{HHXeV^k0vc$wEJ zf}##6>VTpS=;lC06nCH+?&$*-`M}3~!eWsL z0xCax86!FB4ms-eN4@^&e>@3--(KKla*~_8)S(^?XoNla?Ux`pR@D5Dl}9wkM03pS zj+xyt9Ut?eV@+v6D|#}B2#o7k6pJvfW5#uCMG*X6gwaeP4&DB)+uwEj`%;o#vkG^^ z@9T*?;Nds^;3Vez$8$VSTGEq|G3fXYogNQJMha45-p9S>xOpGXN;cl46z}jZMti&i zo#{e1dYJ$5Ye8^A$0u}pqBU-v6Q5z;C%WQACyd}kKWyxYQB34JrZSyfSke>w_=$r- za8l$a<5|NGY+*abeR4lZuSxp-pOZ&Ck-$kCeNr(eZ*z}-c^Cwz%UvJYA6(rXlvz^AP)KMVwyFN)&Ti?58)P;M2dD|7iuBK86vTNzStv!I{*gL8oU6 zP=a!l$HmUNrOw)yvvsJ4ojKbW37+kY^v+7}Y%e5rR?%l?F*^wUe2eWw{_H{bfBw!1 zPGQUcyu=l*bCbtGa86<8QlY4G=_pNE%=cUcDk19g)lta#7PO)bpVEmgbVpI=`oMmLUEMiD>Y`Y0h$v z3+8{(vR(WF7r!_eQC$?(MNwT`fcafq%raK68>wCVm7^HlUm?#Rp}&moFQfZQcb6n_ zNfMVNaY+)FBymX+mn3mX5|_H`;F2gVCB0Y|mt6Rgi(X1#DK2;M?4OKtAY7nP3DOT zuR7?eLat82fmfdd!L^c9#+F~JO9ONQ5rKyO;yio%M-jLD_Dcu;z zV1_abKU^t?zNpt-~C}dAHxAFHuP7w$a~C`b)ywmgjaX=6`!SvzX0V#C3ZYKcc|f z2l$7F{KwNExFfMU9dOPax89wJIPcEmAh=tCN=WE#EhKce9v{-o{O`8(q&1(=A93Av zJKl{(g?C4@nssd82et&kz5F=nUPBt=zJ0A53C0)0n|ZHnEMJ zDDc5vr1U^c50ZZV_rW8~>S0?P^e~2TIPl?vAb3=i@<{1XHEL2D(LZWJQ(Dl9-V9+l zpQFG>mhF+09<5>xM)_YZ>_p^$4*Jhh{AZT`dBJ~IaZ&XIkCTxCvwST2$D)6nnXF{P z4m>Wx+mu9tkK3S;$L;9A3AmaAP9rEsX#SqP@4~E%tth*6|EyZ^kpa` z_>!;rhLx;g9UFo$e3hEip)U1V#Z_EXSYfhcq#z~f$Vg_gl8qvip*$6dtm5H)y3v!~ zC@9$CSu-SFmA|>oKRo0yPlNE8*Lj0CgD~AKsJAyDpLE6%T{tRRYl1lLf(MT!97{;Qo6ibm>3aO<~U_b0hGMl+5=(*=9L22Hh z9JBa?zqlUh;U;&u$A5?@l{uzLfjOp9SgQPpEY({mFqHyRwWKwlAgNS)xW!%W^KTHQ zZbd8#O1+51EMo=h@Pi>?>dlBfwb)aeTj~>>8!hJ2@CY91ee8x6gkc zglV2355}5Cf@vg}M%QV|QKb9@s z5G-3d2c?VV8!THo%a%^J=`341F{WF^8qRQz3rH=!j?;I?Iq4OY-Z|-=lYS)Qm_Tf# zhbc_MVd*#U16$dSjZJ?8b4_nYGSs9mQGAV}GAJs8qB59s24`iESO!a$VK$1)uomZL zaBhYz7-t6OX1Gq|%^=KJ8%y&-$aAD7E$PWZHgb@Q+`L6;%A(5`Dqwss7~c!V_kylp z*dK(M6q-q)KAa--;S^yeg=SJ{CWZQ-iZGKxBQvQqlS(tGG?Pj*sWg*HGpRI_N;9c6 zlS(rwG;=HVV1}7baEh~tJ@aL*k@PxAWxf}LFDB!8(vgu&yo-Wgtc1`12wz+lgjw=Y zj56pdi>|VGQI=}dqz?6Hz{hl;GrG;9+brK<*|O*;%gi9mnugCAhp%PTZB}2)n)Efh zlXW2p_`9Ak>vD9QbvJwYiG%#hBOdcK2w&>L8FcxQalPaof9U~UlTD}DQeb@9bet_M z*~v?O3i1Yx`G{t;AX1#!EAj!pnEgY1F}p8j|CDx^ZTA1smEnwJG-jE7JR8tJb|dp~ zZa(N2oxePTdAR*vjz`BYC$gG#Y&3tLVimsp3&%NydA@9(IYgKvJsB~#978el9Cjjy z8Rxi-8Rz(iCxH)F<{46widWG2D>{FrFqZZeoxjqYmVC^Q=AW}b5aujFIm#oAoRz6b z9n3vvL!^^a5;=R)hyDy?HoDBI%bW{?Fjr=JVYIovB${uKSgr}gVjuj)o6{^SCexQs+{OCon_(jv*+Wzb}9 zP3EqEk>rVd&clo3ASb!8G(!QVG@&>#!TWOJuE>t1=eH61vaDl0tzc|jT=Gu zx(Hu?6odtz!z>GCBr^&t_zF5In3w##PD$RQ5>=^2cPwT>#TD$woggd}slq}NQBffg z7mC9e3R#Xqi&;h@tFWAf#9PRC3K>r!<0Y#-`x-2oXc|7BB?he^`@lW+=aQn zxu1h5?9DU$%~fu2D+u4pj-=koMQ*(Jt;gnHBy|uL$%v|ph_i?}7xAJZ7Nm%I7ZGQX zLcBv|-lqn&=#40g3}8?Y7WLkuzAqG&LeXz9_o8DNkGU6>a?zR0Mngr{Mta!F4tArH zqPMxnKRgJ+V%^YPvER{Iu|K)MUtC9b#qQ$u#k~IQv}ok*Y~&y()lu-E`7kP=7G4oQIDW#cGwfTU(L0H;YOP4hN(mF0}8%tNB3SuhlMWyT0h$iU1wC+pm zzO?R3>%O$^OY6S0Zc6K>j0DSA$}$cwbBJF#io(k%yo|AxF}5<7xQubV<3E3f?VWvoi?GHAhk9 z6jRRM|AytRBldE4c*x@*d^bR0@221dMEPz`a+8-j)T057&{g^N^v0b~eh8W?Kb&a3 zVGQF?Sov8jH2?Amo-AcKe{d3Ul|LJV@9FBjM?qLYG8NL3k<4VlTr0eaVk+e4b&RsY z`_#a!D;Q&iehg$V5kXin8B(m+l|JTQ(F-biK}9d97{wQ;xT1%+6 z&S0*UIN@^{SC#uey@e zY+?%*rRpyBpv$Vh(Nwi3Rc~+`x99t>@G5!8hm_v8`S1V4K@J6>Us?~VnRzuAtTvmu zEWq5WDX3ba`B!t{YU|iQ(wpo+H4#=5Yc(5M&Bd!{AQK|1o|TE%>grojZ1tT%SfdIf z7)vaZaf{ZN!8~+aLmD-tQNzV+?BFN!uko`dzjA~pf&VoQl9PhrD5j?FYnorpdzfF% zhe24&>uNniN>XE{wIoujAcZMHF`8pMwOaEDCxftdIciYP{A)L$F(2ZEwcF5^_H@Lp zRQn5}`G(O*t+v!^ORe^%AguEax~?PQI=Za07+uye^EzHvXCs^0hR*9))H-L0Jnuoo zb^Z>*4_-jTABgyaY>4>-UDplJW!+ThvTi!OuI@{`OipxOSI2eBpu4*7QISq`p&LDL z(R$LV=Nk3AFS4FD*2~Llh^?MO>b*@#N@MHm)uSOz_=sVcbv>!n`wAnepPRSvzWUx* zzbw8V)USdw>er+Wb&+y?>DKRL{`FN?Uv>3knS!OMKO+bmq(?Um-p3mocw+;jYS0KX zZQzgwZ7`|^?dU@Uiff>_28wI2gykf%DhM0Cjx!p5jQ2F`VEzp|qlkvR>Bm6Kyx~yH zy5S@yqp*ewYq%S?TEqPu2*O6?(M==oZ!`$+ZRFfW!?81s>`bFEjN@AtU^f~ms*#`n z3LCA(TpHPhMi;phgpHfA2FucTAMWeM?v%#A@H;0sjoY-b_cbiXP?8DFb5*>c{AP7Io z!)p|vAV&Go-`wXhPlK>&G8EYKdD4;5{F`R>Bn#f$^eu`}f>N~RQ$9n)O&!>*FuG}0 z5d}7TpX$`bY@4~2n|(wxI?|JV48&-f8EZ2mXeNzj3Fg#nNf0(yadR8qyb0di+?$&p z4#E~6V!>K;#*Vb;jssf^U@#7AA&nLmuElt!GK)FP=X(y3bk8-`tI_XS@CVfz&1N9FCy@-8ZGUkOFGuZ;rQH^5T0H>UQYZ?A#&8ff2} zX=tE*9CL!OLvD25!FxM+Z)68=?%>TGdLfMtQ7E88G-lSpLUve)adgXyeH_L( z{Nj4p;Us7H6HC}JI~wR{yd7PmV^b8?aWJmYF~hVPipS~SpETAiiU`2dHITIU=1`@isi zFY*#E^DqdzB*)TpDNaka;*DLT(B(AZ?V{)|myk#oiFCOYgk1x?w`&R%-_=5PO^YVF zzCdQ&0bT7}*G_zE{$1yJvI_@yy^5;3N~7yN6xUTM-5k=*EW5qJtK`L8yS+|j>d_cW z+^spSkxaLCbf6)?I3TgFftT?%m&{C~s4eGT4Leit65nF}Qg5wfxE%^Y1Rg?jr0i!tQtZhlfGf zLySG1LySFKxQ7e(aN!`@pU`?dS9hXZ>Y6pYmZutxP*Bgd zM7H_<_VYU@&_OR9^ip}Re=+}F?uy>-ir(qShy;3Pr6MlcyCD&nac}4K zUXOTtJFoZOTtySTHPQPXn(({-VV`{F-{&zThi#(&roIu#;bK(LOHP$3^?NXdf5tqnSRM>7$vxn(6Bn@0-&6`H7}vQh~};r74Q&Yh--)8)8-p3jaE!U1 z!uu(_U*vQT=G|`*OIS`KTiDHBe!`v5?>GKHto@9spE32j$>SjGpMmV;MdAHRQuw%5YYe;4G__Qk&GgamALSL zgP8GvBS>U`xem0D1IwVpfp%r!5TcRnz=b3r-GR~_=$wK6FdMjzjgcN4H1HV5ImKDd z^H&fKGRHxAc#YR7glGqec93WXiFQyEKIVUz^&kxm>Wz^NlFpzT+zrCPsmVl6q%k-j zkz()>3gO^hNMP^?#$pVE=c0qbIvA{j!K>JSF%14A2#4r;NI~AFCUt3tB8DhpNFVy4 z$stpij*$-8$`0&TYN2}MXKLQxSKjWFtn2=k8^=E>KXbA$zq7|%pvQDMaWAROxOp}HGt zwnHQM67L!6JwwMZlZ8lW=u%c7t;iR68HGi@Nl}VpS0c;to@gRf8(AF}h-}LMh7-s4 z?BNtwxXLxmH0h7-VNw_-fng3GR)MCpK)1s_;WIkWncf)3uz?IF8bALR4%5M~ahUZm z)eqaqX0~BY!wzBI!%lLBb6i9b!;ERzJ(7xf#N!|w{wz5uh;D~#aClAXP>+T*L6MQe z+jyeu;qB>&N{6d#_&jtz{4AHz{cxQRe~61j1tiDCqMjoM#uQZuX+()S>TRSFRSgA1 zDIiJ#QT8IrUPQGp|0q>Ni7Lv4qeK)njIS8UXvSg}qHJ)~G-fgzvyL+3C@DqlM6pr( zIKa=G=N1x*x`UKPBqIxw8Bv&$ksd0c!VzK_VRj>=5#0^9P_!+LmPT|8lbFM5)?rN1 z#uTl9Xaz(oAX)*@3WzqcXaz)HoZ>9! zxQQx9s&b?%ziC7pKBXNU*~@SI&IwKj;i%7$*eD|$)el=f>JJn?>OY%PI&gd%WaC8l7;r1H+CAuB0v(XwDBZV<# zv1DTgFp(L=F_-x)CF$>f#%$mRwz2~;jWNqHA{ry2F%lXhp)nE~b3O=TLPQ>u2^WgV zMow~*j{+2@GFAD2=CnqNF;a}_Ojjb!DMn;5;);nzr7=2*SGRXYLie>B$E(PJZl;lUm&;W$N)Q}j4RkK4;n{LHUG@o=2VeI!OW z?mCZx(2wzj$dnaNAh*ntI-<%*Q(cr}f;o8#MJ%;N_WfvJvH(|9$F zSJQYkjUPn}qjp331G4Aqgxc>AyIcu+Nh- zoZ}+KKH(~=oZt?gaF3*Fg*xF$5Khd5eVzCc*-`97#ZFZ0M8!@lKp_hA7PaZj7^F4v zFb{)pQcjZoZfR0W?Cqo|z95>Bhm&%SjEMTW-N+~6?5!l z6dSA9SjEOFHde8*KeC^L{K65Aahy};@3TZgpCuB;T9DYwTtf%37An@=7ORWzQea2E zOHEoTQ;!C?slNM&Q7GcOsm#E}Q8|CwJg$LYUwoPUDQPlSgv zZ1fBpJwq`wUg1^pkeB=vL<%$hM+6F*p`aNGnK71cnPvVn=6Eung(R?qy}0lU7oOq5 zGhBGaP3|C(8TWa>e?d4i6=}#u4sxN8nXgfRq7eG;3G)?u78H)DZkp5!8ba}~=sD>=`S^n+8g zbTCT?v(lr3Svr`dgIRCz7R7jvN|^Di>eQkR9qEZeXZ2?w<~(a0-!cI+pQY$o3y8u&xhe1?n8?}WJLALL08E=Wmg(vqH6v2+V` zzraNn6lORhiDeoynau*?SsdwMDZ4Sp1-e*pnm@U~WhAn|9k4)0-)BU$->d%ndbFe+ z9r2y+`)>4P5D^Sx1YZ)(TK)>cg%Vy^fyibaylG*7ylJ5~EmYLPv3$!UCZqa=^H{+e z*0YIi>|_snF^Yx9P;`7UBom(jg~w+?O7T*Pmr}fxBICsrUxe~Bq&0m|P`rZT6%?-v zpUe}+>mvSZ+zCFNCyXDDDC0#LznG;gXC;b^S7f{*On8Qrq$VvoOvpwKa*>DEC_qKrEeXy|Scn1> zjKL@OgbCY4oglV^pZJ+yIf4r&{Ecl+xPjRxxPKG=<7p5sPKF{Dzlp;ae}$1PmdN6n z%*VwRCm@x@t69fJHnSDiT^xDH!yiGo{5O*R`4@Njhle~4!W99@c@{HVkpoJ|Nfcd)c^hS|38K+fBAp^ CaVkgv literal 145913 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�c>{bo;){uekgNHS);NBY7(OXS5)_fUz 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