Node.js-kirjasto liikennepaikkojen välisten etäisyyksien laskemiseen

153 views
Skip to first unread message

Petja Touru

unread,
May 9, 2018, 3:31:22 AM5/9/18
to rata_digi...@googlegroups.com



Morjes,

Kirjoittelin pienehkön Node.js-kirjaston liikennepaikkojen välisen etäisyyden laskemiseen, jota voi käyttää vapaasti erilaisissa käyttötarkoituksissa. Homma toimii myös vaikka toinen liikennepaikoista sijaitsisi eri rataosalla kuin ensimmäinen, kiitos Dijkstran algoritmin. Tiedot perustuvat Infra-API:n liikennepaikkatietoihin.


Toivottavasti kirjastosta on hyötyä muille API:n tietoja hyödyntäville!

Jaan kirjastoa MIT-lisenssillä.
Hyödyntäessäsi kirjastoani, muistathan mainita kirjastoni lisäksi myös tietolähteen.

Teemu Sirkiä

unread,
May 9, 2018, 4:03:27 AM5/9/18
to rata.digitraffic.fi
Hyvää työtä!

Oletko huomannut tai huomioinut, ettei ratakilometri ole välttämättä aina kilometrin mittainen? Eri puolilta rataverkkoa löytyy kaikenlaisia kummallisia paikkoja. Tulos ei siis ole välttämättä aivan täsmällinen (voi heittää muutamia kilometrejä), jos kilometrien pituuksia ei huomioi.

Halutessaan asiaa voi vertailla tähän https://julkaisut.liikennevirasto.fi/pdf8/lv_2018-01_luettelo_rautatieliikennepaikoista_web.pdf josta löytyy liikennepaikkavälien viralliset pituudet.

Petja Touru

unread,
May 9, 2018, 4:24:44 AM5/9/18
to rata.digitraffic.fi
Tämä asia on tiedossa, mutta en ole keksinyt miten sen voisi välttää fiksusti. Koneluettavassa muodossa linkkaamaasi luetteloa tarkempine etäisyyksineen tuskin saanee.

Kirjastoni laskee Hki - Kli välille matkaksi 996 km, vaikka ratakilometrimerkki Kolarissa onkin 1067. Eroa on siis 71 kilometriä. Kumpi näistä nyt sitten onkaan lähempänä totuutta.

Voisin tästä seikasta nyt ainakin toistaiseksi pistää maininnan kirjastoni README-tiedostoon.

Teemu Sirkiä

unread,
May 9, 2018, 4:41:00 AM5/9/18
to rata.digitraffic.fi
Ehkä tätä problematiikkaa voisi tässä avata muillekin muutaman esimerkin avulla.

Ratakilometrijärjestelmässä sijainnit ilmoitetaan muodossa 107+500, mikä tarkoittaa kilometripylväästä 107 mennään 500 metriä eteenpäin. Saman kilometrin sisällä on aina turvallista tehdä vähennyslaskuja eli esimerkiksi väli 107+250 ja 107+750 on varmasti 500 metriä.

Kuitenkin jos halutaan tietää etäisyys paikkojen 106+500 ja 107+500 välillä, niin se ei aina suinkaan ole 1000 metriä ja tällainen oletus on vaarallinen. Tässä pitäisi tietää, kuinka pitkä ratakilometri 106 on metreissä. Lisäksi siitäkään ei ole mitään takuuta, että numerot menisivät aina järjestyksessä, eli esimerkiksi 107-pylvään jälkeen voisikin tulla pylväs 109.

Infra-APIsta löytyy kilometrien pituudet: https://rata.digitraffic.fi/infra-api/0.2/kilometrimerkit.html Siellä on esimerkiksi radalla 005 ratakilometri 190, joka on vain 35 metriä pitkä. Pisin ratakilometri on radalla 221 ratakilometri 199, jonka pituus on peräti 3288 metriä. Tällaisia kummajaisia on syntynyt, kun ratojen linjaukset ovat esim. oikaisujen myötä muuttuneet. Tuolta löytyy myös tieto seuraavasta pylväästä.

