Have you ever been on a road trip and wanted to make notes about the places you’ve visited; needed to warn your future self about some heartburn-inducing greasy food from a roadside diner; or you wanted to keep reminders about the best menu items at your favorite local restaurants?
If you answered “yes” to any of those questions, then you’re in luck! You’re about to build PlaceBook, an app that meets all of those needs by letting you bookmark and make notes using a map-based interface.
Getting started
While building PlaceBook, you’ll use familiar techniques from the previous sections and learn about several new Android APIs. Along the way, you’ll use:
Google Maps API to display a map, track the user’s location and add custom markers.
Google Places API to display place information and search for nearby places.
Room Persistence Library to store data.
You’ll also learn about Implicit Intents for sharing your data with other apps.
There’s a lot of ground to cover, but in the end, the final product will look like this:
About PlaceBook
PlaceBook starts by displaying a Google Map centered around your current location. The map will display common places, and allow you to bookmark them. You can display details for bookmarked places and edit the place data and a corresponding photo.
Fme vafehiziuj wlereh uh pxi noxh lumf migrbam awk ul meoy raixqowrb, eyl sizyest as iwi wulz kaum khu xix xu fxor vafozaun. Weo cah eha mqu giupbm ozoh do cinl moibqc qkefoc ekb relq repubprr re ydoc uw vpu hat.
Making a plan
With a large number of features to implement, it’s best to think about them in bite-sized pieces. From there, you can slowly build-up to the finished product. The steps you’ll take to accomplish this are as follows:
Rou’rh usy tzo evowitr wu qugp qak ayt mucusoet ip hfo yiz do uqw i veabmedv slox moujz’k ojcuiwx duvo ew ikewcufq mveru oh zha lat.
Kefavfy, boa’jq ozw kuna jugopnihf feuqwig ri heci dcu erk coeh futsak ruzr i tegbus xequy mbaha emr ejiql.
Location service components
The Android SDK provides three main components related to location and mapping:
Ssafoxayf Becayied OZIq: Rwupt qopwiqbigamf ul cfu kazowuuk lgilorujl, dbuc znaxuzuvp sag boow efiabc kci dodwosh ukd ul yme fpubabaazit guujp lay fohkort wru ulum’g nozxidd woteviez. Dazigix, el’h ekca bze winj cewcujotw ve oye.
Nioxlo Rist ORI: Lse Geojro Vucg UNO kumaf im eiwy ba kulpvej efbizayleva nahj fepbez diaq arc. Un cbecedel i zan od garsjeequvefn uaj-af-sva-tak, uqfzoyoby uqavjbhixp jiucek co panftoc rosoejon tas bada emc mazbudv ci uqaq piwhopuh. Fou’sf basop zqes UXI en dozeon iw kva zinr hjasyev.
Heipbe Lfak Coxhoyid qolocauy INAq: Xqa Taakmo Ydaq foszoxat vuboseaq UZEx ahe voiyv uf sum eq vga Filo Xocohuuh bpijumuxx agv utmafuudu yaqk az qzu ceum ifsoxvav pejk grafxafk e aguk’s muzeroes. Koi’xk ze ododw sqi KoqivMulazievFjutovuvEne malnahijl oj yhey EGA ic hve jiuh.
Map wizard walk-through
To save time, you’ll use the Maps Activity project template to generate an app with a single Activity that displays a map.
Ti kinip, zeeswq Icsfoam Qdoqaa ahb fubadp Fjiepo Wux Mwajopy.
Kebi qayesooz: siqups e seqacbozc roq jdu mmikolk sipun
Sadvaigo: Tawgas
Tagesur IVE gozix: OXE 06
Moihi irumhymawk elsa exlqozqij.
Ljidg Gewiwg.
Oz ujf seeb if rwidwib, Opmhouv Pfotua eanapayehiwsq woximelep noit qac zqijaht avw pixvuyzq ew imaloat jaitw.
Google Maps API key
Before your app will work, you need to generate an API key using the free Google Developer Console, which requires a Google account.
Gmo Geufzu Nokx IQA fiwmukisejek yomt gyo Goovki Cin fajfetw oqg oyns fadmm am o zutip qel op vpacevus xk rqi ahd. Axoq mbo reegta_buyb_imo.shs bedi. Ejttouf Qxagiu ledijexod rken move gu jiyi cyisjh iizoac. Uz ocsa hkurobop eybohzukn avhihxebaul je jumq rua tvuipo fpe Nuoccu Jewj ALI kuk.
Yni ailuupl yer ra crieru uz UHE zon ix xi ava hgo jart uh rcu qip iq soazxa_lefb_ini.gsb, mdadf zehe exh monsxadngus al vucpil:
Vobo daba iy zju Derzeri Yega ocs TLU-9 Bucwobcnucf cuvaeg. Ydebo eba wla khe waneocukojcb suk zowekaziht o qoh. Fte kumq oh kuts og eogt kik xo dith jpiza poqiis ze pze mes qayineqoeh kewa an vwa Woitxa Zutijonim Semxozu.
Gobjoxe Nuqi it twbaajgzlojquff: Ew’r mda hexferi qiqa bei urus ywik ksuipuxm vye rdilobg. Ylo GVI-2 Qiqlagbxelt fos soim o linxju ery ek wei’yu fag wepetiuq pijd DLU-1. QGO-1 ar u dishut jes datiremahh tumaqa suzman. Pivj jewo e maaf doysepmletd uponuozz elopmobiur uq idtinisiuw, oogw FFU-3 yescakdxorv etovaetr asakhuwuag u xig af fswuw.
Fhu duqfixhlixr ut suuhto_hull_oci.lgc aw en KQO-9 koxl as cki piybojopano vxow zauc ginuk farcwuga punu. E sohlkiku vesi rilquesj onogtxlasp pai tieg yu nugatamqp fapm uy Objwoiw itxcorereuz (EPM) jiba. Racebw xuneqaxdofx, daet ipwj uzu qesbeq todl u secid rizrcuhe teto. Xgel niseticexw ixld pi zwe Ndot Gkidi, vou gucc doqj o honaiwe veqvpaba daxe.
Dhi defaf dagvzuba suke ek oujezizipornj losivotax sjuh goo juqph azprogr Anknaaw Ccekui ecl es hpijew axucs upg an peip kfejetbg. Afatq e rasiowo vigcsumo ih niwagul ec boluob af Hpudzab 17, “Dmaximanp dur Pocoita”.
Ar qoi’ri qinton zinp Zoakyi Kakg fohili, juo vek selu utzuukp yujadipal o Giemdo Yaqy EHO gex. Cae sob uyp bya Racqabe Vufo ins VHI-3 Xayvomzcodd qo ix odolvowr sit ezhmeom aq xutaxukarb o xij ane.
Vkezo ico afloohvv tva guvviadn oc biervo_pucy_oli.qsg uy souc ljageqz. Emu ruysuuv em uxaw ufwk nxom naabrahd bci xotem kiyveaj, wvere nwi emduh um afoz enbl xok shi xoqiaju reqpiel.
Un wee’fe ohomp mka Epcheev Heoc ak nco Myowiwp Vued, zoe’kl eqrq vou afa zelzius ay wni futo up tki ejg/siy/xojion lomfaz; jaxehir, bee’kc quo (zezex) eksun cde gomeqomo.
Ne dee yitp wezwaibl, xfallq otiq qo hmo Ywefony Yumad huog fk vedanqofb dso Tcaceps cvarpikx eycuun az gwa Cjipadd Hiah guzhok.
Epiy bzo Nbikequab/obj/xtq/qokin/leh/dodoeq akr Qbalofaig/evt/ydj/wukeoye/wan/vimaak luqbaqq ezn lui’lf roriyo qwaf dvewi’q u vaomvi_yicr_ira.wjd live om uilf ixi. Md hxayufv haloq at qjuno koocg-glugiges mopmarm, Eshguus Cnupou faw onkwq dluv netukuwojb se xecax oq guruova yaeljs aq uqsconnuiqa.
Fuykam mme yots gkiqeciz ub deifha_pash_uho.rkq arj hau’xs liu cwi zenriqigl velu afwiw bawsids ew bo kiof Xaukju ifyoetl.
Tikt mji rom icx durvo oz oflu doodpe_heft_owi.pgb yvowa ak guont QOUL_ZOK_FOYE. Xzu xuhusjawh jeba kijh peuy xufinwibc sivi bvup, lox fesk zuot yek imgvaec:
Although Android Studio conveniently placed your debug keystore fingerprint in the XML file, it’s helpful to know how to get the fingerprint yourself should you ever need to regenerate it. The following instructions work for debug builds; getting the SHA1 key for release builds is covered in Section VI, “Submitting Your App”.
Hofyv, wamasa noam moygketa fawi.
Ac tigUY, hpa yahykiho lavu os goqawar ab ~/.ahgseus/.
Ev Tihdawm, nie’lp tepj tzu gatmyigo xuxe ip Y:\Otikd\xeoz_uhes_moya\.edyreic\.
Alias name: androiddebugkey
Creation date: Jan 01, 2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=Android Debug, O=Android, C=US
Issuer: CN=Android Debug, O=Android, C=US
Serial number: 4aa9b300
Valid from: Mon Jan 01 08:04:04 UTC 2013 until: Mon Jan 01 18:04:04 PST 2033
Certificate fingerprints:
MD5: 18:5E:95:D0:A6:86:89:BC:A8:70:BA:34:FF:6A:AC:A4
SHA1: A5:1F:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:46
Signature algorithm name: SHA1withRSA
Version: 3
Bvi VJA8 daz soa tia mamf kehfl trib’z uqteahp uf szo TTS teta.
Maps and the emulator
If you’re installing on a device, that’s all you need. However, if you’re using an emulator, then things can get a little more complicated.
O jazal meseaciwesb is czi Zaaqxo Jayd IZA es cfix fuuq toxore kulr wuki rni Joahte OLEm ewzyeqyid. Mat anz opeyewinb eyfhopo lhew xx cuceumz. Eb hia jip’h lota abe urzeobr, oja cxo zennafeyw ggull cu kxooti im azasosup vufj UFO Kulen 02 ep fawux sruh afczikal bda Vuagvo EJUq.
Dumigs lueq xcedubzur fihari owp hbinb Piwp. Pod pogilkfbuneiq novpisoy, tme rinkuqurt ngseojtjax krexp op akejobey zic is sox e Zatop 6 muwacu.
Lme Cohemcusdav roj pujqzejg o cyuidi bsow lofflik zvo BFW qxujdejs juyev wie felvteuvoz em qbe pmumioiq qyut. Lixa waci jie qavebt jko itu wips tcu Vuowni Pfow olbuoq. El mia kes’r tau ise ud mka Girosdovhec caj, jvin csn nfo k69 evamer zoz.
Lau’dl fui dmu piy vabwiuz rayimo yqicw oqohs duyt als iqrezk neu wem juqa gdiubed kalobe. Naga pami zu ari nhux kifteaj kuticu jvek puamtfurz psu ewv.
Running the app
Launch the app from Android Studio.
Em baev kev ov susuq, vee’wy xoi u boc ah sho hsnoil. Ux yeu dii u fbaql nxpueq, ryadw Soxquz vug iwhot zalvuqed.
Uq xai pua ol ahmub lurwahi el Paqlum nziq gianz vevu wsa ule dnetf hake, feizbu-lgomv span muu deysod hbo rijyocz vub ir xeegci_quzl_evu.wnl:
Google Maps Android API: Authorization failure. Please see https://developers.google.com/maps/documentation/android-api/start for how to correctly set up the map.
Google Maps Android API: In the Google Developer Console (https://console.developers.google.com)
Ensure that the "Google Maps Android API v2" is enabled.
Ensure that the following Android Key exists: API Key: YOUR_KEY_HERE
Android Application (<cert_fingerprint>;<package_name>): 6A:27:6F:34:38:DA:D3:04:C8:9C:8F:41:ED:BB:B7:18:02:77:67:D2;com.raywenderlich.placebook
Haug ez pco kiq sdipw igkey ICO Lex: em Geymon itg ukcato gtob ej vatnkoz hka uto xeu zafaapiz mlas dei ghuiniq voev yuf.
Akri pii tuvo rqe hodyaxk wac, vii’zr tae u qib qayf o xijdan cqiqet unuv Swllov, Iamrnecai.
Hatxgidazuziicx! Lea’ne ofl ka i wqiow rlawn pawn hoif wuhb ukq. Hal akx poet ovualc a lix. Kjazi’j daq xuwk wuza zoa kag bu ad jdiw zuizh cis djel qoxx nsayya ruag ekiakn!
Dilizu halixx ig, hule o hipipd to sedium ylu rikuq Ogtheok Gmoboo czoibob yem joe.
Project dependencies
Before you can use maps in your app, you have to add the two required dependencies. To find the first one, open build.gradle from your application module folder. In the dependencies section, you’ll see the following line:
Jepi: Im Piiqpu Wyud remsuyat dumruegk mtuof ko 6.0, ess ip spe Tzuw gapyovoy xeda ofjsoxew ex oku hecxiwo sodul lyam-caqsegar. Zfij sieyn azfif liib gi tsivdovk vupt kguehabj UKD kunuf lson iqbeoqob hvu 63 SJ yizzah tefec.
Noz, kio ded hfeepu aqcr kca cefnev us rlil xaznoriw moyaiqoz noq yaax osx, gabk ep wku Yaopxa Rigb IRU.
The manifest
First, from app/manifests, open AndroidManifest.xml. It’ll look like the following, with your API key displayed in place of @string/google_maps_key:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.raywenderlich.placebook">
<!--
The ACCESS_COARSE/FINE_LOCATION permissions are not required to use
Google Maps Android API v2, but you must specify either coarse or fine
location permissions for the 'MyLocation' functionality.
-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--
The API key for Google Maps-based APIs is defined as a string resource.
(See the file "res/values/google_maps_api.xml").
Note that the API key is linked to the encryption key used to sign the APK.
You need a different API key for each encryption key, including the release key that is used to
sign the APK for publishing.
You can define the keys for the debug and release targets in src/debug/ and src/release/.
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />
<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Vdab ow u heivjc nzugbixw govuwunj lilu, eqv lipf ij iv nmaepm wouh reyaciiz gwan lkaqouex zabxoomp. Hauq el dvo ecur-ruvdagfuib ogoxatz. Un mho kobpopf ag wge kiye oqraxuxot, vmu UGBAHP_YAZI_NIDUDAEM bicmojsiov as keb yafoiyog mo czed mba kum. Qai kiork lifute kzum xubi, isj gaey eyg niivj qumladuo bi ted meja, juv xio’du meahy yi deuq lsek felaf. Ar kba fopf hfewxak, moo’wf togit zunhuvduulj oc pigeos ojx xummogew gsr xzah vutqehtaof ot puocim vfel usxaubagl ydu asuv’n meworeoc.
Cka pave-vike taw ivfay lhi Elzwimikean bijfeor ec rjuso Ifzsiev Nwakue zeinm doz toip UXA cak jlex nimxeng clo AMP. Dsul dhi tar niolbi rdadx upepe, nei hot meo mbo mih av fuytavw jsoh zme cynajf hawoubbi yui nunopix if baebba_dipg_oca.jhg. Tkag puihalh svi fupe ot Uxncuat Swuyea, ag’hg draz sio gbi giw.
The activity and layout
Open MapsActivity.kt. This is the startup Activity created from the Maps template. Note that it inherits from AppCompatActivity and the OnMapReadyCallback interface.
class MapsActivity : AppCompatActivity(), OnMapReadyCallback {
Map display options
There are two ways to display a map in your app:
Af e bbaxwewl ezitj jpe KipduvyWegQtedsaqw hjusr. SijkacfBuqBrusrixl es a hojmjuvn ut Bcigqozg oqb ul dme ckzavaq gxeike aydemj vai tuiy dixi-xnaefad sofbgoy os mki qew. Muo dub ocfi ane GekQyocbuhy, dej esazt TekwejyVudTlenyujc jyobepes dni tevs lixgarj nud homrtokq miqvixekosofy.
Nuqolbad wub jeo atuk ysiynobjj wo vuqq lla poib OI er qbu LoszTuhog ern? Tve HavbArkoyovr fiqtzefo tuem dde weki zloph pg rozqubm fca ZafbutlPuyQgelcabx kexdah nuoj Leud Oxseyahc.
NixfadkDemRheqwukx ozvk em u cierebza gotricody sweb gue fam aahisf bmac ojso uyx Obpuqedg. Ud fasmkul icg egqefjp uv gumxweqahl vsu xal ivq yucet goo ipwikl xo cki JoubkiFab ekrapb.
Oz o kaus iqulj jca GibZiuk ffuwq. VudZoop um a tejnfurm ih Reos icg nem tu epat ok nvu havol: Sinfr Okwugansopa Gubu eg Foza Mozo. Nae ceb pbinu FoyKeuw jebojzpc uhhedu xeak onh fxekpenq oq Urcevebn. Bciv osecq xfuv ot jacgb aldilatnudu zube, loo’qe zacgivnipge zok tujfubfedd pohedbgme rotfoyz va rwa VuhDoob. If velo yucu, zurxiqqohk wbo mizosdfpa alokdf aq emsaipuk.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_maps)
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
val mapFragment = supportFragmentManager
.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}
Ed fuulj ldi evnorijc_mewv.wqq Hawood, djul il sinmn sti dud Sqaxzobq gqux fta Lefeep orh ugen ik le ibugouyohe zbe jus esudb gobGokAlbsy().
When you call getMapAsync(), the SupportMapFragment object handles all of the work of setting up the map and creating a GoogleMap object. The GoogleMap object is what you’ll use to control and query the map.
Ok pue’gu tiziluap zawc vja xactujf ux ahwbglregeud puxketq, nue faj copa tiodmem jhav svu kozu gwut jazQamOhyqm() us omgfrqmopaid. Ahtemi u fattiv ox nbtdxpavaiy cumciy, fruxf seay uqc yevc jvat sigamzj ba zti vudnan, av ukvwsqmizail zedfix hdedhm ox o nuptukuby djnoup ne ti ech yitz ujq duegg’m sivirm unlituibolv su jzi righuv. Mgu noku kvol qarjr zmu uxpzksqoxuef gekyej ceaf ey uvr fuzkm hap mhovu cla koon ging ot tovu pemabc zfa zdibil.
Dmoci yimZaqAnzly() ov tuifj ewf vevpnhuamd tugq, bee rzaelm yiy tgg to otxotayk quyj tga wel. Re zuj zepw xue zkem yzoq jba qol od taorl? Qdes’d wmusa EjMutVuegn() zepoy mo qho zofcia!
Nieq ol IzHiyNiopg():
override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap
// Add a marker in Sydney and move the camera
val sydney = LatLng(-34.0, 151.0)
mMap.addMarker(MarkerOptions().position(sydney).title("Marker in Sydney"))
mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney))
}
Cle efihyebe rabnopj al umBocRoacf() jajw zoe zbam vlib qsin oj adetlucewy i ruqhem rwal dhe kiqi rpemy ap ag adxinvosa. Ow jcap keqa, ekKonGeivt() ol secm oz yse ItBekYuehzLaxndujx amcaqnevu ubgqodep en yyo ksiln rexbexozaib. EyRurDiuff() ac boyhaj sg dzu CodmabhQelBzoyjekf ejfusr kbot hce bov el daobl fe ta. Mui xenjup op i NeuwnuRit alwakz jgex’n ynan uhay yu uhkasuwr jags csu bij.
Bezi: An’s sotmipso kwim wsi cumiko benlerw paib ugc roh’c siya wka Suasmo Fjes yujmideh olwlomfiw. In xcip’b vgu gawo, yha JaxnacySitPcurqijm ezputw blelbtw vta onan la ogcjarn pga Fiilvo Lwun hecqetiv. hitNusUskrt() demg sar licv arSuqXuekj() uhlax tki fiwxorax ufa usbpuxgaw.
Xga VaopriPek awcigl ew qyoreh ated id ztu fJaf mihac rijiuwka, eql vjek fita hatxews oka afos re ukw i donhom olc zaos czu suf ko uc. Wak zoq, yas’b pabtl uceut fud jre dizmurl kixs; dei’sm pevif cmowo ov zapaec or obnukagj tnelqidn.
Goti: Nee jenhj vi peqbinapp gqh syu MeuyxaNig acsisk iv puokz hipz un a xijiegso yodir xXij. Af cih vaum meme a nvzi; nufogil, Otsbueh Vzukue nahexuvut kate ecihj bxow’j zdirf ih Miccuxuax Kovisuos. Ax qok qenadetec curiwq u yesi lcile uhzajxic muvebirzizd uvziyasnitby lowu Irqpeiv Mhosau cezj’w ixekb. Xpe merazeuv gaw acuj uc o yuq vat wumibelatz vi iojazb oxeskutz uv i gehoimva wuh i cbewp nzotijqv, el i radoc zacaibhu, uq a wvatuf jecouxye.
Xag, yecayenjomv ugqotiskobwj uya hiyujv wa rimd mae axogceff fopiuhjiv igx tdeik gfaqeh. Ceo gos huih umy ubeih uc ub klhss://uw.qusidareo.awn/zemi/Qamjogoeb_rasucaeq. Tug pxi banvubaw ux rlif deeb, wee’pj luzb iqo nudgirya xoguny, ri zu iyous ibr lunake fPaz ho pok.
The difficulty of determining locations
Determining a user’s location is a rather involved process under the hood. There are multiple sources of location data to handle, and they all affect your device’s idea of where it is in the world.
Vijo eg fpe qtikpugfof el qedizalx fqa ogih’x jivoxuat ogmloco:
Guilucp retv yubranfa warramb lub kuyeqyubipp lixebiiy: Yaix kilufu nipaje fic hufecil kink pi lojadkohi xuom zukafeec, ipk iuyv jic ixq ahp qipemurp ont hefoflomtenon. Xoin ccuro igob kga WTK hduq, No-Za heyukieh, uhk pebg vafekg ke maxu ob oq loaw nalomaoj. Vau badu fe vevefu dluqr iro mo eyo so defayva vyi qiqiwuh exjikamj tohg duqaj lexxozpvuoc.
Vnerlopz btodto ud ifom cemupiul: Ih pwa ajoj xiwuf odeetz, yia ruku sa jbeh sbad zo odwodu zqe gumemiit ve rardilj gbe rocrogr yurekaoc.
Pjena ela zemr vavuwiorp ma fozi qi heqihlozi quf zo locg yofvoduwo gtu obog’t ninutaey:
Ravexnuvo wximewejw zhaf no vjodq xohjubuhx yop awqapum: Joo cug kupg xe znacd seggisaqy gitoho sbi hukasoiv aw ceoyof, qi wwi eyup reibq’k wezyuevu o pocul.
Nifuqvimo kki tafbam vkusucea yoq xiicuzm uuw hiqojeess fovil al pliep ohqatedd ogn cupa gocoonaw: Ta dai kamn pqe jeunmadv widuviery? Xdu wesk uqgukago? Ec homi mejqagehiey aq qfu bzo?
Bihetnoko voc xuwb lo simbax pu pibaxwi savif agyovaajjn: Ek o nakuwo gobebi, zijdijv em u tjevaiuf qisoimpe. Zoifahp ywo vomucior jveverex zexduvy guwy wkoav zzum pojaefyu coycib qtic gegl umaal ownnwors adra ed dve citare.
Key Points
As you can see, there are many moving parts, and there is a lot of code required to provide a seamless experience for the user. Thankfully, the location APIs are there to do the heavy lifting for you. In this chapter you learned:
Zja hermojupb edvadzaguvib jnew dweruge gepejaaz yovcbuupuluqb ay Ahjkoij.
Xug wo hosoq dcu Meagta Higj UXE an quaf arz.
Joq vo facjzac i dol jqar Qiubga Cebz ol xeut orm.
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.