Itsekin olen joskus kaipaillut täällä APIin mahdollisuutta saada liikennepaikkojen välimatkoja. Infra-API sisältää liikennepaikkavälit (joiden avulla olisi muuten helppo muodostaa se verkko), mutta ei niiden pituuksia. Liikennepaikkojen väli on infrassa lisäksi ratainfraltaan vähän epäsoveltuva tähän, koska se ei ala aseman kohdalta, jolloin pituutta ei voi laskea siitä viivasta.

Homma on tosiaan ikävän monimutkainen...

Juhani Pirttilahti

unread,
May 9, 2018, 6:01:54 AM5/9/18
to rata.digitraffic.fi
Minä olen tehnyt omaan käyttööni verkkomallin käyttäen aiempana mainitun luettelon etäisyystietoja. Olen siihen myös lisännyt muut Liike-järjestelmän paikat, että reititys toimii (käytän pgroutingia reititykseen ja se taitaa sisäisesti myös soveltaa djikstraa).

Tuo mainitsemasi Hki - Kli välin matka on näiden virallisten etäisyyksien perusteella 955,2 km. Heittoa on siis noin 10 km.

Teemu Sirkiä

unread,
May 9, 2018, 6:06:46 AM5/9/18
to rata.digitraffic.fi


keskiviikko 9. toukokuuta 2018 13.01.54 UTC+3 Juhani Pirttilahti kirjoitti:

Tuo mainitsemasi Hki - Kli välin matka on näiden virallisten etäisyyksien perusteella 955,2 km. Heittoa on siis noin 10 km.

Noin 95 % ratakilometreistä osuu pituusvälille 990 - 1010 metriä, joten suurimmassa osassa tapauksista vähennyslasku on suht turvallista. Tuhannen kilometrin matkalla alkaa kuitenkin jo tuntua ja on riski, että sinne tulee noita kummajaisia väliin.

Petja Touru

unread,
May 9, 2018, 7:59:52 AM5/9/18
to rata.digitraffic.fi
keskiviikko 9. toukokuuta 2018 11.41.00 UTC+3 Teemu Sirkiä kirjoitti:
Infra-APIsta löytyy kilometrien pituudet: https://rata.digitraffic.fi/infra-api/0.2/kilometrimerkit.html Siellä on esimerkiksi radalla 005 ratakilometri 190, joka on vain 35 metriä pitkä. Pisin ratakilometri on radalla 221 ratakilometri 199, jonka pituus on peräti 3288 metriä. Tällaisia kummajaisia on syntynyt, kun ratojen linjaukset ovat esim. oikaisujen myötä muuttuneet. Tuolta löytyy myös tieto seuraavasta pylväästä.

Itsekin olen joskus kaipaillut täällä APIin mahdollisuutta saada liikennepaikkojen välimatkoja. Infra-API sisältää liikennepaikkavälit (joiden avulla olisi muuten helppo muodostaa se verkko), mutta ei niiden pituuksia. Liikennepaikkojen väli on infrassa lisäksi ratainfraltaan vähän epäsoveltuva tähän, koska se ei ala aseman kohdalta, jolloin pituutta ei voi laskea siitä viivasta.

Homma on tosiaan ikävän monimutkainen...

Onko nyt siis turvallista että luon verkon kaikista kilometrimerkeistä (/kilometrimerkit) ottaessani huomioon ratakilometrien pituudet?

Mikäli nykyisestä radasta haarautuu toinen rata, miten tuolta /kilometrimerkit -endpointista saan tämän selville? "seuraavaKilometrimerkki" lienee aina samalla radalla.

Teemu Sirkiä

unread,
May 9, 2018, 9:00:15 AM5/9/18
to rata.digitraffic.fi


keskiviikko 9. toukokuuta 2018 14.59.52 UTC+3 Petja Touru kirjoitti:

Onko nyt siis turvallista että luon verkon kaikista kilometrimerkeistä (/kilometrimerkit) ottaessani huomioon ratakilometrien pituudet?

Mikäli nykyisestä radasta haarautuu toinen rata, miten tuolta /kilometrimerkit -endpointista saan tämän selville? "seuraavaKilometrimerkki" lienee aina samalla radalla.

Jotta asia ei muuttuisi yhtään helpommaksi, niin ratakilometrijärjestelmään liittyy tosiaan vielä radan numero. Esimerkiksi pääradan numero on 003. Havukoskelta lähtee Kehärata numerolla 123. Havukoskella on kilometrisijainnit (003) 17+725 ja (123) 33+250. Päärataa pohjoiseen kilometrit kasvavat ja Kehäradalla taas vastapäivään ne pienenevät.

Välin Hiekkaharju - Asola pituuden laskemiseksi pitää laskea ensin rataa 003 Hiekkaharjun ja Havukosken väli. Tämän jälkeen täytyy havaita, että Asola on radalla 123 ja käyttää Havukosken tuon radan kilometrilukemaa ja selvittää etäisyys Asolasta (123) 31+596 Havukoskelle (123) 33+250.

Seuraava kilometrimerkki vaikuttaisi tosiaan olevan aina saman ratanumeron seuraava merkki, jolloin täytyy pitää kirjaa, millä liikennepaikalla ratanumero vaihtuu ja vielä tutkia, mennäänkö ko. rataa nousevaan vai laskevaan suuntaan.

Melkoinen päänsärky tämä siis on, jos haluaa laskea tarkasti oikein.

Solita / Jüppe

unread,
May 9, 2018, 9:09:23 AM5/9/18
to rata.digitraffic.fi
Moi,

infra-api:n seuraavassa versiossa ratakmvali-metodi palauttaa myös pyydetyn välin pituuden. Se on yksinkertainen yhteenlasku, joka kuitenkin huomioi kilometrien todelliset pituudet sekä mahdolliset puuttuvat kilometrit.

Rautatieliikennepaikat-metodi palauttaa tällä hetkellä suurimman osan junien aikatauluissa löytyvistä sijainneista. Rautatieliikennepaikka on siis joko Liikennepaikka, Seisake tai Linjavaihde, eli tämä metodi palauttaa toistaiseksi hieman ylimääräistäkin sisältöä. Tähän on tulossa jonkinlaista muutosta, sillä järjestelmissä on hieman sekaannusta käsitteiden suhteen (Rautatieliikennepaikka, Liikennepaikka, Liikennepaikan-osa, muut-aikatauluissa-mahdollisesti-esiintyvät-sijainnit). Toivottavasti saadaan pian jokin metodi palauttamaan kaikki aikatauluissa mahdollisesti esiintyvät sijainnit.

Mikäli teet reititystä aikatauluissa esiintyvien sijaintien suhteen, yksi mahdollisuus on muodostaa sijainneista graafi ratakilometrisijaintien (ratanumeron) perusteella, ja ottaa kahden pisteen välinen etäisyys tulevan rajapintaversion ratakmvali-metodin avulla.

Haarautumisiin on tulossa rajapintaan myös apuja, eli vaihteisiin tietoa siitä miten raiteet niistä haarautuvat.

keskiviikko 9. toukokuuta 2018 14.59.52 UTC+3 Petja Touru kirjoitti:

Petja Touru

unread,
May 9, 2018, 1:29:34 PM5/9/18
to rata_digi...@googlegroups.com
Itse henkilökohtaisesti näkisin kätevänä jos "seuraavaKilometrimerkki" olisi yksittäisen ID:n sijasta usean ID:n array. Tämä mahdollistaisi myös nykyisestä radasta erkanevien ratojen ilmaisemisen sekä Kehäradan liittymisen päärataan Havukoskella. Tällä hetkellä kun Kehäradan viimeisen kilometrimerkin kohdalla seuraava kilometrimerkki on "null", on melko hankalaa erotella Kehärataa pistoraiteesta.

Esimerkiksi Havukosken kohdalla olevasta kilometrimerkistä näkisin heti että "ahaa tästä pääsee sekä radan 123 kilometrille 33, että radan 003 kilometrille 18" ilman että minun tarvitsee erikseen hakea vielä vaihteita ja liikennepaikkoja sekä yhdistää näitä tietoja aiemmin hakemiini kilometreihin, tai tehdä Teemun mainitsemaa "päänsärkyä".

Teemu Sirkiä

unread,
May 9, 2018, 3:18:24 PM5/9/18
to rata.digitraffic.fi
Periaatteessa verkon voisi muodostaa ottamalla infra-API:n tarjoamat rautatieliikennepaikat solmuiksi ja muodostaa kaaret API:n liikennepaikkavälien mukaisesti. Mielestäni jokaisella liikennepaikkavälillä kummallekin päälle pitäisi löytyä liikennepaikalta samalla ratanumerolla oleva kilometrisijainti. Käytännössä tämä etäisyys pituusmittausraidetta pitkin olisi kätevää liittää osaksi tämän liikennepaikkavälin attribuuttivalikoimaa. Jüpen kertoma parannus etäisyyden laskentaan on yksittäisissä tapauksissa kätevä, mutta ei toimi hyvin tilanteeseen, jossa haluttaisiin saada kokonaismatka juuri vaikka sille Kolarin-junalle, koska liikennepaikkavälejä on iso määrä ja jokainen vaatii oman kyselyn.

Tässä törmätään lisäksi vielä taas inframallinnuksen haasteisiin. Liikennepaikkavälit eivät sisällä kaikkia rautatieliikennepaikkoja, esim. seisakkeita tai liikennepaikkojen osia. Eli tätä kautta ei saada malliin kaaria vaikkapa Puistolan tai Pasilan naapureihin, jolloin osa solmuista jää ilman kytkentöjä muihin solmuihin. Infra-API:n tietojen perusteella ei saada siis esimerkiksi Helsingin ja Riihimäen välisiä rautatieliikennepaikkoja listattua järjestyksessä muuten kuin katsomalla radalla 003 olevat rautatieliikennepaikat kilometrien mukaisessa järjestyksessä.

Petja Touru

unread,
May 10, 2018, 1:40:33 AM5/10/18
to rata.digitraffic.fi
Kannatan Teemun ideoita.

Liikennepaikkavälin attribuutteihin pitäisi tosiaan saada pituusmittausraiteen pituus, tai vähintään ainakin viite siihen, jotta sitten voimme GeoJSON:ista laskea ko. raiteen pituuden siihen tarkoitetuilla kaavoilla. Tietysti voisin myös ottaa kaikki liikennepaikkavälin raiteet, laskea niiden pituudet ja ottaa keskiarvon, vaikka se onkin hieman ehkä kyseenalaistettava menettelytapa.

Mutta ymmärsinkö nyt oikein, että tulevaisuudessakaan ei pysty seisakkeiden tai liikennepaikan osien väliä hakemaan liikennepaikkavalit-endpointista?

Niin kauan kun näin on, en pysty hakemaan etäisyyksiä seisakkeilta/seisakkeille tai liikennepaikan osilta/liikennepaikan osille. Vaikka järjestäisinkin samalle ratanumerolle kuuluvat seisakkeet ja liikennepaikan osat ratakilometrin perusteella.

Solita / Jüppe

unread,
May 10, 2018, 3:29:22 AM5/10/18
to rata.digitraffic.fi
Moi,

Liikennepaikkaväli sisältää aina seisakkeet ja linjavaihteet. (Liikennepaikan osat puolestaan ovat liikennepaikkojen alueella ja sisältyvät siten liikennepaikkoihin.)
Toisinsanoen, Liikennepaikkaväli on aina kahden LIIKENNEPAIKAN väli, ja saattaa sisältää muita RAUTATIELIIKENNEPAIKKOJA (seisakkeita ja linjavaihteita).

Tämä määritelmä ei ole kovin selkeä, mutta näin se ainakin toistaiseksi on määritelty (olkoonkin etten ole löytänyt kirjallista määritelmää Liikennepaikkavälille, mutta rautatieliikenteen asiantuntijat ovat kertoneet asian olevan näin). Esimerkiksi museorata Ollin linjavaihteelta Porvoon Liikennepaikalle ei kuulu mihinkään liikennepaikkaväliin, sillä ainoa alueella oleva liikennepaikkaväli on Keravalta Sköldvikiin.

Liikennepaikkavälin tietoihin voisi toki lisätä jonkin laskennallisen pituuden, mutta onko se hyödyllinen? Esimerkiksi Helsingin Liikennepaikka ulottuu useita kilometreja pohjoiseen, joten ajattelisitko esimerkiksi Huopalahti-Helsinki-liikennepaikkavälin pituuden laskettavaksi Helsingin pohjoisreunalle vai jonkin liikennepaikan osan (minkä? Kivihaan? Helsingin Aseman?) kohdalle, vai jopa kiskotusten päähän 0-etäisyyden kohdalle asti?

Teemu Sirkiä

unread,
May 10, 2018, 3:41:58 AM5/10/18
to rata_digi...@googlegroups.com


torstai 10. toukokuuta 2018 10.29.22 UTC+3 Solita / Jüppe kirjoitti:
Moi,

Liikennepaikkaväli sisältää aina seisakkeet ja linjavaihteet. (Liikennepaikan osat puolestaan ovat liikennepaikkojen alueella ja sisältyvät siten liikennepaikkoihin.)
Toisinsanoen, Liikennepaikkaväli on aina kahden LIIKENNEPAIKAN väli, ja saattaa sisältää muita RAUTATIELIIKENNEPAIKKOJA (seisakkeita ja linjavaihteita).

Tuo sisältää on vähän monitulkintainen. Jos tämän muotoilee vähän täsmällisemmin, niin liikennepaikkaväli on siis nykymuodossaan aina kahden sellaisen rautatieliikennepaikan väli, joissa päissä olevat rautatieliikennepaikat ovat tyyppiä liikennepaikka. Tarkoittaa käytännössä sitä, että tämän liikennepaikkavälin "sisään" voi jäädä mm. seisakkeita, joista API ei kerro liikennepaikkavälimielessä mitään. Esimerkiksi liikennepaikkavälillä Oulunkylä-Malmi on välissä Pukinmäen seisake.
 
Tämä määritelmä ei ole kovin selkeä, mutta näin se ainakin toistaiseksi on määritelty (olkoonkin etten ole löytänyt kirjallista määritelmää Liikennepaikkavälille, mutta rautatieliikenteen asiantuntijat ovat kertoneet asian olevan näin). Esimerkiksi museorata Ollin linjavaihteelta Porvoon Liikennepaikalle ei kuulu mihinkään liikennepaikkaväliin, sillä ainoa alueella oleva liikennepaikkaväli on Keravalta Sköldvikiin.

Jos puhutaan liikennepaikkaväleistä, niin asia on varmasti näin. Tämän lisäksi tarvittaisiin vähän tiheämpi verkko, josta löytyisivät kaikki aikataulutuksessa käytettävät pisteet, jotta verkko olisi täydellinen ja toisaalta kertoisi myös, minkä liikennepaikkojen osien välillä on yhteyksiä jne.
 
Liikennepaikkavälin tietoihin voisi toki lisätä jonkin laskennallisen pituuden, mutta onko se hyödyllinen? Esimerkiksi Helsingin Liikennepaikka ulottuu useita kilometreja pohjoiseen, joten ajattelisitko esimerkiksi Huopalahti-Helsinki-liikennepaikkavälin pituuden laskettavaksi Helsingin pohjoisreunalle vai jonkin liikennepaikan osan (minkä? Kivihaan? Helsingin Aseman?) kohdalle, vai jopa kiskotusten päähän 0-etäisyyden kohdalle asti?

Käytännössä se on hyödyllinen hyvin monissa tapauksissa. Se pituus tulisi laskea siis ko. välin liikennepaikkojen kilometrisijainneista, jolloin liikennepaikkojen väli A - B - C on oikeasti koko matka liikennepaikalta A paikalle C eikä vain noiden linjalle sijoittuvien osien pituus kuten tapahtuisi välin viivan pituuden mittaamalla. Ja vielä hyödyllisemmäksi tämä muuttuisi, jos olisi se tiheämpi verkko, jolloin olisi mahdollista laskea se välimatka vaikka Pasilasta sinne Puistolaan etsimällä oikea reitti verkosta. Näin ei tarvitsisi miettiä sitäkään, mikä kilometrisijainti valittaisiin osiin jaetulle liikennepaikalle, kun jokainen sen osista sisältää oman kilometrisijainnin ja voidaan määritellä etäisyydet myös niiden välille.

Solita / Jüppe

unread,
May 10, 2018, 7:44:11 AM5/10/18
to rata.digitraffic.fi
Moi,

Aikatauluissa voinee esiintyä, kuten on keskusteltu, rautatieliikennepaikkojen ja liikennepaikan osien lisäksi myös laitureita, vaihteita ja raideosuuksia, joten nykyisistä kahdesta metodista (rautatieliikennepaikat ja liikennepaikkavälit) ei aikatauluja kattavaa verkkoa saa mitenkään rakennettua.

Sijainneissa on se ongelma, että osiinjaetulla liikennepaikalla (esim Helsinki) ei taida olla pistemäistä sijaintia, vaan vain alue (https://julkaisut.liikennevirasto.fi/pdf3/lo_2011-13_rato_7_web.pdf):

"Rautatieliikennepaikan sijainti on aina ilmoitettava pisteenä ratakilometrijärjestelmässä lukuun ottamatta osiin jaettua liikennepaikkaa. Osiin jaetulla liikennepaikalla on alue ja siihen kuuluvilla osilla on kullakin pistemäinen sijainti."


Tämä on sinänsä järkevää näin, että osiinjaettu liikennepaikkahan (kuten Helsinki) ei voi edes esiintyä aikatauluissa, joten pistemäisellä sijainnilla ei liene virkaa?

Infra-APIin lisättäköön laskettavaksi ainakin seuraavat asiat (samalla kun metodeja muutenkin korjataan hieman vastaamaan määrittelyitä):
1) seisakkeille ja linjavaihteille tieto niiden liikennepaikkavälistä
2) liikennepaikan osille tieto niiden liikennepaikasta


Teemu Sirkiä

unread,
May 10, 2018, 10:25:45 AM5/10/18
to rata.digitraffic.fi


torstai 10. toukokuuta 2018 14.44.11 UTC+3 Solita / Jüppe kirjoitti:

Sijainneissa on se ongelma, että osiinjaetulla liikennepaikalla (esim Helsinki) ei taida olla pistemäistä sijaintia, vaan vain alue (https://julkaisut.liikennevirasto.fi/pdf3/lo_2011-13_rato_7_web.pdf):

"Rautatieliikennepaikan sijainti on aina ilmoitettava pisteenä ratakilometrijärjestelmässä lukuun ottamatta osiin jaettua liikennepaikkaa. Osiin jaetulla liikennepaikalla on alue ja siihen kuuluvilla osilla on kullakin pistemäinen sijainti."


Tämä on totta. Mutta osilla "Helsinki asema" ja "Pasila asema" on pistemäinen sijainti, jolloin näiden välinen etäisyys on mahdollista laskea. Ja tulevaisuudessa toivottavasti saataisiin sellainen verkko, jossa on kaikki aikatauluissa esiintyvät sijainnit ja yhteydet näiden välillä.

Juhani Pirttilahti

unread,
May 17, 2018, 7:38:54 AM5/17/18
to rata.digitraffic.fi
On Thursday, 10 May 2018 17:25:45 UTC+3, Teemu Sirkiä wrote:
Ja tulevaisuudessa toivottavasti saataisiin sellainen verkko, jossa on kaikki aikatauluissa esiintyvät sijainnit ja yhteydet näiden välillä.

Päätin julkaista oman verkkomallini public domainina (liitteenä edges.json).
edges.json

Petja Touru

unread,
May 17, 2018, 10:23:56 AM5/17/18
to rata.digitraffic.fi
Kiitos!

Koska tällä hetkellä ohjelmallisesti ei ole mitään helppoa tapaa näitä tarkkoja etäisyyksiä selvittää, on manuaalisesti koottu JSON näillä näkymin ainut järkevä vaihtoehto. Täytynee tuota omaakin JS-kirjastoa modifioida tämän suuntaiseksi. Onneksi liikennepaikkojen etäisyydet ei muutu päivittäin, joten työmäärä pysyy kurissa.

torstai 17. toukokuuta 2018 14.38.54 UTC+3 Juhani Pirttilahti kirjoitti:
Päätin julkaista oman verkkomallini public domainina (liitteenä edges.json).

Haluatko kertoa hieman prosessista jolla otit mukaan myös PDF:stä puuttuvat Liike-järjestelmän sijainnit kuten esimerkiksi Riihimäen kolmioraiteen (R060)?

Juhani Pirttilahti

unread,
May 18, 2018, 12:27:29 PM5/18/18
to rata.digitraffic.fi
On Thursday, 17 May 2018 17:23:56 UTC+3, Petja Touru wrote:
Haluatko kertoa hieman prosessista jolla otit mukaan myös PDF:stä puuttuvat Liike-järjestelmän sijainnit kuten esimerkiksi Riihimäen kolmioraiteen (R060)?


Tutkin mitkä yhteydet esiintyvät aikatauluissa ja määritin puuttuville sijainneille etäisyydet käyttäen ratakilometrejä.

Reply all
Reply to author
Forward
0 new messages