diff --git a/.eslintrc.js b/.eslintrc.js index 0ae9192ea5..7d3d9cccf2 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -16,6 +16,7 @@ module.exports = { 'import/no-extraneous-dependencies': 'off', 'import/no-named-default': 'off', 'import/extensions': 'off', + 'import/prefer-default-export': 'off', // react 'react/button-has-type': 'warn', 'react/destructuring-assignment': 'off', diff --git a/app/action/FutureRoutesActions.js b/app/action/FutureRoutesActions.js index f07a0fc755..a0fcd80552 100644 --- a/app/action/FutureRoutesActions.js +++ b/app/action/FutureRoutesActions.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/prefer-default-export export function saveFutureRoute(actionContext, futureRoute) { actionContext.dispatch('saveFutureRoute', futureRoute); } diff --git a/app/action/SearchActions.js b/app/action/SearchActions.js index 5923f2aaf4..8a3a69576a 100644 --- a/app/action/SearchActions.js +++ b/app/action/SearchActions.js @@ -1,4 +1,3 @@ -// eslint-disable import/prefer-default-export export function saveSearch(actionContext, endpoint) { actionContext.dispatch('SaveSearch', endpoint); } diff --git a/app/action/SearchSettingsActions.js b/app/action/SearchSettingsActions.js index 6ba81bdae3..12675f7780 100644 --- a/app/action/SearchSettingsActions.js +++ b/app/action/SearchSettingsActions.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/prefer-default-export export function saveRoutingSettings(actionContext, settings) { actionContext.dispatch('saveRoutingSettings', settings); } diff --git a/app/action/userPreferencesActions.js b/app/action/userPreferencesActions.js index 6aa3530495..58473b2a2d 100644 --- a/app/action/userPreferencesActions.js +++ b/app/action/userPreferencesActions.js @@ -1,5 +1,3 @@ -/* eslint-disable import/prefer-default-export */ - export function setLanguage(actionContext, language) { actionContext.dispatch('SetLanguage', language); } diff --git a/app/client.js b/app/client.js index 12648e39a5..f6bd29677b 100644 --- a/app/client.js +++ b/app/client.js @@ -159,8 +159,7 @@ async function init() { ttl: 60 * 60 * 1000, }), urlMiddleware({ - url: () => - Promise.resolve(`${config.URL.OTP}index/graphql${queryParameters}`), + url: () => Promise.resolve(`${config.URL.OTP}gtfs/v1${queryParameters}`), }), errorMiddleware(), retryMiddleware({ diff --git a/app/component/EmbeddedSearchGenerator.js b/app/component/EmbeddedSearchGenerator.js index c7674eeef5..a1cce23319 100644 --- a/app/component/EmbeddedSearchGenerator.js +++ b/app/component/EmbeddedSearchGenerator.js @@ -13,7 +13,12 @@ import { isBrowser } from '../util/browser'; const LocationSearch = withSearchContext(DTAutosuggest, true); -const locationSearchTargets = ['Locations', 'CurrentPosition', 'Stops']; +const locationSearchTargets = [ + 'Locations', + 'CurrentPosition', + 'Stations', + 'Stops', +]; const sources = ['Favourite', 'History', 'Datasource']; const languages = [ diff --git a/app/component/FavouritesContainer.js b/app/component/FavouritesContainer.js index 8edd951dac..7ee61cb4a0 100644 --- a/app/component/FavouritesContainer.js +++ b/app/component/FavouritesContainer.js @@ -325,7 +325,7 @@ class FavouritesContainer extends React.Component { const isLoading = this.props.favouriteStatus === FavouriteStore.STATUS_FETCHING_OR_UPDATING; const { requireLoggedIn, isLoggedIn } = this.props; - const targets = ['Locations', 'CurrentPosition', 'MapPosition']; + const targets = ['Locations', 'Stations', 'CurrentPosition', 'MapPosition']; const { fontWeights } = this.context.config; const favouritePlaces = this.props.favourites.filter( item => item.type === 'place', diff --git a/app/component/Icon.js b/app/component/Icon.js index a5af834fd9..68c5dff706 100644 --- a/app/component/Icon.js +++ b/app/component/Icon.js @@ -59,6 +59,7 @@ IconBadge.asString = (badgeFill, badgeText, badgeTextFill) => { function Icon({ backgroundShape, + backgroundColor, badgeFill, badgeText, badgeTextFill, @@ -88,7 +89,13 @@ function Icon({ aria-label={ariaLabel} > {backgroundShape === 'circle' && ( - + )} {!dataURI && } {dataURI && ( @@ -106,6 +113,7 @@ function Icon({ Icon.propTypes = { backgroundShape: PropTypes.oneOf(['circle']), + backgroundColor: PropTypes.string, badgeFill: PropTypes.string, badgeText: PropTypes.oneOfType([PropTypes.string, PropTypes.number]), badgeTextFill: PropTypes.string, @@ -123,6 +131,7 @@ Icon.propTypes = { Icon.defaultProps = { backgroundShape: undefined, + backgroundColor: 'white', badgeFill: undefined, badgeText: undefined, badgeTextFill: undefined, diff --git a/app/component/IndexPage.js b/app/component/IndexPage.js index c607bebf9a..b737c62ba7 100644 --- a/app/component/IndexPage.js +++ b/app/component/IndexPage.js @@ -299,21 +299,31 @@ class IndexPage extends React.Component { const origin = this.pendingOrigin || this.props.origin; const destination = this.pendingDestination || this.props.destination; const sources = ['Favourite', 'History', 'Datasource']; - const stopAndRouteSearchTargets = ['Stops', 'Routes']; - const locationSearchTargets = [ + const stopAndRouteSearchTargets = ['Stations', 'Stops', 'Routes']; + let locationSearchTargets = [ 'Locations', 'CurrentPosition', 'FutureRoutes', - 'Stops', ]; - if (useCitybikes(config.vehicleRental?.networks, config)) { - stopAndRouteSearchTargets.push('VehicleRentalStations'); - locationSearchTargets.push('VehicleRentalStations'); - } - if (config.includeParkAndRideSuggestions) { - stopAndRouteSearchTargets.push('ParkingAreas'); - locationSearchTargets.push('ParkingAreas'); + if (config.locationSearchTargetsFromOTP) { + // configurable setup + locationSearchTargets = [ + ...locationSearchTargets, + ...config.locationSearchTargetsFromOTP, + ]; + } else { + // default setup + locationSearchTargets.push('Stations'); + locationSearchTargets.push('Stops'); + if (useCitybikes(config.vehicleRental?.networks, config)) { + stopAndRouteSearchTargets.push('VehicleRentalStations'); + locationSearchTargets.push('VehicleRentalStations'); + } + if (config.includeParkAndRideSuggestions) { + stopAndRouteSearchTargets.push('ParkingAreas'); + locationSearchTargets.push('ParkingAreas'); + } } const locationSearchTargetsMobile = [ ...locationSearchTargets, diff --git a/app/component/MobileView.js b/app/component/MobileView.js index 006f84ff06..d8ab0decc4 100644 --- a/app/component/MobileView.js +++ b/app/component/MobileView.js @@ -1,11 +1,40 @@ import PropTypes from 'prop-types'; -import React, { useRef, useLayoutEffect, useState } from 'react'; -import { configShape } from '../util/shapes'; +import React, { + useRef, + useLayoutEffect, + useState, + forwardRef, + useImperativeHandle, +} from 'react'; +import { matchShape } from 'found'; import MapBottomsheetContext from './map/MapBottomsheetContext'; import MobileFooter from './MobileFooter'; +import { isBrowser } from '../util/browser'; + +import { + PREFIX_ROUTES, + PREFIX_NEARYOU, + PREFIX_ITINERARY_SUMMARY, +} from '../util/path'; + +const noBottomSheetResetAtContentChange = [ + PREFIX_ROUTES, + PREFIX_NEARYOU, + PREFIX_ITINERARY_SUMMARY, +]; + +const BOTTOM_SHEET_OFFSET = 20; +const topBarHeight = 64; + +function getMiddlePosition() { + return isBrowser + ? Math.floor((window.innerHeight - topBarHeight) * 0.45) + : 400; +} -function slowlyScrollTo(el, to = 0, duration = 1000) { +function slowlyScrollTo(el, to, done) { const element = el; + const duration = 500; const start = element.scrollTop; const change = to - start; const increment = 20; @@ -20,6 +49,8 @@ function slowlyScrollTo(el, to = 0, duration = 1000) { if (currentTime < duration) { setTimeout(animateScroll, increment); + } else { + done(); } }; @@ -36,101 +67,129 @@ Math.easeInOutQuad = function easeInOutQuad(a, b, c, d) { return (-c / 2) * (t * (t - 2) - 1) + b; }; -export default function MobileView({ - header, - map, - content, - settingsDrawer, - selectFromMapHeader, - expandMap, - searchBox, -}) { - if (settingsDrawer) { - return
{settingsDrawer}
; - } - const scrollRef = useRef(null); - const topBarHeight = 64; - // pass these to map according to bottom sheet placement - const [bottomsheetState, changeBottomsheetState] = useState({ - context: { mapBottomPadding: 0, buttonBottomPadding: 0 }, - }); - - useLayoutEffect(() => { - if (map) { - const paddingHeight = (window.innerHeight - topBarHeight) * 0.9; // height of .drawer-padding, defined as 90% of map height - const newSheetPosition = paddingHeight / 2; - scrollRef.current.scrollTop = newSheetPosition; - changeBottomsheetState({ - context: { - mapBottomPadding: newSheetPosition, - buttonBottomPadding: newSheetPosition, - }, - }); - } - }, [header]); - - useLayoutEffect(() => { - if (map && expandMap) { - const newSheetPosition = 0; - slowlyScrollTo(scrollRef.current); - changeBottomsheetState({ - context: { - mapBottomPadding: newSheetPosition, - buttonBottomPadding: newSheetPosition, - }, - }); +const MobileView = forwardRef( + ( + { + header, + map, + content, + settingsDrawer, + selectFromMapHeader, + mapRef, + searchBox, + match, + }, + ref, + ) => { + if (settingsDrawer) { + return
{settingsDrawer}
; } - }, [expandMap]); + const scrollRef = useRef(null); + const pathParts = match.location.pathname.split('/'); + const pagePrefix = pathParts?.length > 1 ? pathParts[1] : undefined; - const onScroll = e => { - if (map) { + // pass these to map according to bottom sheet placement + const [bottomPadding, setBottomPadding] = useState(getMiddlePosition()); + + const onScroll = e => { if (e.target.className === 'drawer-container') { - const scroll = e.target.scrollTop; - changeBottomsheetState({ - context: { ...bottomsheetState.context, buttonBottomPadding: scroll }, + mapRef?.setBottomPadding(e.target.scrollTop); + setBottomPadding(e.target.scrollTop); + } + }; + + const changeBottomPadding = (padding, slowly) => { + if (slowly) { + slowlyScrollTo(scrollRef.current, padding, () => { + mapRef?.forceRefresh(); + mapRef?.setBottomPadding(padding); + setBottomPadding(padding); }); + } else { + if (scrollRef.current) { + scrollRef.current.scrollTop = padding; + } + mapRef?.setBottomPadding(padding); + setBottomPadding(padding); } - } - }; + }; + + useImperativeHandle(ref, () => ({ + setBottomSheet: (pos, slowly) => { + const pad = + pos === 'middle' ? getMiddlePosition() : BOTTOM_SHEET_OFFSET; + changeBottomPadding(pad, slowly); + }, + })); + + /* UI does not have a consistent way to render the map into mobile view. + Most views don't get a map reference. Itinerary page has the ref and knows + how to control bottom sheet whenever needed. + + In most page transitions, we can only try to guess from props which view is + in question and what should happen when props change. + */ + + // effect below triggers when itinerary detail view opens + useLayoutEffect(() => { + if (pagePrefix === PREFIX_ITINERARY_SUMMARY) { + changeBottomPadding(getMiddlePosition()); + } + }, [header]); - return ( -
- {selectFromMapHeader} - {searchBox} - {map ? ( - <> - - {map} - -
-
-
-
-
- {header} - {content} + // always set bottom sheet when component mounts + useLayoutEffect(() => { + if (map) { + changeBottomPadding(getMiddlePosition()); + } + }, []); + + // set bottom sheet for most views at content change + useLayoutEffect(() => { + if (map && !noBottomSheetResetAtContentChange.includes(pagePrefix)) { + changeBottomPadding(getMiddlePosition()); + } + }, [content]); + + return ( +
+ {selectFromMapHeader} + {searchBox} + {map ? ( + <> + + {map} + +
+
+
+
+
+ {header} + {content} +
-
- - ) : ( -
-
- {header} - {content} -
+ + ) : ( +
+
+ {header} + {content} +
- -
- )} -
- ); -} + +
+ )} +
+ ); + }, +); MobileView.propTypes = { header: PropTypes.node, @@ -139,7 +198,9 @@ MobileView.propTypes = { settingsDrawer: PropTypes.node, selectFromMapHeader: PropTypes.node, searchBox: PropTypes.node, - expandMap: PropTypes.number, + // eslint-disable-next-line + mapRef: PropTypes.object, + match: matchShape.isRequired, }; MobileView.defaultProps = { @@ -149,9 +210,7 @@ MobileView.defaultProps = { settingsDrawer: undefined, selectFromMapHeader: undefined, searchBox: undefined, - expandMap: undefined, + mapRef: undefined, }; -MobileView.contextTypes = { - config: configShape.isRequired, -}; +export default MobileView; diff --git a/app/component/RentalVehicle.js b/app/component/RentalVehicle.js index 0da03f9816..c2ef8a2f33 100644 --- a/app/component/RentalVehicle.js +++ b/app/component/RentalVehicle.js @@ -8,11 +8,8 @@ import { import { rentalVehicleShape } from '../util/shapes'; const RentalVehicle = ({ rentalVehicle }, { config }) => { - const disabled = !rentalVehicle.operative; - const vehicleIcon = getRentalNetworkIcon( getRentalNetworkConfig(rentalVehicle.rentalNetwork.networkId, config), - disabled, ); return (
diff --git a/app/component/RentalVehicleContent.js b/app/component/RentalVehicleContent.js index 1e21d5fea7..e983e4cca3 100644 --- a/app/component/RentalVehicleContent.js +++ b/app/component/RentalVehicleContent.js @@ -45,10 +45,7 @@ const RentalVehicleContent = ( rentalVehicle.rentalNetwork.networkId, config, ); - const vehicleIcon = getRentalNetworkIcon( - networkConfig, - !rentalVehicle.operative, - ); + const vehicleIcon = getRentalNetworkIcon(networkConfig); if (networks) { return ( diff --git a/app/component/RouteNumberContainer.js b/app/component/RouteNumberContainer.js index d1f06f72a6..eac349b498 100644 --- a/app/component/RouteNumberContainer.js +++ b/app/component/RouteNumberContainer.js @@ -13,6 +13,7 @@ const RouteNumberContainer = ( isCallAgency, withBicycle, occupancyStatus, + mode, ...props }, { config }, @@ -23,7 +24,7 @@ const RouteNumberContainer = ( className={className} isCallAgency={isCallAgency || route.type === 715} color={route.color ? `#${route.color}` : null} - mode={route.mode} + mode={mode !== undefined ? mode : route.mode} text={getLegText(route, config, interliningWithRoute)} withBicycle={withBicycle} occupancyStatus={occupancyStatus} @@ -41,6 +42,7 @@ RouteNumberContainer.propTypes = { fadeLong: PropTypes.bool, withBicycle: PropTypes.bool, occupancyStatus: PropTypes.string, + mode: PropTypes.string, }; RouteNumberContainer.defaultProps = { @@ -52,6 +54,7 @@ RouteNumberContainer.defaultProps = { className: '', withBicycle: false, occupancyStatus: undefined, + mode: undefined, }; RouteNumberContainer.contextTypes = { diff --git a/app/component/StopTimetablePage.js b/app/component/StopTimetablePage.js index d76b841353..75fb1983dd 100644 --- a/app/component/StopTimetablePage.js +++ b/app/component/StopTimetablePage.js @@ -28,12 +28,12 @@ class StopTimetablePage extends React.Component { } onDateChange = value => { + this.setState({ date: value }); this.props.relay.refetch( { date: value, }, null, - () => this.setState({ date: value }), ); }; @@ -48,11 +48,8 @@ class StopTimetablePage extends React.Component { ); } diff --git a/app/component/StopsNearYouPage.js b/app/component/StopsNearYouPage.js index 2c8059654c..cb82593ee0 100644 --- a/app/component/StopsNearYouPage.js +++ b/app/component/StopsNearYouPage.js @@ -264,6 +264,11 @@ class StopsNearYouPage extends React.Component { } }; + // store ref to map + setMWTRef = ref => { + this.MWTRef = ref; + }; + updateLocation = () => { const { centerOfMap } = this; const { mode } = this.props.match.params; @@ -695,6 +700,7 @@ class StopsNearYouPage extends React.Component { ...this.props.favouriteVehicleStationIds, ]} breakpoint={this.props.breakpoint} + setMWTRef={this.setMWTRef} /> ); } @@ -766,6 +772,7 @@ class StopsNearYouPage extends React.Component { onEndNavigation={this.setCenterOfMap} onMapTracking={this.setCenterOfMap} breakpoint={this.props.breakpoint} + setMWTRef={this.setMWTRef} /> ); }} @@ -821,7 +828,7 @@ class StopsNearYouPage extends React.Component { modeSet: this.context.config.iconModeSet, getAutoSuggestIcons: this.context.config.getAutoSuggestIcons, }; - const targets = ['Locations', 'Stops']; + const targets = ['Locations', 'Stations', 'Stops']; if ( useCitybikes( this.context.config.vehicleRental?.networks, @@ -949,6 +956,8 @@ class StopsNearYouPage extends React.Component { content={this.renderContent()} map={this.renderMap()} searchBox={this.renderSearchBox()} + mapRef={this.MWTRef} + match={this.props.match} /> )} /> diff --git a/app/component/StopsNearYouSearch.js b/app/component/StopsNearYouSearch.js index d516c76482..bbb95f48cc 100644 --- a/app/component/StopsNearYouSearch.js +++ b/app/component/StopsNearYouSearch.js @@ -45,7 +45,7 @@ function StopsNearYouSearch( targets={ mode === 'CITYBIKE' ? ['VehicleRentalStations'] - : ['Stops', 'Routes'] + : ['Stops', 'Stations', 'Routes'] } isMobile={isMobile} selectHandler={selectHandler} // prop for context handler diff --git a/app/component/SwipeableTabs.js b/app/component/SwipeableTabs.js index b9ad5f119a..8efb2935f8 100644 --- a/app/component/SwipeableTabs.js +++ b/app/component/SwipeableTabs.js @@ -63,13 +63,8 @@ const handleKeyPress = (e, reactSwipeEl) => { }; export default class SwipeableTabs extends React.Component { - constructor(props) { - super(); - this.state = { tabIndex: props.tabIndex }; - } - static propTypes = { - tabIndex: PropTypes.number, + tabIndex: PropTypes.number.isRequired, tabs: PropTypes.arrayOf(PropTypes.node).isRequired, onSwipe: PropTypes.func.isRequired, hideArrows: PropTypes.bool, @@ -82,7 +77,6 @@ export default class SwipeableTabs extends React.Component { static defaultProps = { hideArrows: false, navigationOnBottom: false, - tabIndex: 0, classname: undefined, }; @@ -100,7 +94,7 @@ export default class SwipeableTabs extends React.Component { } tabBalls = tabsLength => { - const tabIndex = parseInt(this.state.tabIndex, 10); + const tabIndex = parseInt(this.props.tabIndex, 10); const onLeft = tabIndex; const onRight = tabsLength - tabIndex - 1; let tabBalls = []; @@ -161,17 +155,15 @@ export default class SwipeableTabs extends React.Component { )} tabIndex={0} className={`swipe-tab-ball ${ - index === this.state.tabIndex ? 'selected' : '' + index === this.props.tabIndex ? 'selected' : '' } ${ball.smaller ? 'decreasing-small' : ''} ${ ball.small ? 'decreasing' : '' } ${ball.hidden ? 'hidden' : ''}`} onClick={() => { - this.setState({ tabIndex: index }); this.props.onSwipe(index); }} onKeyDown={e => { if (isKeyboardSelectionEvent(e)) { - this.setState({ tabIndex: index }); this.props.onSwipe(index); } }} @@ -247,7 +239,6 @@ export default class SwipeableTabs extends React.Component { callback: i => { // force transition after animation should be over because animation can randomly fail sometimes setTimeout(() => { - this.setState({ tabIndex: i }); this.props.onSwipe(i); }, 300); }, @@ -262,11 +253,7 @@ export default class SwipeableTabs extends React.Component {
)} -
+
{this.props.classname === 'swipe-desktop-view' && (
)} @@ -282,7 +269,7 @@ export default class SwipeableTabs extends React.Component { {!hideArrows && (
@@ -322,7 +309,7 @@ export default class SwipeableTabs extends React.Component { {!hideArrows && (
= tabs.length - 1), + active: !(disabled || this.props.tabIndex >= tabs.length - 1), })} >
= tabs.length - 1 + disabled || this.props.tabIndex >= tabs.length - 1 ? 'disabled' : '' }`} @@ -361,7 +348,6 @@ export default class SwipeableTabs extends React.Component { callback: i => { // force transition after animation should be over because animation can randomly fail sometimes setTimeout(() => { - this.setState({ tabIndex: i }); this.props.onSwipe(i); }, 300); }, diff --git a/app/component/TerminalTimetablePage.js b/app/component/TerminalTimetablePage.js index 4abc98025d..249ce062d7 100644 --- a/app/component/TerminalTimetablePage.js +++ b/app/component/TerminalTimetablePage.js @@ -34,12 +34,12 @@ class TerminalTimetablePage extends React.Component { } onDateChange = value => { + this.setState({ date: value }); this.props.relay.refetch( { date: value, }, null, - () => this.setState({ date: value }), ); }; @@ -48,11 +48,8 @@ class TerminalTimetablePage extends React.Component { ); } diff --git a/app/component/Timetable.js b/app/component/Timetable.js index 2ed3363d04..22c212ae06 100644 --- a/app/component/Timetable.js +++ b/app/component/Timetable.js @@ -82,19 +82,12 @@ class Timetable extends React.Component { }), ).isRequired, }).isRequired, - propsForDateSelect: PropTypes.shape({ - startDate: PropTypes.string, - selectedDate: PropTypes.string, - onDateChange: PropTypes.func, - }).isRequired, - date: PropTypes.string, + startDate: PropTypes.string.isRequired, + onDateChange: PropTypes.func.isRequired, + date: PropTypes.string.isRequired, language: PropTypes.string.isRequired, }; - static defaultProps = { - date: undefined, - }; - static contextTypes = { router: routerShape.isRequired, match: matchShape.isRequired, @@ -183,7 +176,7 @@ class Timetable extends React.Component { }; dateForPrinting = () => { - const selectedDate = moment(this.props.propsForDateSelect.selectedDate); + const selectedDate = moment(this.props.date); return (
@@ -331,9 +324,7 @@ class Timetable extends React.Component { }${locationType.toLowerCase()}/${this.props.stop.gtfsId}`; const timeTableRows = this.createTimeTableRows(timetableMap); const timeDifferenceDays = moment - .duration( - moment(this.props.propsForDateSelect.selectedDate).diff(moment()), - ) + .duration(moment(this.props.date).diff(moment())) .asDays(); return ( <> @@ -349,10 +340,10 @@ class Timetable extends React.Component { ) : null}
{ - this.props.propsForDateSelect.onDateChange(e); + this.props.onDateChange(e); const showRoutes = this.state.showRoutes.length ? this.state.showRoutes.join(',') : undefined; diff --git a/app/component/ToggleMapTracking.js b/app/component/ToggleMapTracking.js index 5ad5a3125c..32436fb133 100644 --- a/app/component/ToggleMapTracking.js +++ b/app/component/ToggleMapTracking.js @@ -12,7 +12,7 @@ function ToggleMapTracking(props) { tabIndex={0} aria-label={props.ariaLabel} > - +
); } diff --git a/app/component/TopLevel.js b/app/component/TopLevel.js index 73ca5b0866..467253bedd 100644 --- a/app/component/TopLevel.js +++ b/app/component/TopLevel.js @@ -163,6 +163,7 @@ class TopLevel extends React.Component { content={this.props.content} header={this.props.header} selectFromMapHeader={this.props.selectFromMapHeader} + match={this.props.match} /> )} desktop={() => ( diff --git a/app/component/itinerary/BicycleLeg.js b/app/component/itinerary/BicycleLeg.js index 33531a3a6b..4be92094c7 100644 --- a/app/component/itinerary/BicycleLeg.js +++ b/app/component/itinerary/BicycleLeg.js @@ -375,9 +375,9 @@ export default function BicycleLeg(
openSettings(true)} + onClick={() => openSettings(true, true)} onKeyPress={e => - isKeyboardSelectionEvent(e) && openSettings(true) + isKeyboardSelectionEvent(e) && openSettings(true, true) } className="itinerary-transit-leg-route-bike" > diff --git a/app/component/itinerary/CustomizeSearch.js b/app/component/itinerary/CustomizeSearch.js index 591965d318..f0c4ace7ad 100644 --- a/app/component/itinerary/CustomizeSearch.js +++ b/app/component/itinerary/CustomizeSearch.js @@ -167,6 +167,27 @@ class CustomizeSearch extends React.Component {
)} +
+
+ +
+
+
+
+ +
+
+ {config.showTicketSelector && ( +
+ +
+ )} {useScooters(config.vehicleRental?.networks) && (
@@ -187,7 +208,10 @@ class CustomizeSearch extends React.Component {
{ if ( @@ -213,6 +237,23 @@ class CustomizeSearch extends React.Component { }} />
+ {config.vehicleRental.scooterInfoLink && ( + { + e.stopPropagation(); + }} + className="external-link" + href={ + config.vehicleRental.scooterInfoLink[intl.locale] + .url + } + target="_blank" + rel="noreferrer" + > + + + + )}
)}
)} -
-
- -
-
-
-
- -
-
- {config.showTicketSelector && ( -
- -
- )} ); diff --git a/app/component/itinerary/Itinerary.js b/app/component/itinerary/Itinerary.js index af4b12d6f3..f23d646275 100644 --- a/app/component/itinerary/Itinerary.js +++ b/app/component/itinerary/Itinerary.js @@ -88,7 +88,7 @@ export function RouteLeg( ) { const isCallAgency = isCallAgencyPickupType(leg); let routeNumber; - const mode = getRouteMode(leg.route); + const mode = getRouteMode(leg.route, config); const getOccupancyStatus = () => { if (hasOneTransitLeg) { @@ -118,7 +118,7 @@ export function RouteLeg( )), - this.props.setNavigation && ( -
+ this.props.setNavigation && ( -
- ), + /> + ), config.showCO2InItinerarySummary && !legsWithScooter && ( { - const subpath = getSubPath(''); if (activeIndex === index) { onSelectImmediately(index); } else { router.replace({ ...match.location, state: { selectedItineraryIndex: index }, - pathname: `${getItineraryPagePath(params.from, params.to)}${subpath}`, }); addAnalyticsEvent({ diff --git a/app/component/itinerary/ItineraryPage.js b/app/component/itinerary/ItineraryPage.js index 9cce3fa9aa..06ea3eef92 100644 --- a/app/component/itinerary/ItineraryPage.js +++ b/app/component/itinerary/ItineraryPage.js @@ -1,74 +1,81 @@ /* eslint-disable react/no-array-index-key */ /* eslint-disable no-nested-ternary */ -import PropTypes from 'prop-types'; -import React, { useEffect, useState, useRef, cloneElement } from 'react'; -import { fetchQuery } from 'react-relay'; -import { FormattedMessage, intlShape } from 'react-intl'; import { matchShape, routerShape } from 'found'; -import isEqual from 'lodash/isEqual'; import isEmpty from 'lodash/isEmpty'; +import isEqual from 'lodash/isEqual'; import polyline from 'polyline-encoded'; +import PropTypes from 'prop-types'; +import React, { cloneElement, useEffect, useRef, useState } from 'react'; +import { FormattedMessage, intlShape } from 'react-intl'; +import { fetchQuery } from 'react-relay'; +import { saveFutureRoute } from '../../action/FutureRoutesActions'; +import { saveSearch } from '../../action/SearchActions'; +import { TransportMode } from '../../constants'; +import { mapLayerShape } from '../../store/MapLayerStore'; +import { + clearLatestNavigatorItinerary, + getDialogState, + getLatestNavigatorItinerary, + setDialogState, + setLatestNavigatorItinerary, +} from '../../store/localStorage'; +import { addAnalyticsEvent } from '../../util/analyticsUtils'; +import { getWeatherData } from '../../util/apiUtils'; +import { isIOS } from '../../util/browser'; +import { boundWithMinimumArea } from '../../util/geo-utils'; +import { + getIntermediatePlaces, + otpToLocation, + parseLatLon, +} from '../../util/otpStrings'; +import { getItineraryPagePath, streetHash } from '../../util/path'; +import { + PLANTYPE, + getPlanParams, + getSettings, + planQueryNeeded, +} from '../../util/planParamUtil'; import { - relayShape, configShape, mapLayerOptionsShape, + relayShape, } from '../../util/shapes'; +import { epochToTime } from '../../util/timeUtils'; +import { getAllNetworksOfType } from '../../util/vehicleRentalUtils'; import DesktopView from '../DesktopView'; +import Loading from '../Loading'; import MobileView from '../MobileView'; import ItineraryPageMap from '../map/ItineraryPageMap'; -import ItineraryListContainer from './ItineraryListContainer'; +import AlternativeItineraryBar from './AlternativeItineraryBar'; +import CustomizeSearch from './CustomizeSearch'; import { spinnerPosition } from './ItineraryList'; +import ItineraryListContainer from './ItineraryListContainer'; import ItineraryPageControls from './ItineraryPageControls'; -import ItineraryTabs from './ItineraryTabs'; -import Navigator from './Navigator'; -import { getWeatherData } from '../../util/apiUtils'; -import Loading from '../Loading'; -import { getItineraryPagePath, streetHash } from '../../util/path'; -import { boundWithMinimumArea } from '../../util/geo-utils'; -import planConnection from './PlanConnection'; import { - getSelectedItineraryIndex, - reportError, - addFeedbackly, - getTopics, - getBounds, - isEqualItineraries, - settingsLimitRouting, - setCurrentTimeToURL, - updateClient, - stopClient, - getRentalStationsToHideOnMap, addBikeStationMapForRentalVehicleItineraries, + addFeedbackly, checkDayNight, filterItinerariesByFeedId, - transitEdges, filterWalk, + getBounds, + getRentalStationsToHideOnMap, + getSelectedItineraryIndex, + getTopics, + isEqualItineraries, mergeBikeTransitPlans, mergeScooterTransitPlan, quitIteration, + reportError, scooterEdges, + setCurrentTimeToURL, + settingsLimitRouting, + stopClient, + updateClient, } from './ItineraryPageUtils'; -import { isIOS } from '../../util/browser'; -import { addAnalyticsEvent } from '../../util/analyticsUtils'; -import { - parseLatLon, - otpToLocation, - getIntermediatePlaces, -} from '../../util/otpStrings'; -import AlternativeItineraryBar from './AlternativeItineraryBar'; -import { - PLANTYPE, - getSettings, - getPlanParams, - planQueryNeeded, -} from '../../util/planParamUtil'; -import { epochToTime } from '../../util/timeUtils'; -import { saveFutureRoute } from '../../action/FutureRoutesActions'; -import { saveSearch } from '../../action/SearchActions'; -import CustomizeSearch from './CustomizeSearch'; -import { getAllNetworksOfType } from '../../util/vehicleRentalUtils'; -import { TransportMode } from '../../constants'; -import { mapLayerShape } from '../../store/MapLayerStore'; +import ItineraryTabs from './ItineraryTabs'; +import NaviContainer from './NaviContainer'; +import NavigatorIntroModal from './NavigatorIntro/NavigatorIntroModal'; +import planConnection from './PlanConnection'; const MAX_QUERY_COUNT = 4; // number of attempts to collect enough itineraries @@ -110,9 +117,8 @@ const unset = { plan: {}, loading: LOADSTATE.UNSET }; export default function ItineraryPage(props, context) { const headerRef = useRef(null); const mwtRef = useRef(); - const expandMapRef = useRef(0); + const mobileRef = useRef(); const ariaRef = useRef('summary-page.title'); - const [state, setState] = useState({ ...emptyState, loading: LOADSTATE.UNSET, @@ -121,6 +127,9 @@ export default function ItineraryPage(props, context) { const [relaxScooterState, setRelaxScooterState] = useState(emptyPlan); const [scooterState, setScooterState] = useState(unset); const [combinedState, setCombinedState] = useState(emptyPlan); + const [isNavigatorIntroDismissed, setNavigatorIntroDismissed] = useState( + getDialogState('navi-intro'), + ); const altStates = { [PLANTYPE.WALK]: useState(unset), @@ -140,7 +149,7 @@ export default function ItineraryPage(props, context) { const [weatherState, setWeatherState] = useState({ loading: false }); const [topicsState, setTopicsState] = useState(null); const [mapState, setMapState] = useState({}); - const [navigation, setNavigation] = useState(false); + const [naviMode, setNaviMode] = useState(false); const { config, router } = context; const { match, breakpoint } = props; @@ -503,6 +512,9 @@ export default function ItineraryPage(props, context) { laterEdges: [...state.laterEdges, ...edges], }); } + if (arriveBy) { + resetItineraryPageSelection(); + } }; const onEarlier = async () => { @@ -554,7 +566,6 @@ export default function ItineraryPage(props, context) { return; } ariaRef.current = 'itinerary-page.itineraries-loaded'; - const newState = { ...state, loadingMore: undefined, @@ -585,6 +596,67 @@ export default function ItineraryPage(props, context) { earlierEdges: [...edges, ...state.earlierEdges], }); } + if (!arriveBy) { + resetItineraryPageSelection(); + } + }; + + // make the map to obey external navigation + function navigateMap() { + // map sticks to user location if tracking is on, so set it off + if (mwtRef.current?.disableMapTracking) { + mwtRef.current.disableMapTracking(); + } + // map will not react to location props unless they change or update is forced + if (mwtRef.current?.forceRefresh) { + mwtRef.current.forceRefresh(); + } + } + + const getCombinedPlanEdges = () => { + return [ + ...(state.earlierEdges || []), + ...(mapHashToPlan()?.edges || []), + ...(state.laterEdges || []), + ]; + }; + + const getItinerarySelection = () => { + const hasNoTransitItineraries = filterWalk(state.plan?.edges).length === 0; + const plan = mapHashToPlan(); + let combinedEdges; + // Remove old itineraries if new query cannot find a route + if (state.error) { + combinedEdges = []; + } else if (streetHashes.includes(hash)) { + combinedEdges = plan?.edges || []; + } else { + combinedEdges = getCombinedPlanEdges(); + if (!hasNoTransitItineraries) { + // don't show plain walking in transit itinerary list + combinedEdges = filterWalk(combinedEdges); + } + } + const selectedIndex = getSelectedItineraryIndex(location, combinedEdges); + + return { plan, combinedEdges, selectedIndex, hasNoTransitItineraries }; + }; + + const setNavigation = isEnabled => { + if (mobileRef.current) { + mobileRef.current.setBottomSheet(isEnabled ? 'bottom' : 'middle'); + } + if (!isEnabled) { + setMapState({ center: undefined, zoom: undefined, bounds: undefined }); + navigateMap(); + clearLatestNavigatorItinerary(); + } else { + const { combinedEdges, selectedIndex } = getItinerarySelection(); + if (combinedEdges[selectedIndex]?.node) { + setLatestNavigatorItinerary(combinedEdges[selectedIndex]?.node); + } + } + setNaviMode(isEnabled); }; // save url-defined location to old searches @@ -673,30 +745,17 @@ export default function ItineraryPage(props, context) { ); } - // make the map to obey external navigation - function navigateMap() { - // map sticks to user location if tracking is on, so set it off - if (mwtRef.current?.disableMapTracking) { - mwtRef.current.disableMapTracking(); - } - // map will not react to location props unless they change or update is forced - if (mwtRef.current?.forceRefresh) { - mwtRef.current.forceRefresh(); - } - } - - function getCombinedPlanEdges() { - return [ - ...(state.earlierEdges || []), - ...(mapHashToPlan()?.edges || []), - ...(state.laterEdges || []), - ]; - } - useEffect(() => { setCurrentTimeToURL(config, match); updateLocalStorage(true); addFeedbackly(context); + + const storedItinerary = getLatestNavigatorItinerary(); + + setNavigation( + storedItinerary?.end && Date.parse(storedItinerary.end) > Date.now(), + ); + return () => { if (showVehicles()) { stopClient(context); @@ -727,14 +786,14 @@ export default function ItineraryPage(props, context) { useEffect(() => { navigateMap(); - setMapState({ center: undefined, bounds: undefined }); + setMapState({ center: undefined, zoom: undefined, bounds: undefined }); if (detailView) { // If itinerary is not found in detail view, go back to summary view if (altLoadingDone() && !mapHashToPlan()?.edges?.length) { selectStreetMode(); // back to root view } - } else if (navigation) { + } else if (naviMode) { // turn off tracking when user navigates away from tracking view setNavigation(false); } @@ -748,8 +807,11 @@ export default function ItineraryPage(props, context) { useEffect(() => { // vehicles on map if (showVehicles()) { - const combinedEdges = transitEdges(getCombinedPlanEdges()); - const itineraryTopics = getTopics(config, combinedEdges, match); + const { combinedEdges, selectedIndex } = getItinerarySelection(); + const selected = combinedEdges.length + ? combinedEdges[selectedIndex] + : null; + const itineraryTopics = getTopics(selected, config); const { client } = context.getStore('RealTimeInformationStore'); // Client may not be initialized yet if there was an client before ComponentDidMount if (!isEqual(itineraryTopics, topicsState) || !client) { @@ -801,7 +863,11 @@ export default function ItineraryPage(props, context) { state.loading === LOADSTATE.DONE && scooterState.loading === LOADSTATE.DONE ) { - const plan = mergeScooterTransitPlan(scooterState.plan, state.plan); + const plan = mergeScooterTransitPlan( + scooterState.plan, + state.plan, + config.vehicleRental.allowDirectScooterJourneys, + ); setCombinedState({ plan, loading: LOADSTATE.DONE }); resetItineraryPageSelection(); } @@ -811,19 +877,17 @@ export default function ItineraryPage(props, context) { mwtRef.current = ref; }; - const focusToPoint = (lat, lon, maximize = true) => { - if (breakpoint !== 'large' && maximize) { - window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); - expandMapRef.current += 1; + const focusToPoint = (lat, lon) => { + if (mobileRef.current) { + mobileRef.current.setBottomSheet('bottom'); } navigateMap(); - setMapState({ center: { lat, lon }, bounds: null }); + setMapState({ center: { lat, lon }, zoom: 18, bounds: null }); }; - const focusToLeg = (leg, maximize = true) => { - if (breakpoint !== 'large' && maximize) { - window.scrollTo({ top: 0, left: 0, behavior: 'smooth' }); - expandMapRef.current += 1; + const focusToLeg = leg => { + if (mobileRef.current) { + mobileRef.current.setBottomSheet('bottom'); } navigateMap(); const bounds = boundWithMinimumArea( @@ -863,7 +927,7 @@ export default function ItineraryPage(props, context) { router.replace(newLocationState); }; - const showSettingsPanel = open => { + const showSettingsPanel = (open, changeScooterSettings) => { addAnalyticsEvent({ event: 'sendMatomoEvent', category: 'ItinerarySettings', @@ -876,6 +940,7 @@ export default function ItineraryPage(props, context) { ...settingsState, settingsOpen: true, settingsOnOpen: getSettings(config), + changeScooterSettings, }); if (breakpoint !== 'large') { router.push({ @@ -888,6 +953,17 @@ export default function ItineraryPage(props, context) { } return; } + if ( + settingsState.changeScooterSettings && + settingsState.settingsOnOpen.scooterNetworks.length < + getSettings(config).scooterNetworks.length + ) { + addAnalyticsEvent({ + category: 'ItinerarySettings', + action: 'SettingsEnableScooterNetwork', + name: 'AfterOnlyScooterRoutesFound', + }); + } const settingsChanged = !isEqual( settingsState.settingsOnOpen, @@ -899,6 +975,7 @@ export default function ItineraryPage(props, context) { ...settingsState, settingsOpen: false, settingsChanged, + changeScooterSettings: false, }); if (settingsChanged && detailView) { @@ -930,6 +1007,7 @@ export default function ItineraryPage(props, context) { } else if (mapState.center) { mwtProps.lat = mapState.center.lat; mwtProps.lon = mapState.center.lon; + mwtProps.zoom = mapState.zoom; } else { mwtProps.bounds = getBounds(planEdges, from, to, viaPoints); } @@ -967,36 +1045,36 @@ export default function ItineraryPage(props, context) { ); } + const itinerarySelection = getItinerarySelection(); + const { combinedEdges, selectedIndex, hasNoTransitItineraries } = + itinerarySelection; + let { plan } = itinerarySelection; + + const toggleNavigatorIntro = () => { + setDialogState('navi-intro'); + setNavigatorIntroDismissed(true); + }; + + const cancelNavigatorUsage = () => { + setNavigation(false); + toggleNavigatorIntro(); + }; + const walkPlan = altStates[PLANTYPE.WALK][0].plan; const bikePlan = altStates[PLANTYPE.BIKE][0].plan; const carPlan = altStates[PLANTYPE.CAR][0].plan; const parkRidePlan = altStates[PLANTYPE.PARKANDRIDE][0].plan; const bikePublicPlan = bikePublicState.plan; - const hasNoTransitItineraries = filterWalk(state.plan?.edges).length === 0; const settings = getSettings(config); - let plan = mapHashToPlan(); const showRelaxedPlanNotifier = plan === relaxState.plan; const showRentalVehicleNotifier = plan === relaxScooterState.plan; /* NOTE: as a temporary solution, do filtering by feedId in UI */ if (config.feedIdFiltering && plan) { plan = filterItinerariesByFeedId(plan, config); } - let combinedEdges; - // Remove old itineraries if new query cannot find a route - if (state.error) { - combinedEdges = []; - } else if (streetHashes.includes(hash)) { - combinedEdges = plan?.edges || []; - } else { - combinedEdges = getCombinedPlanEdges(); - if (!hasNoTransitItineraries) { - // don't show plain walking in transit itinerary list - combinedEdges = filterWalk(combinedEdges); - } - } - const selectedIndex = getSelectedItineraryIndex(location, combinedEdges); + const from = otpToLocation(params.from); const to = otpToLocation(params.to); const viaPoints = getIntermediatePlaces(query); @@ -1051,6 +1129,7 @@ export default function ItineraryPage(props, context) { // in mobile, settings drawer hides other content const panelHidden = !desktop && settingsDrawer !== null; let content; // bottom content of itinerary panel + if (panelHidden) { content = null; } else if (loading) { @@ -1060,15 +1139,27 @@ export default function ItineraryPage(props, context) {
); } else if (detailView) { - if (navigation) { + if (naviMode) { + const naviModeItinerary = + getLatestNavigatorItinerary() || combinedEdges[selectedIndex]?.node; + content = ( - + <> + {!isNavigatorIntroDismissed && ( + + )} + + ); } else { let carEmissions = carPlan?.edges?.[0]?.node.emissionsPerPerson?.co2; @@ -1209,7 +1300,9 @@ export default function ItineraryPage(props, context) { content={content} settingsDrawer={settingsDrawer} map={map} - expandMap={expandMapRef.current} + mapRef={mwtRef.current} + ref={mobileRef} + match={match} /> ); } diff --git a/app/component/itinerary/ItineraryPageUtils.js b/app/component/itinerary/ItineraryPageUtils.js index f307fbab6c..f77399ea17 100644 --- a/app/component/itinerary/ItineraryPageUtils.js +++ b/app/component/itinerary/ItineraryPageUtils.js @@ -30,13 +30,25 @@ import { getTotalBikingDistance, compressLegs } from '../../util/legUtils'; export function getSelectedItineraryIndex( { pathname, state } = {}, edges = [], - defaultValue = 0, ) { + // path defines the selection in detail view + const lastURLSegment = pathname?.split('/').pop(); + if (lastURLSegment !== '') { + const index = Number(pathname?.split('/').pop()); + if (!Number.isNaN(index)) { + if (index >= edges.length) { + return 0; + } + return index; + } + } + + // in summary view, look the location state if (state?.selectedItineraryIndex !== undefined) { if (state.selectedItineraryIndex < edges.length) { return state.selectedItineraryIndex; } - return defaultValue; + return 0; } /* @@ -44,13 +56,6 @@ export function getSelectedItineraryIndex( * page by an external link, we check if an itinerary selection is * supplied in URL and make that the selection. */ - const lastURLSegment = Number(pathname?.split('/').pop()); - if (!Number.isNaN(lastURLSegment)) { - if (lastURLSegment >= edges.length) { - return defaultValue; - } - return lastURLSegment; - } return 0; } @@ -82,14 +87,13 @@ export function addFeedbackly(context) { } } -export function getTopics(config, edges, match) { +export function getTopics(itinerary, config) { const itineraryTopics = []; - if (edges.length) { + if (itinerary) { const { realTime, feedIds } = config; - const selected = edges[getSelectedItineraryIndex(match.location, edges)]; - selected.node.legs.forEach(leg => { + itinerary.node.legs.forEach(leg => { if (leg.transitLeg && leg.trip) { const feedId = leg.trip.gtfsId.split(':')[0]; let topic; @@ -358,10 +362,10 @@ export function transitEdges(edges) { /** * Filters away itineraries that * 1. don't use scooters - * 2. only use scooters + * 2. only use scooters (unless allowed by allowDirectScooterJourneys) * 3. use scooters that are not vehicles */ -export function scooterEdges(edges) { +export function scooterEdges(edges, allowDirectScooterJourneys) { if (!edges) { return []; } @@ -385,7 +389,11 @@ export function scooterEdges(edges) { } }); - if (hasScooterLeg && hasNonScooterLeg && allScooterLegsHaveRentalVehicle) { + if ( + hasScooterLeg && + allScooterLegsHaveRentalVehicle && + (hasNonScooterLeg || allowDirectScooterJourneys) + ) { filteredEdges.push(edge); } }); @@ -462,9 +470,16 @@ export function mergeBikeTransitPlans(bikeParkPlan, bikeTransitPlan) { /** * Combine a scooter edge with the main transit edges. */ -export function mergeScooterTransitPlan(scooterPlan, transitPlan) { +export function mergeScooterTransitPlan( + scooterPlan, + transitPlan, + allowDirectScooterJourneys, +) { const transitPlanEdges = transitPlan.edges || []; - const scooterTransitEdges = scooterEdges(scooterPlan.edges); + const scooterTransitEdges = scooterEdges( + scooterPlan.edges, + allowDirectScooterJourneys, + ); const maxTransitEdges = scooterTransitEdges.length > 0 ? 4 : transitPlanEdges.length; diff --git a/app/component/itinerary/LegInfo.js b/app/component/itinerary/LegInfo.js index 214218f381..5bf0979d39 100644 --- a/app/component/itinerary/LegInfo.js +++ b/app/component/itinerary/LegInfo.js @@ -34,7 +34,10 @@ export default function LegInfo( !constantOperationRoutes || !constantOperationRoutes[leg.route.gtfsId]; const mode = isCallAgency ? 'call' - : getRouteMode({ mode: leg.mode, type: leg.route.type }); + : getRouteMode( + { mode: leg.mode, type: leg.route.type, gtfsId: leg.route?.gtfsId }, + config, + ); const capacity = getCapacityForLeg(config, leg); let capacityTranslation; if (capacity) { diff --git a/app/component/itinerary/Legs.js b/app/component/itinerary/Legs.js index 6a46710ac2..1da3999184 100644 --- a/app/component/itinerary/Legs.js +++ b/app/component/itinerary/Legs.js @@ -187,7 +187,14 @@ export default class Legs extends React.Component { leg.mode === 'FUNICULAR') && !leg.interlineWithPreviousLeg ) { - const mode = getRouteMode({ mode: leg.mode, type: leg.route?.type }); + const mode = getRouteMode( + { + mode: leg.mode, + type: leg.route?.type, + gtfsId: leg.route?.gtfsId, + }, + this.context.config, + ); legs.push(); } else if (leg.mode === 'AIRPLANE') { legs.push( diff --git a/app/component/itinerary/MobileTicketPurchaseInformation.js b/app/component/itinerary/MobileTicketPurchaseInformation.js index 76b0d2f4e0..633c802239 100644 --- a/app/component/itinerary/MobileTicketPurchaseInformation.js +++ b/app/component/itinerary/MobileTicketPurchaseInformation.js @@ -21,7 +21,8 @@ export default function MobileTicketPurchaseInformation( !fare.isUnknown, config.availableTickets, ); - const price = `${fare.price.toFixed(2)} €`.replace('.', ','); + const price = + fare.price > 0 ? `${fare.price.toFixed(2)} €`.replace('.', ',') : ''; const faresInfo = () => { const header = `${intl.formatMessage({ @@ -40,16 +41,14 @@ export default function MobileTicketPurchaseInformation( defaultMessage="Mobile ticket purchase information. Buy {ticketName} for {price}" />
-
{header}
+
{header}
-
-
- {config.useTicketIcons - ? renderZoneTicket(fare.ticketName, alternativeFares, true) - : fare.ticketName} -
- -
{price}
+
+ {config.useTicketIcons + ? renderZoneTicket(fare.ticketName, alternativeFares, true) + : fare.ticketName} +   + {price}
@@ -58,18 +57,16 @@ export default function MobileTicketPurchaseInformation( return (
-
- {faresInfo()} -
- - addAnalyticsEvent({ event: 'journey_planner_open_app' }) - } - > - - -
+ {faresInfo()} +
+ + addAnalyticsEvent({ event: 'journey_planner_open_app' }) + } + > + +
); diff --git a/app/component/itinerary/NaviBottom.js b/app/component/itinerary/NaviBottom.js new file mode 100644 index 0000000000..a46bac6f33 --- /dev/null +++ b/app/component/itinerary/NaviBottom.js @@ -0,0 +1,58 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { FormattedMessage } from 'react-intl'; +import { configShape } from '../../util/shapes'; +import { epochToTime } from '../../util/timeUtils'; + +export default function NaviBottom({ setNavigation, arrival }, { config }) { + const remainingDuration = Math.ceil((arrival - Date.now()) / 60000); // ms to minutes + return ( +
+
+
+ + + {remainingDuration >= 0 && ( +
+ + + + {epochToTime(arrival, config)} +
+ )} + {config.ticketLink && ( + + )} +
+
+ ); +} + +NaviBottom.propTypes = { + setNavigation: PropTypes.func.isRequired, + arrival: PropTypes.number.isRequired, +}; + +NaviBottom.contextTypes = { + config: configShape.isRequired, +}; diff --git a/app/component/itinerary/NaviCard.js b/app/component/itinerary/NaviCard.js new file mode 100644 index 0000000000..e7e89f48e3 --- /dev/null +++ b/app/component/itinerary/NaviCard.js @@ -0,0 +1,60 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import { legShape } from '../../util/shapes'; +import Icon from '../Icon'; +import { isRental } from '../../util/legUtils'; +import NaviInstructions from './NaviInstructions'; +import NaviCardExtension from './NaviCardExtension'; + +const iconMap = { + BICYCLE: 'icon-icon_cyclist', + CAR: 'icon-icon_car-withoutBox', + SCOOTER: 'icon-icon_scooter_rider', + WALK: 'icon-icon_walk', + WAIT: 'icon-icon_navigation_wait', +}; + +export default function NaviCard({ leg, nextLeg, legType, cardExpanded }) { + const iconName = legType === 'wait' ? iconMap.WAIT : iconMap[leg.mode]; + let instructions = `navileg-${leg.mode.toLowerCase()}`; + + if (isRental(leg, nextLeg)) { + if (leg.mode === 'WALK' && nextLeg?.mode === 'SCOOTER') { + instructions = `navileg-rent-scooter`; + } else { + instructions = `navileg-rent-cycle`; + } + } + return ( +
+
+ +
+ +
+ +
+
+
+ {cardExpanded && } +
+ ); +} + +NaviCard.propTypes = { + leg: legShape.isRequired, + nextLeg: legShape.isRequired, + legType: PropTypes.string.isRequired, + cardExpanded: PropTypes.bool, +}; +NaviCard.defaultProps = { + cardExpanded: false, +}; diff --git a/app/component/itinerary/NaviCardContainer.js b/app/component/itinerary/NaviCardContainer.js new file mode 100644 index 0000000000..0caff26569 --- /dev/null +++ b/app/component/itinerary/NaviCardContainer.js @@ -0,0 +1,228 @@ +import React, { useEffect, useState, useRef } from 'react'; +import PropTypes from 'prop-types'; +import { FormattedMessage, intlShape } from 'react-intl'; +import distance from '@digitransit-search-util/digitransit-search-util-distance'; +import { legShape, configShape } from '../../util/shapes'; +import { legTime, legTimeStr } from '../../util/legUtils'; +import NaviCard from './NaviCard'; +import NaviStack from './NaviStack'; +import { + getItineraryAlerts, + getTransitLegState, + getAdditionalMessages, +} from './NaviUtils'; + +const DESTINATION_RADIUS = 20; // meters +const TIME_AT_DESTINATION = 3; // * 10 seconds + +function getFirstLastLegs(legs) { + const first = legs[0]; + const last = legs[legs.length - 1]; + return { first, last }; +} + +function NaviCardContainer( + { focusToLeg, time, realTimeLegs, position }, + { intl, config }, +) { + const [currentLeg, setCurrentLeg] = useState(null); + const [cardExpanded, setCardExpanded] = useState(false); + // All notifications including those user has dismissed. + const [messages, setMessages] = useState(new Map()); + // notifications that are shown to the user. + const [activeMessages, setActiveMessages] = useState([]); + const focusRef = useRef(false); + // Destination counter. How long user has been at the destination. * 10 seconds + const destCountRef = useRef(0); + + const handleClick = () => { + setCardExpanded(!cardExpanded); + }; + + useEffect(() => { + const newLeg = realTimeLegs.find(leg => { + return legTime(leg.start) <= time && time <= legTime(leg.end); + }); + + const incomingMessages = new Map(); + + // TODO proper alert handling. + // Alerts for NaviStack + const alerts = getItineraryAlerts(realTimeLegs, intl, messages); + alerts.forEach(alert => { + incomingMessages.set(alert.id, alert); + }); + + const legChanged = newLeg?.legId + ? newLeg.legId !== currentLeg?.legId + : currentLeg?.mode !== newLeg?.mode; + const l = currentLeg || newLeg; + + if (l) { + const nextLeg = realTimeLegs.find( + leg => legTime(leg.start) > legTime(l.start), + ); + if (nextLeg?.transitLeg) { + // Messages for NaviStack. + const transitLegState = getTransitLegState(nextLeg, intl, messages); + if (transitLegState) { + incomingMessages.set(transitLegState.id, transitLegState); + } + const additionalMsgs = getAdditionalMessages( + nextLeg, + time, + intl, + config, + messages, + ); + if (additionalMsgs) { + additionalMsgs.forEach(m => { + incomingMessages.set(m.id, m); + }); + } + } + if (newLeg) { + focusToLeg?.(newLeg); + } + if (legChanged) { + setCurrentLeg(newLeg); + setCardExpanded(false); + } + } + if (incomingMessages.size || legChanged) { + // Handle messages when new messages arrives or leg is changed. + + // Current active messages. Filter away legChange messages when leg changes. + const previousValidMessages = legChanged + ? activeMessages.filter(m => m.expiresOn !== 'legChange') + : activeMessages; + + // handle messages that are updated. + const updatedMessages = previousValidMessages.map(msg => { + const incoming = incomingMessages.get(msg.id); + if (incoming) { + incomingMessages.delete(msg.id); + return incoming; + } + return msg; + }); + const newMessages = Array.from(incomingMessages.values()); + setActiveMessages([...updatedMessages, ...newMessages]); + setMessages(new Map([...messages, ...incomingMessages])); + } + + if (!focusRef.current && focusToLeg) { + // handle initial focus when not tracking + if (newLeg) { + focusToLeg(newLeg); + destCountRef.current = 0; + } else { + const { first, last } = getFirstLastLegs(realTimeLegs); + if (time < legTime(first.start)) { + focusToLeg(first); + } else { + focusToLeg(last); + } + } + focusRef.current = true; + } + + // User position and distance from currentleg endpoint. + if ( + position && + currentLeg && + distance(position, currentLeg.to) <= DESTINATION_RADIUS + ) { + destCountRef.current += 1; + } else { + // Todo: this works in transit legs, but do we need additional logic for bikes / scooters? + destCountRef.current = 0; + } + }, [time]); + + const { first, last } = getFirstLastLegs(realTimeLegs); + + let naviTopContent; + if (time < legTime(first.start)) { + naviTopContent = ( + + ); + } else if (currentLeg) { + if (!currentLeg.transitLeg) { + const nextLeg = realTimeLegs.find(leg => { + return legTime(leg.start) > legTime(currentLeg.start); + }); + let legType; + if (destCountRef.current >= TIME_AT_DESTINATION) { + legType = 'wait'; + } else { + legType = 'move'; + } + naviTopContent = ( + + ); + } else { + naviTopContent = `Tracking ${currentLeg?.mode} leg`; + } + } else if (time > legTime(last.end)) { + naviTopContent = ; + } else { + naviTopContent = ; + } + const handleRemove = index => { + setActiveMessages(activeMessages.filter((_, i) => i !== index)); + }; + + return ( + <> + + {activeMessages.length > 0 && ( + + )} + + ); +} + +NaviCardContainer.propTypes = { + focusToLeg: PropTypes.func, + time: PropTypes.number.isRequired, + realTimeLegs: PropTypes.arrayOf(legShape).isRequired, + position: PropTypes.shape({ + lat: PropTypes.number, + lon: PropTypes.number, + }), + + /* + focusToPoint: PropTypes.func.isRequired, + */ +}; + +NaviCardContainer.defaultProps = { + focusToLeg: undefined, + position: undefined, +}; + +NaviCardContainer.contextTypes = { + intl: intlShape.isRequired, + config: configShape.isRequired, +}; + +export default NaviCardContainer; diff --git a/app/component/itinerary/NaviCardExtension.js b/app/component/itinerary/NaviCardExtension.js new file mode 100644 index 0000000000..f21c0466de --- /dev/null +++ b/app/component/itinerary/NaviCardExtension.js @@ -0,0 +1,68 @@ +import React from 'react'; +import Icon from '../Icon'; +import StopCode from '../StopCode'; +import PlatformNumber from '../PlatformNumber'; +import { getZoneLabel } from '../../util/legUtils'; +import ZoneIcon from '../ZoneIcon'; +import { legShape, configShape } from '../../util/shapes'; +import { getDestinationProperties } from './NaviUtils'; + +const NaviCardExtension = ({ leg }, { config }) => { + const { stop, name } = leg.to; + const { code, platformCode, zoneId, vehicleMode } = stop || {}; + const [place, address] = name?.split(/, (.+)/) || []; + + let destination = {}; + if (stop) { + destination = getDestinationProperties(leg, stop, config); + destination.name = stop.name; + } else { + destination.iconId = 'icon-icon_mapMarker-to'; + destination.className = 'place'; + destination.name = place; + } + return ( +
+
+
+ + +
+ {destination.name} +
+ {!stop && address &&
{address}
} + {code && } + {platformCode && ( + + )} + +
+
+
+
+ ); +}; + +NaviCardExtension.propTypes = { + leg: legShape.isRequired, +}; + +NaviCardExtension.contextTypes = { + config: configShape.isRequired, +}; + +export default NaviCardExtension; diff --git a/app/component/itinerary/NaviContainer.js b/app/component/itinerary/NaviContainer.js new file mode 100644 index 0000000000..4ba123b60a --- /dev/null +++ b/app/component/itinerary/NaviContainer.js @@ -0,0 +1,72 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { legTime } from '../../util/legUtils'; +import { itineraryShape, relayShape } from '../../util/shapes'; +import NaviBottom from './NaviBottom'; +import NaviCardContainer from './NaviCardContainer'; +import { useRealtimeLegs } from './hooks/useRealtimeLegs'; + +function NaviContainer( + { itinerary, focusToLeg, relayEnvironment, setNavigation, mapRef }, + { getStore }, +) { + const { legs } = itinerary; + const position = getStore('PositionStore').getLocationState(); + + const { realTimeLegs, time, isPositioningAllowed } = useRealtimeLegs( + legs, + mapRef, + relayEnvironment, + ); + + // recompute estimated arrival + let lastTransitLeg; + let arrivalChange = 0; + + legs.forEach(leg => { + if (leg.transitLeg) { + lastTransitLeg = leg; + } + }); + + if (lastTransitLeg) { + const rtLeg = realTimeLegs.find(leg => { + return leg.legId === lastTransitLeg.legId; + }); + arrivalChange = legTime(rtLeg.end) - legTime(lastTransitLeg.end); + } + + const arrivalTime = legTime(legs[legs.length - 1].end) + arrivalChange; + + return ( + <> + {' '} + + + ); +} + +NaviContainer.propTypes = { + itinerary: itineraryShape.isRequired, + focusToLeg: PropTypes.func.isRequired, + relayEnvironment: relayShape.isRequired, + setNavigation: PropTypes.func.isRequired, + // eslint-disable-next-line + mapRef: PropTypes.object, +}; + +NaviContainer.contextTypes = { + getStore: PropTypes.func.isRequired, +}; + +NaviContainer.defaultProps = { mapRef: undefined }; + +export default NaviContainer; diff --git a/app/component/itinerary/NaviDestination.js b/app/component/itinerary/NaviDestination.js deleted file mode 100644 index b1299f311b..0000000000 --- a/app/component/itinerary/NaviDestination.js +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { FormattedMessage, intlShape } from 'react-intl'; -import Icon from '../Icon'; -import StopCode from '../StopCode'; -import { legShape } from '../../util/shapes'; - -function NaviDestination({ leg, focusToLeg }) { - const { stop, rentalVehicle, vehicleParking, vehicleRentalStation } = leg.to; - - let toIcon; - if (stop) { - toIcon = `icon-icon_${stop.vehicleMode.toLowerCase()}-stop-lollipop`; - } else if (rentalVehicle) { - toIcon = 'icon-icon_scooter-lollipop'; - } else if (vehicleParking) { - toIcon = 'icon-bike_parking'; - } else if (vehicleRentalStation) { - toIcon = 'icon-icon_citybike'; - } - - const handleFocusToLeg = (l, maximize) => () => { - focusToLeg(l, maximize); - }; - - return ( -
- {toIcon && } -
- {stop?.name}  - {stop?.code && } - {rentalVehicle?.rentalNetwork.networkId} - {vehicleParking?.name} - {vehicleRentalStation?.rentalNetwork.networkId}  - {vehicleRentalStation?.name} -
- -
- ); -} - -NaviDestination.propTypes = { - leg: legShape.isRequired, - focusToLeg: PropTypes.func.isRequired, -}; - -NaviDestination.contextTypes = { - intl: intlShape.isRequired, -}; - -export default NaviDestination; diff --git a/app/component/itinerary/NaviInstructions.js b/app/component/itinerary/NaviInstructions.js new file mode 100644 index 0000000000..a5becf30ce --- /dev/null +++ b/app/component/itinerary/NaviInstructions.js @@ -0,0 +1,92 @@ +import React, { useEffect, useState } from 'react'; +import { FormattedMessage, intlShape } from 'react-intl'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; +import { legShape, configShape } from '../../util/shapes'; +import { legDestination } from '../../util/legUtils'; +import RouteNumber from '../RouteNumber'; +import { displayDistance } from '../../util/geo-utils'; +import { durationToString } from '../../util/timeUtils'; + +export default function NaviInstructions( + { leg, nextLeg, instructions, legType }, + { intl, config }, +) { + const { distance, duration } = leg; + const [fadeOut, setFadeOut] = useState(false); + + useEffect(() => { + const timer = setTimeout(() => { + setFadeOut(true); + }, 10000); + return () => { + setFadeOut(false); + clearTimeout(timer); + }; + }, [leg]); + + if (legType === 'move') { + return ( + <> +
+ +   + {legDestination(intl, leg, null, nextLeg)} +
+ {distance && duration && ( +
+ {displayDistance(distance, config, intl.formatNumber)}   ( + {durationToString(duration * 1000)}) +
+ )} + + ); + } + + if (legType === 'wait') { + const { mode, headsign, route } = nextLeg; + + const color = route.color ? route.color : 'currentColor'; + const localizedMode = intl.formatMessage({ + id: `${mode.toLowerCase()}`, + defaultMessage: `${mode}`, + }); + return ( + <> +
+ +
+
+ +
{headsign}
+
+ + ); + } + return null; +} + +NaviInstructions.propTypes = { + leg: legShape.isRequired, + nextLeg: legShape.isRequired, + instructions: PropTypes.string.isRequired, + legType: PropTypes.string, +}; + +NaviInstructions.defaultProps = { + legType: 'move', +}; +NaviInstructions.contextTypes = { + intl: intlShape.isRequired, + config: configShape.isRequired, +}; diff --git a/app/component/itinerary/NaviLeg.js b/app/component/itinerary/NaviLeg.js deleted file mode 100644 index 7e6a114db5..0000000000 --- a/app/component/itinerary/NaviLeg.js +++ /dev/null @@ -1,44 +0,0 @@ -import PropTypes from 'prop-types'; -import React from 'react'; -import { FormattedMessage, intlShape } from 'react-intl'; -import { legShape } from '../../util/shapes'; -import Icon from '../Icon'; -import { legDestination } from '../../util/legUtils'; -import NaviDestination from './NaviDestination'; - -const iconMap = { - BICYCLE: 'icon-icon_cyclist', - CAR: 'icon-icon_car-withoutBox', - SCOOTER: 'icon-icon_scooter_rider', - WALK: 'icon-icon_walk', -}; - -/* eslint-disable jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */ -export default function NaviLeg({ leg, focusToLeg }, { intl }) { - const iconName = iconMap[leg.mode]; - const goTo = `navileg-${leg.mode.toLowerCase()}`; - - return ( -
-
- - -   - {legDestination(intl, leg)} -
-
-
- -
-
- ); -} - -NaviLeg.propTypes = { - leg: legShape.isRequired, - focusToLeg: PropTypes.func.isRequired, -}; - -NaviLeg.contextTypes = { - intl: intlShape.isRequired, -}; diff --git a/app/component/itinerary/NaviMessage.js b/app/component/itinerary/NaviMessage.js new file mode 100644 index 0000000000..9c39b9a51f --- /dev/null +++ b/app/component/itinerary/NaviMessage.js @@ -0,0 +1,82 @@ +import React, { useState } from 'react'; +import { intlShape } from 'react-intl'; +import cx from 'classnames'; +import PropTypes from 'prop-types'; +import { configShape } from '../../util/shapes'; + +import Icon from '../Icon'; + +function NaviMessage({ severity, children, index, handleRemove }, { config }) { + const [removingIndex, setRemovingIndex] = useState(null); + + const handleRemoveClick = () => { + setRemovingIndex(index); + setTimeout(() => { + handleRemove(index); + setRemovingIndex(null); + }, 500); + }; + let iconId; + let color; + switch (severity) { + case 'INFO': + iconId = 'icon-icon_info'; + color = '#0074BF'; + break; + case 'WARNING': + iconId = 'icon-icon_attention'; + color = '#FED100'; + break; + case 'ALERT': + iconId = 'icon-icon_caution_white_exclamation'; + color = '#DC0451'; + break; + default: + iconId = 'icon-icon_info'; + color = '#0074BF'; + } + return ( +
+ + {children} + +
+ ); +} + +NaviMessage.propTypes = { + severity: PropTypes.string.isRequired, + children: PropTypes.node.isRequired, + index: PropTypes.number.isRequired, + handleRemove: PropTypes.func.isRequired, +}; + +NaviMessage.contextTypes = { + intl: intlShape.isRequired, + config: configShape.isRequired, +}; + +export default NaviMessage; diff --git a/app/component/itinerary/NaviStack.js b/app/component/itinerary/NaviStack.js new file mode 100644 index 0000000000..eb08da4298 --- /dev/null +++ b/app/component/itinerary/NaviStack.js @@ -0,0 +1,38 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; +import NaviMessage from './NaviMessage'; + +const NaviStack = ({ messages, handleRemove, cardExpanded }) => { + return ( +
+ {messages.map((notification, index) => ( + + {notification.content} + + ))} +
+ ); +}; + +NaviStack.propTypes = { + messages: PropTypes.arrayOf( + PropTypes.shape({ + id: PropTypes.string.isRequired, + severity: PropTypes.string.isRequired, + }), + ).isRequired, + handleRemove: PropTypes.func.isRequired, + cardExpanded: PropTypes.bool, +}; + +NaviStack.defaultProps = { + cardExpanded: false, +}; + +export default NaviStack; diff --git a/app/component/itinerary/NaviUtils.js b/app/component/itinerary/NaviUtils.js new file mode 100644 index 0000000000..5e519517e5 --- /dev/null +++ b/app/component/itinerary/NaviUtils.js @@ -0,0 +1,252 @@ +import React from 'react'; +import { FormattedMessage } from 'react-intl'; +import { legTime } from '../../util/legUtils'; +import { timeStr } from '../../util/timeUtils'; +import { getFaresFromLegs } from '../../util/fareUtils'; +import { ExtendedRouteTypes } from '../../constants'; + +const TRANSFER_SLACK = 60000; + +function findTransferProblem(legs) { + for (let i = 1; i < legs.length - 1; i++) { + const prev = legs[i - 1]; + const leg = legs[i]; + const next = legs[i + 1]; + + if (prev.transitLeg && leg.transitLeg && !leg.interlineWithPreviousLeg) { + // transfer at a stop + if (legTime(leg.start) - legTime(prev.end) < TRANSFER_SLACK) { + return [prev, leg]; + } + } + + if (prev.transitLeg && next.transitLeg && !leg.transitLeg) { + // transfer with some walking + const t1 = legTime(prev.end); + const t2 = legTime(next.start); + const transferDuration = legTime(leg.end) - legTime(leg.start); + const slack = t2 - t1 - transferDuration; + if (slack < TRANSFER_SLACK) { + return [prev, next]; + } + } + } + return null; +} + +export const getAdditionalMessages = (leg, time, intl, config, messages) => { + const msgs = []; + const ticketDisplay = 120 * 1000; // 2 minutes + const ticketMsg = messages.get('ticket'); + if (!ticketMsg && legTime(leg.start) - time < ticketDisplay) { + // Todo: multiple fares? + const fare = getFaresFromLegs([leg], config)[0]; + msgs.push({ + severity: 'INFO', + content: ( +
+ + + {fare.ticketName} {fare.price} € + +
+ ), + id: 'ticket', + }); + } + return msgs; +}; + +export const getTransitLegState = (leg, intl, messages) => { + const { start, realtimeState, from, mode, legId } = leg; + const { scheduledTime, estimated } = start; + if (mode === 'WALK') { + return null; + } + const previousMessage = messages.get(legId); + const prevSeverity = previousMessage ? previousMessage.severity : null; + + const late = estimated?.delay > 0; + const localizedMode = intl.formatMessage({ + id: `${mode.toLowerCase()}`, + defaultMessage: `${mode}`, + }); + let content; + let severity; + const isRealTime = realtimeState === 'UPDATED'; + + if (late && prevSeverity !== 'ALERT') { + // todo: Do this when design is ready. + severity = 'ALERT'; + content =
Kulkuneuvo on myöhässä
; + } else if (!isRealTime && prevSeverity !== 'WARNING') { + severity = 'WARNING'; + content = ( +
+ + +
+ ); + } else if (isRealTime && prevSeverity !== 'INFO') { + const { parentStation, name } = from.stop; + const stopOrStation = parentStation + ? intl.formatMessage({ id: 'from-station' }) + : intl.formatMessage({ id: 'from-stop' }); + content = ( +
+ + +
+ ); + severity = 'INFO'; + } + const state = severity + ? { severity, content, id: legId, expiresOn: 'legChange' } + : null; + return state; +}; + +// We'll need the intl later. +// eslint-disable-next-line no-unused-vars +export const getItineraryAlerts = (realTimeLegs, intl, messages) => { + const alerts = []; + const canceled = realTimeLegs.filter(leg => leg.realtimeState === 'CANCELED'); + const transferProblem = findTransferProblem(realTimeLegs); + const late = realTimeLegs.filter(leg => leg.start.estimate?.delay > 0); + let content; + // TODO: Proper ID handling + if (canceled.length > 0 && !messages.get('canceled')) { + content =
Osa matkan lähdöistä on peruttu
; + // Todo: No current design + // todo find modes that are canceled + alerts.push({ + severity: 'ALERT', + content, + id: 'canceled', + }); + } + if (transferProblem !== null) { + const transferId = `transfer-${transferProblem[0].legId}-${transferProblem[1].legId}}`; + if (!messages.get(transferId)) { + // todo no current design + content = ( +
{`Vaihto ${transferProblem[0].route.shortName} - ${transferProblem[1].route.shortName} ei onnistu reittisuunnitelman mukaisesti`}
+ ); + + alerts.push({ + severity: 'ALERT', + content, + id: transferId, + }); + } + } + if (late.length && !messages.get('late')) { + // Todo: No current design + // Todo add mode and delay time to this message + content =
Kulkuneuvo on myöhässä
; + alerts.push({ + severity: 'ALERT', + content, + id: 'late', + }); + } + + return alerts; +}; + +/* + * Get the properties of the destination based on the leg. + * + */ +export const getDestinationProperties = (leg, stop, config) => { + const { rentalVehicle, vehicleParking, vehicleRentalStation } = leg.to; + const { vehicleMode, routes } = stop; + + let destination = {}; + let mode = vehicleMode; + + if (routes && vehicleMode === 'BUS' && config.useExtendedRouteTypes) { + if (routes.some(p => p.type === ExtendedRouteTypes.BusExpress)) { + mode = 'bus-express'; + } + } else if (routes && vehicleMode === 'TRAM' && config.useExtendedRouteTypes) { + if (routes.some(p => p.type === ExtendedRouteTypes.SpeedTram)) { + mode = 'speedtram'; + } + } + // todo: scooter and citybike icons etc. + if (rentalVehicle) { + destination.name = rentalVehicle.rentalNetwork.networkId; + } else if (vehicleParking) { + destination.name = vehicleParking.name; + } else if (vehicleRentalStation) { + destination.name = vehicleRentalStation.name; + } else { + let iconProps = {}; + switch (mode) { + case 'TRAM,BUS': + iconProps = { + iconId: 'icon-icon_bustram-stop-lollipop', + className: 'tram-stop', + }; + break; + case 'SUBWAY': + iconProps = { + iconId: 'icon-icon_subway', + className: 'subway-stop', + }; + break; + case 'RAIL': + iconProps = { + iconId: 'icon-icon_rail-stop-lollipop', + className: 'rail-stop', + }; + + break; + case 'FERRY': + iconProps = { + iconId: 'icon-icon_ferry', + className: 'ferry-stop', + }; + break; + case 'bus-express': + iconProps = { + iconId: 'icon-icon_bus-stop-express-lollipop', + className: 'bus-stop', + }; + break; + case 'speedtram': + iconProps = { + iconId: 'icon-icon_speedtram-stop-lollipop', + className: 'speedtram-stop', + }; + break; + default: + iconProps = { + iconId: `icon-icon_${mode.toLowerCase()}-stop-lollipop`, + }; + } + destination = { + ...iconProps, + name: stop.name, + }; + } + + return destination; +}; diff --git a/app/component/itinerary/Navigator.js b/app/component/itinerary/Navigator.js deleted file mode 100644 index 70a2a2f490..0000000000 --- a/app/component/itinerary/Navigator.js +++ /dev/null @@ -1,169 +0,0 @@ -import PropTypes from 'prop-types'; -import React, { useEffect, useState } from 'react'; -import { FormattedMessage, intlShape } from 'react-intl'; -import { createFragmentContainer, graphql } from 'react-relay'; -import { itineraryShape } from '../../util/shapes'; -import { legTime, legTimeStr } from '../../util/legUtils'; -import Icon from '../Icon'; -import NaviLeg from './NaviLeg'; - -/* - const legQuery = graphql` - query legQuery($id: String!) { - node(id: $id) { - ... on Leg { - start { - scheduledTime - estimated { - time - } - } - end { - scheduledTime - estimated { - time - } - } - } - } - } -`; -*/ - -function Navigator({ itinerary, focusToLeg, setNavigation }, context) { - const [time, setTime] = useState(Date.now()); - const [currentLeg, setCurrentLeg] = useState(null); - - // update view after every 5 seconds - useEffect(() => { - const interval = setInterval(() => { - setTime(Date.now()); - }, 5000); - - return () => clearInterval(interval); - }, []); - - useEffect(() => { - const newLeg = itinerary.legs.find(leg => { - return legTime(leg.start) <= time && time <= legTime(leg.end); - }); - - if (newLeg && newLeg !== currentLeg) { - setCurrentLeg(newLeg); - focusToLeg(newLeg, false); - } - }, [time]); - - const first = itinerary.legs[0]; - let info; - if (time < legTime(first.start)) { - info = ( - - ); - } else if (currentLeg) { - if (!currentLeg.transitLeg) { - info = ; - } else { - info = `Tracking ${currentLeg?.mode} leg`; - } - } - return ( -
-
- - -
-
-
{info}
-
- ); -} - -Navigator.propTypes = { - itinerary: itineraryShape.isRequired, - focusToLeg: PropTypes.func.isRequired, - setNavigation: PropTypes.func.isRequired, - /* - focusToPoint: PropTypes.func.isRequired, - relayEnvironment: relayShape.isRequired, - */ -}; - -Navigator.contextTypes = { - intl: intlShape.isRequired, -}; - -const withRelay = createFragmentContainer(Navigator, { - itinerary: graphql` - fragment Navigator_itinerary on Itinerary { - start - end - legs { - mode - transitLeg - start { - scheduledTime - estimated { - time - } - } - end { - scheduledTime - estimated { - time - } - } - legGeometry { - points - } - from { - lat - lon - } - to { - lat - lon - stop { - name - code - platformCode - vehicleMode - } - vehicleParking { - name - } - vehicleRentalStation { - name - rentalNetwork { - networkId - } - availableVehicles { - total - } - } - rentalVehicle { - rentalNetwork { - networkId - url - } - } - } - } - } - `, -}); - -export { Navigator as Component, withRelay as default }; diff --git a/app/component/itinerary/NavigatorIntro/NavigatorIntro.js b/app/component/itinerary/NavigatorIntro/NavigatorIntro.js new file mode 100644 index 0000000000..2b41622b22 --- /dev/null +++ b/app/component/itinerary/NavigatorIntro/NavigatorIntro.js @@ -0,0 +1,94 @@ +import Button from '@hsl-fi/button'; +import { connectToStores } from 'fluxible-addons-react'; +import PropTypes from 'prop-types'; +import React from 'react'; +import { FormattedMessage, intlShape } from 'react-intl'; +import { configShape } from '../../../util/shapes'; +import Icon from '../../Icon'; +import NavigatorIntroFeature from './NavigatorIntroFeature'; + +const NavigatorIntro = ( + { logo, onPrimaryClick, onClose, isLoggedIn }, + context, +) => { + const { config, intl } = context; + + const primaryColor = + config.colors?.accessiblePrimary || config.colors?.primary || 'black'; + + return ( +
+
+ {logo && navigator logo} + +
+ + +
+ {config.allowLogin && !isLoggedIn && ( +
+ + +
+ )} +
+
+
+
+ ); +}; + +NavigatorIntro.propTypes = { + logo: PropTypes.string, + onClose: PropTypes.func.isRequired, + onPrimaryClick: PropTypes.func, + isLoggedIn: PropTypes.bool, +}; + +NavigatorIntro.defaultProps = { + logo: undefined, + onPrimaryClick: undefined, + isLoggedIn: false, +}; + +NavigatorIntro.contextTypes = { + intl: intlShape.isRequired, + config: configShape.isRequired, +}; + +export default connectToStores( + NavigatorIntro, + ['UserStore'], + ({ config, getStore }) => ({ + isLoggedIn: + config?.allowLogin && getStore('UserStore')?.getUser()?.sub !== undefined, + }), +); diff --git a/app/component/itinerary/NavigatorIntro/NavigatorIntroFeature.js b/app/component/itinerary/NavigatorIntro/NavigatorIntroFeature.js new file mode 100644 index 0000000000..aa2c19569a --- /dev/null +++ b/app/component/itinerary/NavigatorIntro/NavigatorIntroFeature.js @@ -0,0 +1,47 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import { FormattedMessage } from 'react-intl'; +import Icon from '../../Icon'; + +const NavigatorIntroFeature = ({ + icon, + iconColor, + iconBackgroundColor, + header, + body, +}) => { + return ( +
+ {icon && ( + + )} +
+ + +
+
+ ); +}; + +NavigatorIntroFeature.propTypes = { + header: PropTypes.string.isRequired, + body: PropTypes.string.isRequired, + icon: PropTypes.string, + iconColor: PropTypes.string, + iconBackgroundColor: PropTypes.string, +}; + +NavigatorIntroFeature.defaultProps = { + icon: undefined, + iconColor: 'black', + iconBackgroundColor: 'transparent', +}; + +export default NavigatorIntroFeature; diff --git a/app/component/itinerary/NavigatorIntro/NavigatorIntroModal.js b/app/component/itinerary/NavigatorIntro/NavigatorIntroModal.js new file mode 100644 index 0000000000..ac12826698 --- /dev/null +++ b/app/component/itinerary/NavigatorIntro/NavigatorIntroModal.js @@ -0,0 +1,62 @@ +import Modal from '@hsl-fi/modal'; +import PropTypes from 'prop-types'; +import React, { useEffect, useState } from 'react'; +import { intlShape } from 'react-intl'; +import { configShape } from '../../../util/shapes'; +import NavigatorIntro from './NavigatorIntro'; + +const NavigatorIntroModal = ({ onPrimaryClick, onClose }, context) => { + const { config } = context; + const [logo, setLogo] = useState(); + + useEffect(() => { + if (!config.navigationLogo) { + return; + } + + const loadLogo = async () => { + try { + const importedLogo = await import( + /* webpackChunkName: "main" */ `../../../configurations/images/${config.navigationLogo}` + ); + setLogo(importedLogo.default); + } catch (error) { + // eslint-disable-next-line no-console + console.error('Error loading logo:', error); + } + }; + + loadLogo(); + }, []); + + return ( + + + + ); +}; + +NavigatorIntroModal.propTypes = { + onClose: PropTypes.func.isRequired, + onPrimaryClick: PropTypes.func, +}; + +NavigatorIntroModal.defaultProps = { + onPrimaryClick: undefined, +}; + +NavigatorIntroModal.contextTypes = { + intl: intlShape.isRequired, + config: configShape.isRequired, +}; + +export default NavigatorIntroModal; diff --git a/app/component/itinerary/NavigatorIntro/navigator-intro.scss b/app/component/itinerary/NavigatorIntro/navigator-intro.scss new file mode 100644 index 0000000000..2e41f20656 --- /dev/null +++ b/app/component/itinerary/NavigatorIntro/navigator-intro.scss @@ -0,0 +1,84 @@ +.navigator-intro-modal-overlay { + position: fixed; + height: 100%; + width: 100%; + top: 0; + left: 0; + background-color: rgba(0, 0, 0, 0.2); + z-index: 1000; // higher than navbar + display: flex; + flex-direction: row; + align-items: flex-end; +} + +.navigator-intro-modal { + position: fixed; + background: white; + width: 100%; + border-radius: 30px 30px 0 0; + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.2); +} + +.navigator-intro-modal-content { + display: flex; + flex-direction: column; + padding: 0 var(--space-s); + + .body { + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-items: stretch; + padding: var(--space-xl) 0 var(--space-s) 0; + gap: var(--space-m); + + h2 { + align-self: center; + } + + p { + margin: unset; + } + + .login-tip { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + justify-content: center; + gap: var(--space-xs); + padding: var(--space-xxs) var(--space-l); + } + + .navigation-intro-body { + display: flex; + flex-wrap: wrap; + flex-direction: column; + align-content: center; + align-items: stretch; + gap: var(--space-m); + padding: 0 var(--space-m); + + .content-box { + display: flex; + flex-direction: row; + align-items: center; + gap: var(--space-s); + + .right-column { + display: flex; + flex-direction: column; + align-items: start; + gap: var(--space-xxs); + } + } + } + } + + .buttons { + display: flex; + flex-direction: column; + width: 100%; + gap: var(--space-xs); + padding: var(--space-s) var(--space-s) var(--space-m) var(--space-s); + } +} diff --git a/app/component/itinerary/PlanConnection.js b/app/component/itinerary/PlanConnection.js index 191711fe9a..fe8cc6080d 100644 --- a/app/component/itinerary/PlanConnection.js +++ b/app/component/itinerary/PlanConnection.js @@ -59,7 +59,6 @@ const planConnection = graphql` ...ItineraryListContainer_planEdges node { ...ItineraryDetails_itinerary - ...Navigator_itinerary duration walkDistance emissionsPerPerson { @@ -70,10 +69,29 @@ const planConnection = graphql` mode distance transitLeg + legId: id + interlineWithPreviousLeg + duration + headsign + realtimeState + start { + scheduledTime + estimated { + time + } + } + end { + scheduledTime + estimated { + time + } + } legGeometry { points } route { + shortName + color gtfsId } trip { @@ -88,9 +106,22 @@ const planConnection = graphql` lon stop { gtfsId + name + lat + lon + parentStation { + name + } } vehicleRentalStation { stationId + name + rentalNetwork { + networkId + } + availableVehicles { + total + } } rentalVehicle { vehicleId @@ -99,11 +130,53 @@ const planConnection = graphql` to { lat lon + name stop { gtfsId + name + code + platformCode + vehicleMode + zoneId + parentStation { + name + } + routes { + type + } + } + vehicleParking { + name + } + vehicleRentalStation { + name + rentalNetwork { + networkId + } + availableVehicles { + total + } + } + rentalVehicle { + rentalNetwork { + networkId + url + } + } + } + fareProducts { + product { + name + id + ... on DefaultFareProduct { + price { + amount + } + } } } } + start end } } diff --git a/app/component/itinerary/ScooterLinkContainer.js b/app/component/itinerary/ScooterLinkContainer.js index d2e39a69c6..1cf967c8cb 100644 --- a/app/component/itinerary/ScooterLinkContainer.js +++ b/app/component/itinerary/ScooterLinkContainer.js @@ -40,7 +40,13 @@ function ScooterLinkContainer(
-
+
diff --git a/app/component/itinerary/StartNavi.js b/app/component/itinerary/StartNavi.js index b3c7fcdcac..f29a104a1c 100644 --- a/app/component/itinerary/StartNavi.js +++ b/app/component/itinerary/StartNavi.js @@ -1,38 +1,42 @@ -import React from 'react'; import PropTypes from 'prop-types'; -import { FormattedMessage } from 'react-intl'; +import React from 'react'; +import { FormattedMessage, intlShape } from 'react-intl'; +import { configShape } from '../../util/shapes'; import Icon from '../Icon'; -/* eslint-disable jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */ -export default function StartNavi({ setNavigation }) { +const StartNavi = ({ setNavigation }, context) => { + const { config, intl } = context; + + const color = + config.colors?.accessiblePrimary || config.colors?.primary || 'black'; + return (
-
+
-
); -} +}; StartNavi.propTypes = { setNavigation: PropTypes.func.isRequired, }; + +StartNavi.contextTypes = { + config: configShape.isRequired, + intl: intlShape.isRequired, +}; + +export default StartNavi; diff --git a/app/component/itinerary/TransitLeg.js b/app/component/itinerary/TransitLeg.js index 2cfa59d98b..3a83cd6134 100644 --- a/app/component/itinerary/TransitLeg.js +++ b/app/component/itinerary/TransitLeg.js @@ -505,7 +505,6 @@ class TransitLeg extends React.Component {
-
+
{ + const [isPositioningAllowed, setPositioningAllowed] = useState(false); + const [realTimeLegs, setRealTimeLegs] = useState(initialLegs); + const [time, setTime] = useState(Date.now()); + + const enableMapTracking = useCallback(async () => { + const permission = await checkPositioningPermission(); + const isPermissionGranted = permission.state === 'granted'; + if (isPermissionGranted) { + mapRef?.enableMapTracking(); + } + setPositioningAllowed(isPermissionGranted); + }, [mapRef]); + + const queryAndMapRealtimeLegs = useCallback( + async legs => { + if (!legs.length) { + return {}; + } + + const legQueries = legs + .filter(leg => leg.transitLeg) + .map(leg => + fetchQuery( + relayEnvironment, + legQuery, + { id: leg.legId }, + { force: true }, + ).toPromise(), + ); + const responses = await Promise.all(legQueries); + return responses.reduce( + (map, response) => ({ ...map, [response.leg.legId]: response.leg }), + {}, + ); + }, + [relayEnvironment], + ); + + const fetchAndSetRealtimeLegs = useCallback(async () => { + const rtLegMap = await queryAndMapRealtimeLegs(initialLegs).catch(err => + // eslint-disable-next-line no-console + console.error('Failed to query and map real time legs', err), + ); + + const rtLegs = initialLegs.map(l => { + const rtLeg = l.legId ? rtLegMap[l.legId] : null; + if (rtLeg) { + return { + ...l, + ...rtLeg, + to: { + ...l.to, + vehicleRentalStation: rtLeg.to.vehicleRentalStation, + }, + }; + } + return { ...l }; + }); + setRealTimeLegs(rtLegs); + }, [initialLegs, queryAndMapRealtimeLegs]); + + useEffect(() => { + enableMapTracking(); + fetchAndSetRealtimeLegs(); + const interval = setInterval(() => { + fetchAndSetRealtimeLegs(); + setTime(Date.now()); + }, 10000); + + return () => clearInterval(interval); + }, [enableMapTracking, fetchAndSetRealtimeLegs]); + + return { realTimeLegs, time, isPositioningAllowed }; +}; + +export { useRealtimeLegs }; diff --git a/app/component/itinerary/itinerary-summary.scss b/app/component/itinerary/itinerary-summary.scss index cf9ed0ec6a..9cdeba0418 100644 --- a/app/component/itinerary/itinerary-summary.scss +++ b/app/component/itinerary/itinerary-summary.scss @@ -465,6 +465,13 @@ } } + .ferry-external .itinerary-icon_with-bicycle { + color: black; + height: 20px; + width: 20px; + padding-bottom: 4px; + } + .itinerary-icon_with-bicycle { color: white; height: 20px; @@ -492,6 +499,10 @@ font-size: 15px; padding: 1px 0 0 0; } + + .vehicle-number.ferry-external { + color: $black; + } } .leg-duration-container { diff --git a/app/component/itinerary/itinerary.scss b/app/component/itinerary/itinerary.scss index 848b819162..5952020926 100644 --- a/app/component/itinerary/itinerary.scss +++ b/app/component/itinerary/itinerary.scss @@ -44,6 +44,10 @@ $itinerary-tab-switch-height: 48px; @include getCircleSvg($ferry-color, $fill); } + &.ferry-external { + @include getCircleSvg($external-feed-color, $fill); + } + &.citybike { @include getCircleSvg($citybike-color, $fill); } @@ -100,9 +104,10 @@ $itinerary-tab-switch-height: 48px; top: 5px; .disclaimer-container { - background-color: rgba(254, 209, 0, 0.1); - border: 1px solid #fed100; - border-radius: 3px; + background-color: $disclaimer-background-color; + font-weight: $font-weight-disclaimer; + border: 1px solid $disclaimer-border-color; + border-radius: $border-radius-disclaimer; display: flex; font-size: $font-size-xsmall; padding: $padding-medium; @@ -661,34 +666,6 @@ $itinerary-tab-switch-height: 48px; margin: 0 10px; border-bottom: 1px solid #ddd; - .ticket-type-agency-link { - flex: 0; - - .external-link-container { - width: 120px; - text-align: center; - border-radius: 25px; - border: 1px solid #888; - min-height: 28px; - - .external-link { - font-weight: $font-weight-medium; - color: $primary-color; - font-size: $font-size-small; - padding-top: 3px; - } - - &:hover { - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); - cursor: pointer; - } - } - - @media print { - display: none; - } - } - .itinerary-ticket-type, .itinerary-co2-line { display: flex; @@ -710,10 +687,6 @@ $itinerary-tab-switch-height: 48px; } } - .ticket-type-agency-link { - align-self: center; - } - .ticket-type-zone { @include font-book; @@ -776,10 +749,6 @@ $itinerary-tab-switch-height: 48px; margin: 0; } } - - .ticket-type-agency-link { - flex-grow: 0; - } } } } @@ -804,6 +773,10 @@ $itinerary-tab-switch-height: 48px; letter-spacing: -0.03em; line-height: 22px; text-align: center; + + &.purchase { + color: #ffff; + } } .desktop { @@ -855,6 +828,10 @@ $itinerary-tab-switch-height: 48px; @include setModeCircles($ferry-color); } + .ferry-external { + @include setModeCircles($external-feed-color); + } + &.funicular { @include setModeCircles($funicular-color); } @@ -1767,6 +1744,11 @@ $itinerary-tab-switch-height: 48px; } } + .scooter-icon .icon-container .icon { + background-color: $scooter-color; + border-radius: 3px; + } + .citybike-info { position: absolute; bottom: 74px; @@ -1844,6 +1826,10 @@ $itinerary-tab-switch-height: 48px; width: auto; padding: 4px 4px 0 0; } + + .vehicle-number.ferry-external { + color: $black; + } } .icon { diff --git a/app/component/itinerary/mobile-ticket-purchase-information.scss b/app/component/itinerary/mobile-ticket-purchase-information.scss index 737f9ca687..caa8139824 100644 --- a/app/component/itinerary/mobile-ticket-purchase-information.scss +++ b/app/component/itinerary/mobile-ticket-purchase-information.scss @@ -1,135 +1,58 @@ -@charset "UTF-8"; - .itinerary-ticket-information-purchase { display: flex; - color: $gray; + flex-direction: row; + align-items: center; + color: #fff; + background-color: $primary-color; font-weight: $font-weight-book; font-size: $font-size-small; margin: 0 10px; + border-radius: 10px; + line-height: 1.1; - .ticket-type-agency-link { - flex: 0; - - .external-link-container { - width: 120px; - text-align: center; - border-radius: 23px; - border: 1px solid #888; - min-height: 26px; - - .external-link { - font-weight: $font-weight-medium; - color: $primary-color; - padding-top: 3px; - font-size: 13px; - } - - &:hover { - box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); - cursor: pointer; - } - } - - @media print { - display: none; - } - } - - .itinerary-pinfo-ticket-type { - .ticket-type-title { - color: #fff; - } - - .app-link { - .external-link-container { - border: 0; - line-height: 25px; - - a.external-link { - font-size: 16px; - color: $primary-color; - } - } - - margin-right: 16px; - display: flex; - justify-content: space-evenly; - align-items: center; - padding: 3px 10px 5px 10px; - width: 140px; - height: 40px; - right: 15px; - top: 25px; - background: #fff; - font-weight: $font-weight-medium; - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); - border-radius: 20px; - } - - border-radius: 10px; - display: flex; - flex-direction: row; - align-items: center; - flex-grow: 1; - flex-shrink: 1; - white-space: normal; - line-height: 1.1; - background-color: $primary-color; - justify-content: space-between; - - .ticket-container { - display: grid; - align-items: center; - justify-content: space-between; - margin: 11px 6px 9px 15px; + .ticket-container { + margin: 11px 6px 9px 15px; + max-width: 50%; - @include min-width(tablet) { - margin-right: 15px; - } + @include min-width(tablet) { + margin-right: 15px; } .ticket-type-zone { - @include font-book; + @include font-medium; align-items: center; - color: $gray; - display: flex; - justify-content: space-between; - - .fare-container { - display: flex; - align-items: center; - font-size: 1.125rem; - } - - a { - display: flex; - align-items: center; - text-decoration: none; - font-size: $font-size-normal; - } + font-size: 1.125rem; .ticket-description { - display: flex; - color: #fff; white-space: nowrap; + font-weight: $font-weight-book; } + } + } - .ticket-identifier { - @include font-medium; + .app-link { + .external-link-container { + border: 0; + line-height: 25px; + padding: 0 10px; - color: $black; - padding-right: 6px; + a.external-link { + font-size: 16px; + color: $primary-color; } } - } -} -.zone-ticket { - &.purchase { - color: #ffff; - letter-spacing: -0.03em; - line-height: 22px; - text-align: center; + position: absolute; + right: 24px; + display: flex; + justify-content: space-evenly; + align-items: center; + min-width: 140px; + height: 40px; + background: #fff; + font-weight: $font-weight-medium; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15); + border-radius: 20px; } } diff --git a/app/component/itinerary/navigator.scss b/app/component/itinerary/navigator.scss index e542973727..f2defb6ce5 100644 --- a/app/component/itinerary/navigator.scss +++ b/app/component/itinerary/navigator.scss @@ -1,117 +1,432 @@ .navi-start-container { + padding: 0 10px; + + button { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + background-color: $infobox-color-generic-blue; + margin: 4px 0 0 0; + padding: var(--space-m); + gap: var(--space-s); + font-weight: normal; + border-radius: $border-radius-bigger; + + .content { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; + gap: var(--space-s); + } + + span.icon-container { + display: flex; + align-items: center; + justify-content: center; + + :last-of-type { + margin-left: auto; + } + } + + span.icon-container:last-of-type { + margin-left: auto; + } + } +} + +.navitop { + margin-bottom: 5px; + position: fixed; + top: 80px; + width: 92%; + margin-left: 4%; + border-radius: 15px; + min-height: 70px; + color: black; + background-color: white !important; display: flex; align-items: center; - justify-content: space-between; - height: 56px; - flex-direction: row; - background-color: #e5f2fa; - color: $black; - margin-right: 10px; - margin-left: 10px; - margin-top: 16px; - border-radius: 10px; + + &.expanded { + max-height: 150px; + } + + .navitop-arrow { + margin-right: var(--space-m); + + .inverted { + transform: rotate(180deg); + } + + position: absolute; + right: 20px; + } + + .notifier { + margin: 15px 20px 0 20px; + width: 100%; + color: red; + } + + .content { + width: 100%; + + .navi-top-card { + .main-card { + display: flex; + flex-direction: row; + color: black; + margin: var(--space-s) var(--space-m) 0; + + .mode { + width: var(--space-l); + height: var(--space-l); + color: black; + margin-right: var(--space-s); + margin-top: var(--space-xxs); + } + } + + .instructions { + display: flex; + flex-direction: column; + width: 100%; + font-size: $font-size-normal; + font-weight: $font-weight-medium; + + .destination-header { + font-size: $font-size-normal; + font-weight: $font-weight-medium; + display: flex; + } + + .wait-leg { + display: flex; + align-items: center; + margin-top: 3px; + + .headsign { + margin-left: 10px; + font-size: $font-size-small; + font-weight: $font-weight-book; + max-width: 120px; + } + + .icon { + margin-top: 2px; + height: 25px; + width: 25px; + } + + .route-number { + min-width: 55px; + + .vcenter-children { + .vehicle-number { + color: white; + font-size: $font-size-large; + margin-top: 4px; + } + + display: flex; + } + } + } + } + + .duration { + &.fade-out { + animation: fadeOut 3s forwards; + } + + font-size: $font-size-xsmall; + font-weight: $font-weight-book; + display: flex; + } + } + + .secondary-info { + flex-direction: column; + max-height: 250px; + padding-top: var(--space-xxs); + + .secondary-divider { + border: 1px solid #ddd; + width: 75%; + margin-left: 50px; + } + + .secondary-content { + display: flex; + margin-left: var(--space-xxl); + margin-bottom: var(--space-s); + margin-top: var(--space-xs); + } + + .icon-expand { + margin-top: 5px; + width: var(--space-m); + height: var(--space-m); + } + + .destination-icon { + margin: 0 10px; + + &.place { + fill: $to-color; + } + + &.bus-stop { + color: $bus-color; + } + + &.tram-stop { + color: $tram-color; + } + + &.subway-stop { + color: $metro-color; + } + + &.rail-stop { + color: $rail-color; + } + + &.ferry-stop { + color: $ferry-color; + } + + &.funicular-stop { + color: $funicular-color; + } + + &.speedtram-stop { + color: $speedtram-color; + } + } + + .destination { + font-weight: $font-weight-book; + text-align: left; + + .details { + > * { + margin-right: var(--space-xs); + } + + .address { + color: #888; + } + + .platform-short { + width: unset; + } + + .zone-icon-container { + margin-top: 2px; + } + + display: flex; + flex-direction: row; + } + } + } + } } -.navi-start-leftgroup { - display: flex; - flex-direction: row; - margin-top: 5px; - margin-left: 10px; - font-size: $font-size-xsmall; - font-weight: $font-weight-book; +@keyframes slideIn { + from { + transform: translateY(-100%); + opacity: 0; + } + + to { + transform: translateY(0); + opacity: 1; + } } -.navi-start-icon { - margin-right: 12px; - margin-left: 5px; +@keyframes slideOut { + from { + transform: translateY(0); + opacity: 1; + } + + to { + transform: translateY(-100%); + opacity: 0; + } } -.navi-start-button { - margin-right: 16px; - background-color: $primary-color; - color: $white; +@keyframes slideOutRight { + from { + transform: translateX(0); + opacity: 1; + } - &:hover { - background-color: $standalone-btn-hover-color; - color: $white; + to { + transform: translateX(-100%); + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; } - font-size: $font-size-normal; - border-radius: 20px; - width: 140px; - height: 40px; - text-align: center; + to { + opacity: 0; + } } -.navigator { - .navigator-top-section { - font-size: $font-size-xsmall; - text-align: center; - margin-top: 10px; +.info-stack { + position: fixed; + height: 69px; + margin-left: 5%; + width: 90%; + top: 150px; + + &.expanded { + top: 180px; + } + + &.slide-out { + animation: slideOut 0.5s ease-out forwards; + pointer-events: none; + } + + &.slide-in { + animation: slideIn 0.5s ease-out forwards; + } + + .info-stack-item { + position: relative; + border-radius: 15px; + display: flex; + align-items: center; + height: 100%; + margin-top: 5px; + + &.info { + background-color: #e5f2fa; + } + + &.warning { + background-color: #fff8e8; + } + + &.alert { + background-color: #fdf3f6; + } - .close-navigator { + &.slide-out-right { + animation: slideOutRight 0.5s ease-out forwards; + pointer-events: none; + } + + .info-close { position: absolute; - right: 0; - padding-right: 20px; - color: $secondary-color; + top: 7px; + right: 9px; + } + + .info-icon { + margin-top: 10px; + margin-left: 20px; + } + + &.slide-in { + animation: slideIn 0.5s ease-out forwards; + } + + .navi-info { + display: flex; + flex-direction: column; + margin-left: 25px; + + span:first-child { + font-weight: $font-weight-medium; + font-size: $font-size-normal; + } + + span:last-child { + font-size: $font-size-xsmall; + } + } + + .navi-info-content { + display: flex; + flex-direction: column; + margin-left: 15px; + + span:first-child { + font-weight: $font-weight-medium; + font-size: $font-size-normal; + } + + span:last-child { + font-size: $font-size-xsmall; + font-weight: $font-weight-book; + } } } +} +.navibottomsheet { .divider { width: 100%; height: 1px; border-top: 1px solid #ddd; - margin-bottom: 10px; margin-top: 10px; } - .info { - margin: 15px 20px 0 20px; - width: 100%; - - .navileg-goto { - display: flex; - flex-direction: row; - align-items: center; + .navi-bottom-controls { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + font-size: $font-size-normal; + text-align: center; + margin: 20px 24px 10px 24px; - .navileg-mode { - width: 32px; - height: 32px; - margin-right: 12px; - } + .navi-close-button { + border-style: solid; + border-width: 1px; + border-radius: 20px; + width: 100px; + height: 40px; + text-align: center; + background-color: white; + border-color: red; + color: red; } - .navileg-destination { + .navi-time { display: flex; - flex-direction: row; - align-items: center; - margin-top: 10px; - font-size: $font-size-xsmall; - font-weight: $font-weight-book; - - .navi-left-bar { - margin-left: 10px; - margin-right: 10px; - width: 8px; - height: 80px; - border-radius: 4px; - background-color: #e5f2fa; - } + flex-direction: column; - .navileg-destination-details { - display: flex; - flex-direction: column; + .navi-daytime { + font-size: $font-size-xsmall; + font-weight: $font-weight-book; + } + } - .navi-destination-icon { - width: 24px; - height: 24px; - } + .navi-ticket-button { + border-radius: 20px; + width: 100px; + height: 40px; + text-align: center; + margin-left: 16px; + background-color: $primary-color; + color: white; - .navileg-focus { - font-weight: $font-weight-medium; - color: $primary-color; - margin-top: 8px; - } + a { + color: white; + text-decoration: none; } } } diff --git a/app/component/itinerary/queries/LegQuery.js b/app/component/itinerary/queries/LegQuery.js new file mode 100644 index 0000000000..94dbc7f4d5 --- /dev/null +++ b/app/component/itinerary/queries/LegQuery.js @@ -0,0 +1,32 @@ +import { graphql } from 'react-relay'; + +const legQuery = graphql` + query LegQuery($id: String!) { + leg(id: $id) { + legId: id + start { + scheduledTime + estimated { + time + } + } + end { + scheduledTime + estimated { + time + } + } + + to { + vehicleRentalStation { + availableVehicles { + total + } + } + } + realtimeState + } + } +`; + +export { legQuery }; diff --git a/app/component/map/ItineraryLine.js b/app/component/map/ItineraryLine.js index 1d10b7046e..187ad0c624 100644 --- a/app/component/map/ItineraryLine.js +++ b/app/component/map/ItineraryLine.js @@ -69,7 +69,14 @@ class ItineraryLine extends React.Component { } const nextLeg = this.props.legs[i + 1]; - let mode = getRouteMode({ mode: leg.mode, type: leg.route?.type }); + let mode = getRouteMode( + { + mode: leg.mode, + type: leg.route?.type, + gtfsId: leg.route?.gtfsId, + }, + this.context.config, + ); const [interliningLines, interliningLegs] = getInterliningLegs( this.props.legs, @@ -260,6 +267,7 @@ export default createFragmentContainer(ItineraryLine, { transitLeg interlineWithPreviousLeg route { + gtfsId shortName color type diff --git a/app/component/map/Line.js b/app/component/map/Line.js index 32bee4a443..8711808464 100644 --- a/app/component/map/Line.js +++ b/app/component/map/Line.js @@ -99,6 +99,10 @@ export default class Line extends React.Component { if (this.props.mode === 'walk') { legWeight *= 0.8; } + if (this.props.mode === 'ferry-external') { + haloWeight *= 0.6; + legWeight *= 0.6; + } if (this.props.passive) { haloWeight *= 0.5; legWeight *= 0.5; diff --git a/app/component/map/Map.js b/app/component/map/Map.js index 87cf694866..f11de88043 100644 --- a/app/component/map/Map.js +++ b/app/component/map/Map.js @@ -21,8 +21,6 @@ import { import PositionMarker from './PositionMarker'; import VectorTileLayerContainer from './tile-layer/VectorTileLayerContainer'; import { boundWithMinimumArea } from '../../util/geo-utils'; -import { isDebugTiles } from '../../util/browser'; -import { BreakpointConsumer } from '../../util/withBreakpoint'; import events from '../../util/events'; import { getLayerBaseUrl } from '../../util/mapLayerUtils'; import GeoJSON from './GeoJSON'; @@ -30,7 +28,7 @@ import { mapLayerShape } from '../../store/MapLayerStore'; const zoomOutText = ``; const zoomInText = ``; - +const EXTRA_PADDING = 100; /* foo-eslint-disable react/sort-comp */ const startClient = context => { @@ -64,9 +62,6 @@ export default class Map extends React.Component { lon: PropTypes.number, zoom: PropTypes.number, bounds: PropTypes.arrayOf(PropTypes.arrayOf(PropTypes.number)), - boundsOptions: PropTypes.shape({ - paddingBottomRight: PropTypes.arrayOf(PropTypes.number), - }), hilightedStops: PropTypes.arrayOf(PropTypes.string), stopsToShow: PropTypes.arrayOf(PropTypes.string), objectsToHide: PropTypes.objectOf(PropTypes.arrayOf(PropTypes.string)), @@ -75,29 +70,29 @@ export default class Map extends React.Component { leafletEvents: PropTypes.object, leafletObjs: PropTypes.arrayOf(PropTypes.node), mergeStops: PropTypes.bool, + leafletMapRef: PropTypes.func, mapRef: PropTypes.func, locationPopup: PropTypes.string, onSelectLocation: PropTypes.func, - mapBottomPadding: PropTypes.number, - buttonBottomPadding: PropTypes.number, + bottomPadding: PropTypes.number, bottomButtons: PropTypes.node, topButtons: PropTypes.node, // eslint-disable-next-line geoJson: PropTypes.object, mapLayers: mapLayerShape, + breakpoint: PropTypes.string, }; static defaultProps = { animate: true, mapRef: null, + leafletMapRef: null, lat: undefined, lon: undefined, zoom: undefined, bounds: undefined, locationPopup: 'reversegeocoding', - boundsOptions: {}, - mapBottomPadding: 0, - buttonBottomPadding: 0, + bottomPadding: undefined, bottomButtons: null, topButtons: null, mergeStops: true, @@ -109,6 +104,7 @@ export default class Map extends React.Component { leafletEvents: undefined, leafletObjs: undefined, objectsToHide: { vehicleRentalStations: [] }, + breakpoint: undefined, }; static contextTypes = { @@ -121,6 +117,20 @@ export default class Map extends React.Component { constructor(props) { super(props); this.state = { zoom: 14 }; + if (props.mapRef) { + props.mapRef(this); + } + if (this.props.breakpoint === 'large') { + this.boundsOptions = { + paddingTopLeft: [0, EXTRA_PADDING], + paddingBottomRight: [0, (window.innerHeight - 64) / 2], + }; + } else { + this.boundsOptions = { + paddingTopLeft: [0, 0], + paddingBottomRight: [0, 0], + }; + } } updateZoom = () => { @@ -136,6 +146,9 @@ export default class Map extends React.Component { startClient(this.context); } this.updateZoom(); + if (this.props.mapRef) { + this.props.mapRef(this); + } } // eslint-disable-next-line camelcase @@ -156,11 +169,13 @@ export default class Map extends React.Component { componentDidUpdate() { // move leaflet attribution control elements according to given padding // leaflet api doesn't allow controlling element position so have to use this hack - const bottomControls = document.getElementsByClassName('leaflet-bottom'); - Array.prototype.forEach.call(bottomControls, elem => { - // eslint-disable-next-line no-param-reassign - elem.style.transform = `translate(0, -${this.props.buttonBottomPadding}px)`; - }); + if (this.props.bottomPadding !== undefined) { + const bottomControls = document.getElementsByClassName('leaflet-bottom'); + Array.prototype.forEach.call(bottomControls, elem => { + // eslint-disable-next-line no-param-reassign + elem.style.transform = `translate(0, -${this.props.bottomPadding}px)`; + }); + } } componentWillUnmount() { @@ -175,26 +190,43 @@ export default class Map extends React.Component { this.updateZoom(); }; + // eslint-disable-next-line react/no-unused-class-component-methods + setBottomPadding = padding => { + this.boundsOptions.paddingBottomRight = [ + 0, + Math.max( + Math.min(padding, window.innerHeight - 2 * EXTRA_PADDING), + EXTRA_PADDING, + ), + ]; + }; + render() { const { zoom, lat, lon, - boundsOptions, locationPopup, onSelectLocation, leafletObjs, geoJson, mapLayers, + bottomPadding, } = this.props; const { config } = this.context; const naviProps = {}; // these define map center and zoom + if (bottomPadding !== undefined) { + this.boundsOptions.paddingBottomRight = [ + 0, + Math.min(bottomPadding + EXTRA_PADDING, window.innerHeight - 60), + ]; + } if (this.props.bounds) { // bounds overrule center & zoom naviProps.bounds = boundWithMinimumArea(this.props.bounds); // validate } else if (lat && lon) { - if (this.props.mapBottomPadding && this.props.mapBottomPadding > 0) { + if (this.boundsOptions.paddingBottomRight !== undefined) { // bounds fitting can take account the wanted padding, so convert to bounds naviProps.bounds = boundWithMinimumArea([[lat, lon]], zoom); } else { @@ -227,12 +259,7 @@ export default class Map extends React.Component { return null; } - if (this.props.mapBottomPadding) { - boundsOptions.paddingBottomRight = [0, this.props.mapBottomPadding]; - } - const mapBaseUrl = - (isDebugTiles && `${config.URL.OTP}inspector/tile/traversal/`) || - getLayerBaseUrl(config.URL.MAP, this.props.lang); + const mapBaseUrl = getLayerBaseUrl(config.URL.MAP, this.props.lang); const mapUrl = config.hasAPISubscriptionQueryParameter ? `${mapBaseUrl}{z}/{x}/{y}{size}.png?${config.API_SUBSCRIPTION_QUERY_PARAMETER_NAME}=${config.API_SUBSCRIPTION_TOKEN}` : `${mapBaseUrl}{z}/{x}/{y}{size}.png`; @@ -294,7 +321,7 @@ export default class Map extends React.Component { {this.props.bottomButtons} @@ -306,8 +333,8 @@ export default class Map extends React.Component { keyboard={false} ref={el => { this.map = el; - if (this.props.mapRef) { - this.props.mapRef(el); + if (this.props.leafletMapRef) { + this.props.leafletMapRef(el); } }} minZoom={config.map.minZoom} @@ -315,7 +342,7 @@ export default class Map extends React.Component { zoomControl={false} attributionControl={false} animate={this.props.animate} - boundsOptions={boundsOptions} + boundsOptions={this.boundsOptions} {...leafletEvents} onPopupopen={onPopupopen} closePopupOnClick={false} @@ -325,51 +352,41 @@ export default class Map extends React.Component { tileSize={config.map.tileSize || 256} zoomOffset={config.map.zoomOffset || 0} updateWhenIdle={false} - size={ - config.map.useRetinaTiles && L.Browser.retina && !isDebugTiles - ? '@2x' - : '' - } + size={config.map.useRetinaTiles && L.Browser.retina ? '@2x' : ''} minZoom={config.map.minZoom} maxZoom={config.map.maxZoom} attribution={attribution} /> - - {breakpoint => - attribution && ( - - ) - } - + {attribution && ( + + )} {config.map.showScaleBar && ( )} - - {breakpoint => - breakpoint === 'large' && - config.map.showZoomControl && ( - - ) - } - + {this.props.breakpoint === 'large' && + config.map.showZoomControl && ( + + )} {leafletObjNew} diff --git a/app/component/map/MapBottomsheetContext.js b/app/component/map/MapBottomsheetContext.js index 640f66ec63..f5acb150a3 100644 --- a/app/component/map/MapBottomsheetContext.js +++ b/app/component/map/MapBottomsheetContext.js @@ -1,5 +1,4 @@ -import React from 'react'; +import { createContext } from 'react'; -const context = React.createContext({ paddingBottomRight: [0, 0] }); - -export default context; +// value 0 = default map bottom padding, used in desktop +export default createContext(0); diff --git a/app/component/map/MapContainer.js b/app/component/map/MapContainer.js index 003bd9c8ea..3fb6e0daf7 100644 --- a/app/component/map/MapContainer.js +++ b/app/component/map/MapContainer.js @@ -1,30 +1,22 @@ import PropTypes from 'prop-types'; -import React from 'react'; +import React, { useContext } from 'react'; import connectToStores from 'fluxible-addons-react/connectToStores'; import MapBottomsheetContext from './MapBottomsheetContext'; import withGeojsonObjects from './withGeojsonObjects'; - import LazilyLoad, { importLazy } from '../LazilyLoad'; const mapModules = { Map: () => importLazy(import(/* webpackChunkName: "map" */ './Map')), }; -function MapContainer({ className, children, ...props }) { +function MapContainer({ className, children, bottomPadding, ...props }) { + const contextPadding = useContext(MapBottomsheetContext); return (
{({ Map }) => { return ( - - {context => ( - - )} - + ); }} @@ -36,15 +28,13 @@ function MapContainer({ className, children, ...props }) { MapContainer.propTypes = { className: PropTypes.string, children: PropTypes.node, - boundsOptions: PropTypes.shape({ - paddingBottomRight: PropTypes.arrayOf(PropTypes.number), - }), + bottomPadding: PropTypes.number, }; MapContainer.defaultProps = { className: '', children: undefined, - boundsOptions: {}, + bottomPadding: undefined, }; export default connectToStores( diff --git a/app/component/map/MapWithTracking.js b/app/component/map/MapWithTracking.js index 14928f8f7c..8551ebbed8 100644 --- a/app/component/map/MapWithTracking.js +++ b/app/component/map/MapWithTracking.js @@ -87,6 +87,7 @@ class MapWithTrackingStateHandler extends React.Component { breakpoint: PropTypes.string.isRequired, lang: PropTypes.string.isRequired, topButtons: PropTypes.node, + bottomPadding: PropTypes.number, }; static defaultProps = { @@ -108,6 +109,7 @@ class MapWithTrackingStateHandler extends React.Component { leafletEvents: {}, mapLayerOptions: null, topButtons: null, + bottomPadding: undefined, }; constructor(props) { @@ -130,15 +132,11 @@ class MapWithTrackingStateHandler extends React.Component { // eslint-disable-next-line camelcase UNSAFE_componentWillReceiveProps(newProps) { - let newState; - - if (newProps.mapTracking && !this.state.mapTracking) { - newState = { ...newState, mapTracking: true }; - } else if (newProps.mapTracking === false && this.state.mapTracking) { - newState = { ...newState, mapTracking: false }; - } - if (newState) { - this.setState(newState); + if ( + newProps.mapTracking !== undefined && + newProps.mapTracking !== this.state.mapTracking + ) { + this.setState({ mapTracking: newProps.mapTracking }); } } @@ -151,13 +149,23 @@ class MapWithTrackingStateHandler extends React.Component { } }; + setMap = map => { + this.map = map; + }; + enableMapTracking = () => { if (!this.props.position.hasLocation) { this.context.executeAction(startLocationWatch); } - this.setState({ - mapTracking: true, - }); + if (!this.state.mapTracking) { + // enabling tracking will trigger same navigation events as user navigation + // this hack prevents those events from clearing tracking + this.ignoreNavigation = true; + setTimeout(() => { + this.ignoreNavigation = false; + }, 500); + this.setState({ mapTracking: true }); + } if (this.props.onMapTracking) { this.props.onMapTracking(); } @@ -224,6 +232,12 @@ class MapWithTrackingStateHandler extends React.Component { }; }; + // eslint-disable-next-line react/no-unused-class-component-methods + setBottomPadding = padding => { + this.map?.setBottomPadding(padding); + this.setState({ bottomPadding: padding }); + }; + render() { const { lat, @@ -303,8 +317,6 @@ class MapWithTrackingStateHandler extends React.Component { ? this.context.intl.formatMessage({ id: 'tracking-button-on' }) : this.context.intl.formatMessage({ id: 'tracking-button-off' }); - const iconColor = this.state.mapTracking ? '#ff0000' : '#78909c'; - const mergedMapLayers = this.getMapLayers(); return ( <> @@ -321,7 +333,9 @@ class MapWithTrackingStateHandler extends React.Component { }} {...this.naviProps} {...rest} - mapRef={this.setMapElementRef} + leafletMapRef={this.setMapElementRef} + mapRef={this.setMap} + breakpoint={this.props.breakpoint} bottomButtons={
{config.map.showLayerSelector && ( @@ -344,18 +358,11 @@ class MapWithTrackingStateHandler extends React.Component { { if (this.state.mapTracking) { this.disableMapTracking(); } else { - // enabling tracking will trigger same navigation events as user navigation - // this hack prevents those events from clearing tracking - this.ignoreNavigation = true; - setTimeout(() => { - this.ignoreNavigation = false; - }, 500); this.enableMapTracking(); } }} @@ -363,6 +370,7 @@ class MapWithTrackingStateHandler extends React.Component { />
} + bottomPadding={this.state.bottomPadding} topButtons={topButtons} mapLayers={mergedMapLayers} > diff --git a/app/component/map/StopsNearYouMap.js b/app/component/map/StopsNearYouMap.js index 64ca638c3a..cf6588a70b 100644 --- a/app/component/map/StopsNearYouMap.js +++ b/app/component/map/StopsNearYouMap.js @@ -26,12 +26,10 @@ import { import ItineraryLine from './ItineraryLine'; import { locationShape, - mapLayerOptionsShape, relayShape, configShape, stopShape, } from '../../util/shapes'; -import { mapLayerShape } from '../../store/MapLayerStore'; import Loading from '../Loading'; import LazilyLoad, { importLazy } from '../LazilyLoad'; import { getDefaultNetworks } from '../../util/vehicleRentalUtils'; @@ -155,12 +153,9 @@ function StopsNearYouMap( favouriteIds, relay, position, - onEndNavigation, - onMapTracking, - mapLayers, - mapLayerOptions, showWalkRoute, prioritizedStopsNearYou, + ...rest }, { ...context }, ) { @@ -458,13 +453,10 @@ function StopsNearYouMap( stopsToShow: mode === 'FAVORITE' ? Array.from(favouriteIds) : undefined, hilightedStops: hilightedStops(), mergeStops: false, - mapLayers, - mapLayerOptions, bounds, leafletObjs, breakpoint, - onEndNavigation, - onMapTracking, + ...rest, }; if (breakpoint === 'large') { @@ -499,15 +491,11 @@ StopsNearYouMap.propTypes = { prioritizedStopsNearYou: PropTypes.arrayOf(stopShape), // eslint-disable-next-line favouriteIds: PropTypes.object, - mapLayers: mapLayerShape.isRequired, - mapLayerOptions: mapLayerOptionsShape, position: locationShape.isRequired, match: matchShape.isRequired, breakpoint: PropTypes.string.isRequired, language: PropTypes.string.isRequired, relay: relayShape.isRequired, - onEndNavigation: PropTypes.func, - onMapTracking: PropTypes.func, loading: PropTypes.bool, showWalkRoute: PropTypes.bool, }; @@ -518,9 +506,6 @@ StopsNearYouMap.defaultProps = { loading: false, favouriteIds: undefined, prioritizedStopsNearYou: [], - mapLayerOptions: undefined, - onEndNavigation: undefined, - onMapTracking: undefined, }; StopsNearYouMap.contextTypes = { diff --git a/app/component/map/map.scss b/app/component/map/map.scss index 9ed66118af..8eab8c528f 100644 --- a/app/component/map/map.scss +++ b/app/component/map/map.scss @@ -830,6 +830,10 @@ div.origin-popup { min-width: 50px; height: 18px; + &.only-icon { + min-width: 0; + } + .wide { min-width: 64px; } @@ -862,6 +866,10 @@ div.origin-popup { color: $white; } + .map-route-number.ferry-external { + color: $black; + } + &::before { content: ''; width: 0; @@ -878,12 +886,20 @@ div.origin-popup { } } +.map .arrow-bottomLeft.only-icon div::before { + border-right: 10px solid transparent; +} + .map .arrow-bottomRight { display: flex; align-items: center; min-width: 50px; height: 18px; + &.only-icon { + min-width: 0; + } + .wide { min-width: 64px; } @@ -916,6 +932,10 @@ div.origin-popup { color: $white; } + .map-route-number.ferry-external { + color: $black; + } + &::before { content: ''; width: 0; @@ -931,12 +951,20 @@ div.origin-popup { } } +.map .arrow-bottomRight.only-icon div::before { + border-right: 9px solid transparent; +} + .map .arrow-topRight { display: flex; align-items: center; min-width: 50px; height: 18px; + &.only-icon { + min-width: 0; + } + .wide { min-width: 64px; } @@ -969,6 +997,10 @@ div.origin-popup { color: $white; } + .map-route-number.ferry-external { + color: $black; + } + &::before { content: ''; width: 0; @@ -985,12 +1017,21 @@ div.origin-popup { } } +.map .arrow-topRight.only-icon div::before { + border-left: 15px solid transparent; + right: 11px; +} + .map .arrow-topLeft { display: flex; align-items: center; min-width: 50px; height: 18px; + &.only-icon { + min-width: 0; + } + .wide { min-width: 64px; } @@ -1023,6 +1064,10 @@ div.origin-popup { color: $white; } + .map-route-number.ferry-external { + color: $black; + } + &::before { content: ''; width: 0; @@ -1045,6 +1090,11 @@ div.origin-popup { min-width: 50px; height: 18px; + &.only-icon { + min-width: 0; + align-items: normal; + } + .wide { min-width: 64px; } @@ -1210,6 +1260,10 @@ div.origin-popup { padding-right: 3px; color: $white; } + + .map-route-number.ferry-external { + color: $black; + } } } @@ -1250,6 +1304,14 @@ div.origin-popup { stroke-opacity: 0.5; } +.map-line.ferry-external.leg { + color: $external-feed-map-color; +} + +.map-line.scooter.leg { + color: $scooter-map-color; +} + /* Fix to default leaflet behavior */ .leaflet-map-pane svg { position: relative; diff --git a/app/component/map/non-tile-layer/LegMarker.js b/app/component/map/non-tile-layer/LegMarker.js index 92cf3672cd..2683d87d75 100644 --- a/app/component/map/non-tile-layer/LegMarker.js +++ b/app/component/map/non-tile-layer/LegMarker.js @@ -2,7 +2,7 @@ import PropTypes from 'prop-types'; import React from 'react'; import Icon from '../../Icon'; import { isBrowser } from '../../../util/browser'; -import { legShape } from '../../../util/shapes'; +import { legShape, configShape } from '../../../util/shapes'; /* eslint-disable global-require */ @@ -28,10 +28,26 @@ class LegMarker extends React.Component { style: undefined, }; + static contextTypes = { + config: configShape.isRequired, + }; + // An arrow marker will be displayed if the normal marker can't fit getLegMarker() { const color = this.props.color ? this.props.color : 'currentColor'; const className = this.props.wide ? 'wide' : ''; + // Do not display route number if it is an external route and the route number is empty. + const displayRouteNumber = !( + this.context.config.externalFeedIds !== undefined && + this.props.mode.includes('external') && + this.props.leg.name === '' + ); + const routeNumber = displayRouteNumber + ? ` + ${this.props.leg.name.toLowerCase()}` + : ''; return (
`, className: `${ this.props.style ? `arrow-${this.props.style}` : 'legmarker' - } ${this.props.mode}`, + } ${this.props.mode} ${displayRouteNumber ? '' : 'only-icon'}`, iconSize: null, })} zIndexOffset={this.props.zIndexOffset} diff --git a/app/component/map/popups/LocationPopup.js b/app/component/map/popups/LocationPopup.js index ffee0bdff8..b953378df5 100644 --- a/app/component/map/popups/LocationPopup.js +++ b/app/component/map/popups/LocationPopup.js @@ -134,7 +134,9 @@ class LocationPopup extends React.Component { return ( - {zoneId && } + {zoneId && zoneId !== place && ( + + )} {(this.props.locationPopup === 'all' || this.props.locationPopup === 'origindestination') && ( diff --git a/app/component/map/tile-layer/RentalVehicles.js b/app/component/map/tile-layer/RentalVehicles.js index 8b15d5f442..fbb7cc16e0 100644 --- a/app/component/map/tile-layer/RentalVehicles.js +++ b/app/component/map/tile-layer/RentalVehicles.js @@ -38,7 +38,10 @@ class RentalVehicles { fetchAndDraw = lang => { const zoomedIn = this.tile.coords.z > this.config.vehicleRental.cityBikeSmallIconZoom; - const baseUrl = getLayerBaseUrl(this.config.URL.RENTAL_VEHICLE_MAP, lang); + const baseUrl = getLayerBaseUrl( + this.config.URL.REALTIME_RENTAL_VEHICLE_MAP, + lang, + ); const tileUrl = `${baseUrl}${ this.tile.coords.z + (this.tile.props.zoomOffset || 0) }/${this.tile.coords.x}/${this.tile.coords.y}.pbf`; @@ -54,7 +57,7 @@ class RentalVehicles { const vt = new VectorTile(new Protobuf(buf)); this.features = []; - const layer = vt.layers.rentalVehicles; + const layer = vt.layers.realtimeRentalVehicles; const settings = getSettings(this.config); const { scooterNetworks } = settings; const scooterIconPrefix = `icon-icon_scooter`; @@ -166,7 +169,8 @@ class RentalVehicles { shouldShowRentalVehicle = (id, network, pickupAllowed, formFactor) => (!this.tile.stopsToShow || this.tile.stopsToShow.includes(id)) && (!network || - (this.config.vehicleRental.networks[network].enabled && + (this.config.vehicleRental.networks[network] && + this.config.vehicleRental.networks[network].enabled && this.config.vehicleRental.networks[network].showRentalVehicles && this.config.vehicleRental.networks[network].type === formFactor.toLowerCase())) && diff --git a/app/component/rental-vehicle-content.scss b/app/component/rental-vehicle-content.scss index fc2c84168c..08e01a6c92 100644 --- a/app/component/rental-vehicle-content.scss +++ b/app/component/rental-vehicle-content.scss @@ -40,6 +40,7 @@ .icon-container { .icon { width: 2.25rem; + background-color: $scooter-color; } } } @@ -186,11 +187,16 @@ } } + .scooter-icon .icon-container .icon { + background-color: $scooter-color; + border-radius: 3px; + } + .citybike-info { position: absolute; bottom: 74px; } - } // test end here.... + } } } @@ -252,11 +258,15 @@ .icon-container .icon { width: 48px; height: 48px; + background-color: $scooter-color; + border-radius: 5px; } .back-button .icon-container .icon { width: 1.3em; height: 1.3em; + background-color: transparent; + border-radius: 0; } } } diff --git a/app/component/routepage/FuzzyTripLink.js b/app/component/routepage/FuzzyTripLink.js index 09f0f8cdb9..eca5b10aad 100644 --- a/app/component/routepage/FuzzyTripLink.js +++ b/app/component/routepage/FuzzyTripLink.js @@ -133,11 +133,12 @@ FuzzyTripLink.propTypes = { trip: tripShape, vehicle: vehicleShape.isRequired, stopName: PropTypes.string.isRequired, - nextStopName: PropTypes.string.isRequired, + nextStopName: PropTypes.string, }; FuzzyTripLink.defaultProps = { trip: undefined, + nextStopName: undefined, }; FuzzyTripLink.contextTypes = { diff --git a/app/configurations/config.default.js b/app/configurations/config.default.js index 68611b7dd8..90026414cb 100644 --- a/app/configurations/config.default.js +++ b/app/configurations/config.default.js @@ -10,7 +10,7 @@ const MAP_URL = process.env.MAP_URL || 'https://digitransit-dev-cdn-origin.azureedge.net'; const MAP_VERSION = process.env.MAP_VERSION || 'v2'; const POI_MAP_PREFIX = `${MAP_URL}/map/v3/finland`; -const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/routers/finland/`; +const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/finland/`; const STOP_TIMETABLES_URL = process.env.STOP_TIMETABLES_URL || 'https://dev.kartat.hsl.fi'; const APP_PATH = process.env.APP_CONTEXT || ''; @@ -60,9 +60,6 @@ export default { REALTIME_RENTAL_STATION_MAP: { default: `${POI_MAP_PREFIX}/fi/realtimeRentalStations/`, }, - RENTAL_VEHICLE_MAP: { - default: `${POI_MAP_PREFIX}/fi/rentalVehicles/`, - }, REALTIME_RENTAL_VEHICLE_MAP: { default: `${POI_MAP_PREFIX}/fi/realtimeRentalVehicles/`, }, @@ -349,6 +346,9 @@ export default { }, maxNearbyRentalVehicleAmount: 5, maxDistanceToRentalVehiclesInMeters: 100, + maxMinutesToRentalJourneyStart: 60, + maxMinutesToRentalJourneyEnd: 720, + allowDirectScooterJourneys: false, }, // Lowest level for stops and terminals are rendered @@ -371,6 +371,7 @@ export default { colors: { primary: '#000F94', + backgroundInfo: '#e5f2fa', iconColors: { 'mode-airplane': '#0046ad', 'mode-bus': '#0088ce', @@ -379,7 +380,7 @@ export default { 'mode-rail': '#af8dbc', 'mode-ferry': '#247C7B', 'mode-citybike': '#f2b62d', - 'mode-scooter': '#BABABA', + 'mode-scooter': '#C5CAD2', }, }, iconModeSet: 'digitransit', @@ -835,4 +836,5 @@ export default { }, }, ], + navigation: false, }; diff --git a/app/configurations/config.hameenlinna.js b/app/configurations/config.hameenlinna.js index 3d19b84492..9cf473d05e 100644 --- a/app/configurations/config.hameenlinna.js +++ b/app/configurations/config.hameenlinna.js @@ -11,14 +11,14 @@ export default configMerger(walttiConfig, { CONFIG, appBarLink: { - name: 'Hämeenlinna', - href: 'http://www.hameenlinna.fi/joukkoliikenne/', + name: 'Hämeenlinnan joukkoliikenne', + href: 'http://hameenlinnanjoukkoliikenne.fi/', }, colors: { - primary: '#F76013', + primary: 'rgb(196,40,31)', iconColors: { - 'mode-bus': '#F76013', + 'mode-bus': 'rgb(196,40,31)', }, }, diff --git a/app/configurations/config.hsl.js b/app/configurations/config.hsl.js index 9006b58903..70973fff12 100644 --- a/app/configurations/config.hsl.js +++ b/app/configurations/config.hsl.js @@ -3,7 +3,7 @@ import { BIKEAVL_WITHMAX } from '../util/vehicleRentalUtils'; const CONFIG = 'hsl'; const API_URL = process.env.API_URL || 'https://dev-api.digitransit.fi'; -const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/routers/hsl/`; +const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/hsl/`; const MAP_URL = process.env.MAP_URL || 'https://digitransit-dev-cdn-origin.azureedge.net'; const POI_MAP_PREFIX = `${MAP_URL}/map/v3/hsl`; @@ -12,10 +12,15 @@ const HSLTimetables = require('./timetableConfigUtils').default.HSL; const HSLParkAndRideUtils = require('../util/ParkAndRideUtils').default.HSL; const rootLink = process.env.ROOTLINK || 'https://test.hslfi.hsldev.com'; -const BANNER_URL = - process.env.BANNER_URL || - 'https://cms-test.hslfi.hsldev.com/api/v1/banners?site=JourneyPlanner'; -// 'https://content.hsl.fi/api/v1/banners?site=JourneyPlanner'; + +const BANNER_URL = process.env.CONTENT_DOMAIN + ? `${process.env.CONTENT_DOMAIN}/api/v1/banners?site=JourneyPlanner` + : process.env.BANNER_URL || + 'https://cms-test.hslfi.hsldev.com/api/v1/banners?site=JourneyPlanner'; +const SUGGESTION_URL = process.env.CONTENT_DOMAIN + ? `${process.env.CONTENT_DOMAIN}/api/v1/search/suggestions` + : 'https://content.hsl.fi/api/v1/search/suggestions'; // old url + const localStorageEmitter = process.env.USE_EMITTER && rootLink + '/local-storage-emitter'; @@ -34,9 +39,6 @@ export default { REALTIME_RENTAL_STATION_MAP: { default: `${POI_MAP_PREFIX}/fi/realtimeRentalStations/`, }, - RENTAL_VEHICLE_MAP: { - default: `${POI_MAP_PREFIX}/fi/rentalVehicles/`, - }, REALTIME_RENTAL_VEHICLE_MAP: { default: `${POI_MAP_PREFIX}/fi/realtimeRentalVehicles/`, }, @@ -54,7 +56,7 @@ export default { FONTCOUNTER: 'https://cloud.typography.com/6364294/7432412/css/fonts.css', ROOTLINK: rootLink, BANNERS: BANNER_URL, - HSL_FI_SUGGESTIONS: 'https://content.hsl.fi/api/v1/search/suggestions', + HSL_FI_SUGGESTIONS: SUGGESTION_URL, EMBEDDED_SEARCH_GENERATION: '/reittiopas-elementti', EMISSIONS_INFO: { fi: 'https://www.hsl.fi/hsl/sahkobussit/ymparisto-lukuina', @@ -85,6 +87,7 @@ export default { useRoutingFeedbackPrompt: true, feedIds: ['HSL', 'HSLlautta', 'Sipoo'], + externalFeedIds: ['HSLlautta'], showHSLTracking: false, allowLogin: true, @@ -414,6 +417,8 @@ export default { ticketPurchaseLink: function purchaseTicketLink(fare) { return `https://open.app.hsl.fi/zoneTicketWizard/TICKET_TYPE_SINGLE_TICKET/${fare.ticketName}/adult/-`; }, + ticketLink: 'https://open.app.hsl.fi/tickets', + ticketLinkOperatorCode: 'hsl', // mapping fareId from OTP fare identifiers to human readable form // in the new HSL zone model, just strip off the prefix 'HSL:' fareMapping: function mapHslFareId(fareId) { @@ -421,6 +426,7 @@ export default { ? fareId.substring(fareId.indexOf(':') + 1) : ''; }, + ticketButtonTextId: 'open-app', trafficNowLink: { fi: 'matkustaminen/liikenne', @@ -512,6 +518,21 @@ export default { sv: 'https://www.hsl.fi/sv/stadscyklar?utm_campaign=kaupunkipyorat-omat&utm_source=reittiopas&utm_medium=referral#block-28474', en: 'https://www.hsl.fi/en/citybikes?utm_campaign=kaupunkipyorat-omat&utm_source=reittiopas&utm_medium=referral#block-28474', }, + scooterInfoLink: { + fi: { + text: 'Potkulaudat', + url: 'https://www.hsl.fi/reittiopas_potkulaudat', + }, + en: { + text: 'Scooters', + url: 'https://www.hsl.fi/en/journey_planner_scooters', + }, + sv: { + text: 'Elsparkcyklar', + url: 'https://www.hsl.fi/sv/reseplaneraren_sparkcyklar', + }, + }, + maxMinutesToRentalJourneyEnd: 240, }, showVehiclesOnItineraryPage: true, @@ -561,6 +582,7 @@ export default { useRealtimeTravellerCapacities: true, navigation: true, + navigationLogo: 'hsl/navigator-logo.svg', stopCard: { header: { diff --git a/app/configurations/config.jyvaskyla.js b/app/configurations/config.jyvaskyla.js index 3a777ebae2..165b982080 100644 --- a/app/configurations/config.jyvaskyla.js +++ b/app/configurations/config.jyvaskyla.js @@ -172,47 +172,7 @@ export default configMerger(walttiConfig, { includeBikeSuggestions: false, transferPenalty: 1600, }, - - ticketPurchaseLink: function purchaseTicketLink(fare) { - const fareId = fare.fareProducts[0].product.id; - const ticket = fareId?.substring - ? fareId.substring(fareId.indexOf(':') + 1) - : ''; - let zones = ''; - // Waltti wants zone ids, so map A to 01, B to 02 etc - for (let i = 0; i < ticket.length; i++) { - zones += `0${ticket.charCodeAt(i) - 64}`; // eslint-disable - } - return `https://waltti.fi/walttiappfeat/busTicket/?operator=50209&ticketType=single&customerGroup=adult&zones=${zones}`; - }, - - fareMapping: function mapFareId(fareId) { - const id = fareId?.substring?.(fareId.indexOf(':') + 1); - switch (id) { - case 'A': - return 'Käteismaksu autossa, Vyöhyke A'; - case 'AB': - return 'Käteismaksu autossa, Vyöhykkeet AB'; - case 'ABC': - return 'Käteismaksu autossa, Vyöhykkeet ABC'; - case 'ABCD': - return 'Käteismaksu autossa, Vyöhykkeet ABCD'; - case 'B': - return 'Käteismaksu autossa, Vyöhyke B'; - case 'BC': - return 'Käteismaksu autossa, Vyöhykkeet BC'; - case 'BCD': - return 'Käteismaksu autossa, Vyöhykkeet BCD'; - case 'C': - return 'Käteismaksu autossa, Vyöhyke C'; - case 'CD': - return 'Käteismaksu autossa, Vyöhykkeet CD'; - case 'D': - return 'Käteismaksu autossa, Vyöhyke D'; - default: - return ''; - } - }, + ticketLinkOperatorCode: 50209, stopCard: { header: { diff --git a/app/configurations/config.kela.js b/app/configurations/config.kela.js index 1306c3fd20..d01718a7a2 100644 --- a/app/configurations/config.kela.js +++ b/app/configurations/config.kela.js @@ -7,8 +7,7 @@ const CONFIG = 'kela'; const APP_TITLE = 'Reittiopas'; const APP_DESCRIPTION = 'Digitransit-reittiopas'; const API_URL = process.env.API_URL || 'https://dev-api.digitransit.fi'; -const OTP_URL = - process.env.OTP_URL || `${API_URL}/routing/v2-kela/routers/kela/`; +const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2-kela/kela/`; const MAP_URL = process.env.MAP_URL || 'https://digitransit-dev-cdn-origin.azureedge.net'; const POI_MAP_PREFIX = `${MAP_URL}/map/v3-kela/kela`; @@ -115,7 +114,6 @@ export default { 'mode-ferry-pier': '#666666', 'mode-citybike': '#FCBC19', 'mode-citybike-secondary': '#333333', - 'mode-scooter': '#BABABA', }, }, diff --git a/app/configurations/config.kotka.js b/app/configurations/config.kotka.js index 619c830e26..772e45177f 100644 --- a/app/configurations/config.kotka.js +++ b/app/configurations/config.kotka.js @@ -7,10 +7,10 @@ const APP_TITLE = 'Kotkan seudun reittiopas'; const APP_DESCRIPTION = 'Kotkan seudun reittiopas'; const walttiConfig = require('./config.waltti').default; -const minLat = 60.423693; -const maxLat = 60.688566; -const minLon = 26.422982; -const maxLon = 27.739367; +const minLat = 60.243; +const maxLat = 60.688; +const minLon = 26.422; +const maxLon = 27.738; export default configMerger(walttiConfig, { CONFIG, diff --git a/app/configurations/config.lahti.js b/app/configurations/config.lahti.js index f8446f358a..73e87ec78d 100644 --- a/app/configurations/config.lahti.js +++ b/app/configurations/config.lahti.js @@ -172,4 +172,18 @@ export default configMerger(walttiConfig, { }, }, }, + + showTicketInformation: true, + useTicketIcons: true, + ticketLink: 'https://www.lsl.fi/liput-ja-hinnat/', + showTicketPrice: true, + + showTicketLinkOnlyWhenTesting: true, + settingsForFeatureTesting: { + walkSpeed: 0.69, + bikeSpeed: 8.33, + includeBikeSuggestions: false, + transferPenalty: 1600, + }, + ticketLinkOperatorCode: 50223, }); diff --git a/app/configurations/config.matka.js b/app/configurations/config.matka.js index 50dbb42010..00fc3035bf 100644 --- a/app/configurations/config.matka.js +++ b/app/configurations/config.matka.js @@ -61,7 +61,7 @@ export default { 'mode-ferry-pier': '#666666', 'mode-citybike': '#FCBC19', 'mode-citybike-secondary': '#333333', - 'mode-scooter': '#BABABA', + 'mode-scooter': '#C5CAD2', }, }, feedIds: [ @@ -90,6 +90,7 @@ export default { 'VARELY', 'Harma', 'PohjolanMatka', + 'Korsisaari', ], additionalFeedIds: { @@ -176,6 +177,20 @@ export default { ...KotkaConfig.vehicleRental.networks, ...KouvolaConfig.vehicleRental.networks, }, + scooterInfoLink: { + fi: { + text: 'Potkulaudat', + url: 'https://www.fintraffic.fi/fi/uutiset/sahkopotkulaudat-nyt-mukana-opasmatkafi-reittioppaassa', + }, + en: { + text: 'Scooters', + url: 'https://www.fintraffic.fi/en/news/electric-scooters-now-included-opasmatkafi-journey-planner', + }, + sv: { + text: 'Elsparkcyklar', + url: 'https://www.fintraffic.fi/sv/nyheter/elsparkcyklarna-finns-nu-med-i-reseplaneraren-opasmatkafi', + }, + }, }, getAutoSuggestIcons: { diff --git a/app/configurations/config.oulu.js b/app/configurations/config.oulu.js index 3b4c524452..8a7953a4bf 100644 --- a/app/configurations/config.oulu.js +++ b/app/configurations/config.oulu.js @@ -100,7 +100,7 @@ export default configMerger(walttiConfig, { sv: 'Zoner', en: 'Zones', }, - url: '/assets/geojson/oulu_zone_lines_20230223.geojson', + url: '/assets/geojson/oulu_zone_lines_20241011.geojson', }, ], }, @@ -138,11 +138,7 @@ export default configMerger(walttiConfig, { ], }, zoneIdMapping: { - 1: 'L', - 2: 'A', - 3: 'B', - 4: 'C', - 5: 'D', + 1: 'Oulu', }, zones: { stops: true, diff --git a/app/configurations/config.turku.js b/app/configurations/config.turku.js index c39021532d..264f33d4c1 100644 --- a/app/configurations/config.turku.js +++ b/app/configurations/config.turku.js @@ -40,7 +40,7 @@ const walttiConfig = require('./config.waltti').default; export default configMerger(walttiConfig, { CONFIG, - feedIds: ['FOLI', 'FUNI'], + feedIds: ['FOLI', 'FUNI', 'TurkuTest'], searchParams: { 'boundary.rect.min_lat': 59.963388, diff --git a/app/configurations/config.vaasa.js b/app/configurations/config.vaasa.js index 80dcab8647..a0e0b27a37 100644 --- a/app/configurations/config.vaasa.js +++ b/app/configurations/config.vaasa.js @@ -35,7 +35,7 @@ export default configMerger(walttiConfig, { title: APP_TITLE, - logo: 'vaasa/vaasa_vasa_rgb_nega_v01.png', + logo: 'vaasa/vaasa-favicon.png', secondaryLogo: 'vaasa/secondary-logo.png', feedIds: ['Vaasa'], diff --git a/app/configurations/config.varely.js b/app/configurations/config.varely.js index 3a543d0a09..162faac671 100644 --- a/app/configurations/config.varely.js +++ b/app/configurations/config.varely.js @@ -5,7 +5,7 @@ const CONFIG = 'varely'; const API_URL = process.env.API_URL || 'https://dev-api.digitransit.fi'; const APP_TITLE = 'Seutu+ reittiopas'; const APP_DESCRIPTION = 'Varsinais-Suomen ELY-keskuksen reittiopas'; -const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/routers/varely/`; +const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/varely/`; const MAP_URL = process.env.MAP_URL || 'https://digitransit-dev-cdn-origin.azureedge.net'; const POI_MAP_PREFIX = `${MAP_URL}/map/v3/varely`; @@ -14,10 +14,10 @@ const walttiConfig = require('./config.waltti').default; const colorPrimary = '#008161'; -const minLat = 60; +const minLat = 59.98; const maxLat = 61.8; const minLon = 21; -const maxLon = 23.6; +const maxLon = 23.9; export default configMerger(walttiConfig, { CONFIG, @@ -32,7 +32,7 @@ export default configMerger(walttiConfig, { }, }, - feedIds: ['VARELY', 'FOLI', 'Rauma'], + feedIds: ['VARELY', 'FOLI', 'Rauma', 'Pori', 'Salo'], colors: { primary: colorPrimary, @@ -123,7 +123,7 @@ export default configMerger(walttiConfig, { { header: 'Tietoja palvelusta', paragraphs: [ - 'Tervetuloa reittioppaaseen! Reittiopas kertoo, miten pääset nopeasti ja helposti perille joukkoliikenteellä Turussa, Aurassa, Maskussa, Mynämäellä, Nousiaisissa, Paimiossa ja Paraisilla. Reittiopas-palvelun tarjoaa Varsinais-Suomen ELY-keskus, ja se perustuu Digitransit –palvelualustaan.', + 'Tervetuloa reittioppaaseen! Reittiopas kertoo, miten pääset nopeasti ja helposti perille joukkoliikenteellä Turussa, Aurassa, Maskussa, Mynämäellä, Nousiaisissa, Paimiossa, Paraisilla, Raumalla, Porissa ja Salossa. Reittiopas-palvelun tarjoaa Varsinais-Suomen ELY-keskus, ja se perustuu Digitransit –palvelualustaan.', ], }, ], @@ -132,7 +132,7 @@ export default configMerger(walttiConfig, { { header: 'Om tjänsten', paragraphs: [ - 'Den här tjänsten är för reseplanering inom Egentliga Finland (Åbo, Aura, Masku, Mynämäki, Nousis, Pemar and Pargas). Reseplaneraren täcker med vissa begränsningar kollektivtrafik, promenad, cykling samt privatbilism. Tjänsten baserar sig på Digitransit-plattformen.', + 'Den här tjänsten är för reseplanering inom Egentliga Finland (Åbo, Aura, Masku, Virmo, Nousis, Pemar, Pargas, Raumo, Björneborg och Salo). Reseplaneraren täcker med vissa begränsningar kollektivtrafik, promenad, cykling samt privatbilism. Tjänsten baserar sig på Digitransit-plattformen.', ], }, ], @@ -141,7 +141,7 @@ export default configMerger(walttiConfig, { { header: 'About this service', paragraphs: [ - 'Welcome to the Journey Planner! The Journey Planner shows you how to get to your destination fast and easy by public transport in Turku, Aura, Masku, Mynämäki, Nousiainen, Paimio and Parainen. You can also use the planner to find fast walking and cycling routes, and to an extent, for driving directions. The Journey Planner is provided by Centre for Economic Development, Transport and the Environment of Southwest Finland and it is based on the Digitransit service platform.', + 'Welcome to the Journey Planner! The Journey Planner shows you how to get to your destination fast and easy by public transport in Turku, Aura, Masku, Mynämäki, Nousiainen, Paimio, Parainen, Rauma, Pori and Salo. You can also use the planner to find fast walking and cycling routes, and to an extent, for driving directions. The Journey Planner is provided by Centre for Economic Development, Transport and the Environment of Southwest Finland and it is based on the Digitransit service platform.', ], }, ], @@ -163,6 +163,16 @@ export default configMerger(walttiConfig, { sv: 'Åboregion', en: 'Turku region', }, + Salo: { + fi: 'Salo', + sv: 'Salo', + en: 'Salo', + }, + Pori: { + fi: 'Pori', + sv: 'Björneborg', + en: 'Pori', + }, }, staticMessages: [], @@ -170,4 +180,5 @@ export default configMerger(walttiConfig, { showNearYouButtons: true, allowLogin: false, routeNotifications: [], + analyticsScript: '', }); diff --git a/app/configurations/config.waltti.js b/app/configurations/config.waltti.js index 68853ea50f..758e62a911 100644 --- a/app/configurations/config.waltti.js +++ b/app/configurations/config.waltti.js @@ -1,5 +1,5 @@ const API_URL = process.env.API_URL || 'https://dev-api.digitransit.fi'; -const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/routers/waltti/`; +const OTP_URL = process.env.OTP_URL || `${API_URL}/routing/v2/waltti/`; const MAP_URL = process.env.MAP_URL || 'https://digitransit-dev-cdn-origin.azureedge.net'; const POI_MAP_PREFIX = `${MAP_URL}/map/v3/waltti`; @@ -31,9 +31,6 @@ export default { sv: `${POI_MAP_PREFIX}/sv/vehicleParkingGroups/`, fi: `${POI_MAP_PREFIX}/fi/vehicleParkingGroups/`, }, - RENTAL_VEHICLE_MAP: { - default: `${POI_MAP_PREFIX}/fi/rentalVehicles/`, - }, REALTIME_RENTAL_VEHICLE_MAP: { default: `${POI_MAP_PREFIX}/fi/realtimeRentalVehicles/`, }, @@ -267,4 +264,24 @@ export default { value: 600, }, ], + navigation: true, + + ticketPurchaseLink: function purchaseTicketLink(fare, operatorCode) { + const fareId = fare.fareProducts[0].product.id; + const ticket = fareId?.substring + ? fareId.substring(fareId.indexOf(':') + 1) + : ''; + let zones = ''; + // Waltti wants zone ids, so map A to 01, B to 02 etc + for (let i = 0; i < ticket.length; i++) { + zones += `0${ticket.charCodeAt(i) - 64}`; // eslint-disable + } + return `https://waltti.fi/walttiapp/busTicket/?operator=${operatorCode}&ticketType=single&customerGroup=adult&zones=${zones}`; + }, + ticketButtonTextId: 'buy-in-app', + + analyticsScript: function createAnalyticsScript(hostname) { + // eslint-disable-next-line no-useless-escape + return `\n`; + })(window,document,'script','dataLayer','${config.GTMid}');\n`; + } + return ''; } const handleChange = () => { if (!window.CookieInformation) { diff --git a/app/util/browser.js b/app/util/browser.js index 32991a2fa0..2c492ae2b9 100644 --- a/app/util/browser.js +++ b/app/util/browser.js @@ -12,8 +12,6 @@ export const isWindowsPhone = isBrowser && navigator.userAgent.match(/Windows Phone/) != null; export const isLangMockEn = isBrowser && window.location.search.indexOf('enmock') !== -1; -export const isDebugTiles = - isBrowser && window.location.search.indexOf('debugTiles') !== -1; export const isMobile = isBrowser && navigator.userAgent.match(/Mobile/) != null; export const isFirefox = diff --git a/app/util/envUtils.js b/app/util/envUtils.js index 75eaf89b8e..40cc01f540 100644 --- a/app/util/envUtils.js +++ b/app/util/envUtils.js @@ -1,5 +1,3 @@ -/* eslint-disable import/prefer-default-export */ - /** Check if application is running in a dev environment. RUN_ENV is defined in kubernetes-deploy for dev instances. For running dev locally, NODE_ENV is checked * */ export const isDevelopmentEnvironment = config => { return ( diff --git a/app/util/fareUtils.js b/app/util/fareUtils.js index c5371e48db..3179b45686 100644 --- a/app/util/fareUtils.js +++ b/app/util/fareUtils.js @@ -119,6 +119,7 @@ export const shouldShowFarePurchaseInfo = (config, breakpoint, fares) => { !unknownFares && fares?.length === 1 && config.ticketPurchaseLink && + config.ticketLinkOperatorCode && breakpoint !== 'large' ); }; diff --git a/app/util/feedScopedIdUtils.js b/app/util/feedScopedIdUtils.js index 410d755561..b83f9eae17 100644 --- a/app/util/feedScopedIdUtils.js +++ b/app/util/feedScopedIdUtils.js @@ -1,5 +1,3 @@ -/* eslint-disable import/prefer-default-export */ - /** * Returns id without the feedId prefix. * @@ -14,3 +12,30 @@ export const getIdWithoutFeed = feedScopedId => { } return feedScopedId.split(':')[1]; }; + +/** + * Returns feedId without the objectId. + * + * @param {String} feedScopedId should be in feedId:objectId format. + */ +export const getFeedWithoutId = feedScopedId => { + if (!feedScopedId) { + return undefined; + } + if (feedScopedId.indexOf(':') === -1) { + return feedScopedId; + } + return feedScopedId.split(':')[0]; +}; + +/** + * Returns boolean indicating whether the feed is external or not. + */ +export const isExternalFeed = (feedId, config) => { + return ( + config !== undefined && + config.externalFeedIds !== undefined && + feedId !== undefined && + config.externalFeedIds.includes(feedId) + ); +}; diff --git a/app/util/filterUtils.js b/app/util/filterUtils.js index f8b4e71ef9..931da943d1 100644 --- a/app/util/filterUtils.js +++ b/app/util/filterUtils.js @@ -1,5 +1,3 @@ -/* eslint-disable import/prefer-default-export */ - /** * Filters object that contains objects so that only objects that have * a certain key with the correct value defined are returned. diff --git a/app/util/gtfs.js b/app/util/gtfs.js index 539ed4ced2..8796b34062 100644 --- a/app/util/gtfs.js +++ b/app/util/gtfs.js @@ -1,4 +1,3 @@ -/* eslint-disable import/prefer-default-export */ export const typeToName = { 0: 'tram', 1: 'subway', diff --git a/app/util/gtfsRtParser.js b/app/util/gtfsRtParser.js index 597378fc57..d4b71068eb 100644 --- a/app/util/gtfsRtParser.js +++ b/app/util/gtfsRtParser.js @@ -1,6 +1,6 @@ import ceil from 'lodash/ceil'; import Pbf from 'pbf'; -// eslint-disable-next-line import/prefer-default-export + export const parseFeedMQTT = (feedParser, data, topic) => { const pbf = new Pbf(data); const feed = feedParser(pbf); diff --git a/app/util/legUtils.js b/app/util/legUtils.js index 2f6a308bb0..a7758f7cbc 100644 --- a/app/util/legUtils.js +++ b/app/util/legUtils.js @@ -606,18 +606,30 @@ export const showBikeBoardingNote = (leg, config) => { ); }; +/** + * Determines whether a leg after walk leg contains rental vehicles + * @param {object} leg - The leg object + * @param {object} nextLeg - The Leg after the current leg + * @returns {boolean} + */ +export const isRental = (leg, nextLeg) => + leg.mode === 'WALK' && + (leg.to.vehicleRentalStation || + leg.to.vehicleRental || + nextLeg?.mode === 'SCOOTER'); + /** * Return translated string that describes leg destination * - * @param {object} intl - rect-intl context - * @param {object} leg - The leg object. - * @param {object} secondary - optional walk leg + * @param {object} intl - react-intl context + * @param {object} leg - leg object + * @param {object} secondary - optional second destination + * @param {object} nextLeg - optional leg after the current leg * @returns {string} */ -export const legDestination = (intl, leg, secondary) => { +export const legDestination = (intl, leg, secondary, nextLeg = null) => { const { to } = leg; let id = 'modes.to-place'; - if (leg.mode === 'BICYCLE' && to.vehicleParking) { id = 'modes.to-bike-park'; } else if (leg.mode === 'CAR' && to.vehicleParking) { @@ -627,5 +639,8 @@ export const legDestination = (intl, leg, secondary) => { if (mode) { id = `modes.to-${mode.toLowerCase()}`; } + if (isRental(leg, nextLeg)) { + id = 'modes.from-place'; + } return intl.formatMessage({ id, defaultMessage: 'place' }); }; diff --git a/app/util/modeUtils.js b/app/util/modeUtils.js index aee5f90a6e..768aabba92 100644 --- a/app/util/modeUtils.js +++ b/app/util/modeUtils.js @@ -7,6 +7,7 @@ import { isInBoundingBox } from './geo-utils'; import { addAnalyticsEvent } from './analyticsUtils'; import { ExtendedRouteTypes, TransportMode } from '../constants'; import { isDevelopmentEnvironment } from './envUtils'; +import { getFeedWithoutId, isExternalFeed } from './feedScopedIdUtils'; function seasonMs(ddmmyyyy) { const parts = ddmmyyyy.split('.'); @@ -113,7 +114,7 @@ export function getTransportModes(config) { }; } -export function getRouteMode(route) { +export function getRouteMode(route, config) { switch (route.type) { case ExtendedRouteTypes.BusExpress: return 'bus-express'; @@ -122,7 +123,9 @@ export function getRouteMode(route) { case ExtendedRouteTypes.SpeedTram: return 'speedtram'; default: - return route.mode?.toLowerCase(); + return isExternalFeed(getFeedWithoutId(route?.gtfsId), config) + ? `${route.mode?.toLowerCase()}-external` + : route.mode?.toLowerCase(); } } diff --git a/app/util/patternUtils.js b/app/util/patternUtils.js index db9cc42e06..bc26fd68ff 100644 --- a/app/util/patternUtils.js +++ b/app/util/patternUtils.js @@ -4,7 +4,6 @@ import moment from 'moment'; Return false if pattern doesn't have active dates information available or if current day is not found in active days * */ -// eslint-disable-next-line import/prefer-default-export export const isActiveDate = pattern => { if (!pattern || !pattern.activeDates) { return false; diff --git a/app/util/planParamUtil.js b/app/util/planParamUtil.js index 846d489f51..836df3e010 100644 --- a/app/util/planParamUtil.js +++ b/app/util/planParamUtil.js @@ -123,7 +123,7 @@ export function planQueryNeeded( { params: { from, to }, location: { - query: { intermediatePlaces }, + query: { intermediatePlaces, arriveBy, time }, }, }, planType, @@ -198,13 +198,20 @@ export function planQueryNeeded( case PLANTYPE.SCOOTERTRANSIT: /* special logic: relaxed scooter query is made only if no networks allowed */ + /* special logic: scooter queries are not made if the search is n minutes or more into the future or if arrival time is too late */ return ( config.transportModes.scooter.availableForSelection && transitModes.length > 0 && !wheelchair && (relaxSettings ? settings.scooterNetworks.length === 0 - : settings.scooterNetworks.length > 0) + : settings.scooterNetworks.length > 0) && + ((!arriveBy && + (time - Date.now() / 1000) / 60 < + config.vehicleRental.maxMinutesToRentalJourneyStart) || + (arriveBy && + (time - Date.now() / 1000) / 60 < + config.vehicleRental.maxMinutesToRentalJourneyEnd)) ); case PLANTYPE.PARKANDRIDE: return ( diff --git a/app/util/shapes.js b/app/util/shapes.js index c8d0fd1845..3c6cc3c61b 100644 --- a/app/util/shapes.js +++ b/app/util/shapes.js @@ -1,4 +1,3 @@ -/* eslint-disable import/prefer-default-export */ import PropTypes from 'prop-types'; import { PlannerMessageType } from '../constants'; diff --git a/app/util/vehicleRentalUtils.js b/app/util/vehicleRentalUtils.js index 3e6ec7cc5d..242489e5f9 100644 --- a/app/util/vehicleRentalUtils.js +++ b/app/util/vehicleRentalUtils.js @@ -131,33 +131,30 @@ const addAnalytics = (action, name) => { * Updates the list of allowed networks either by removing or adding. * Note: legacy settings had network names always in uppercase letters. * - * @param currentSettings the current settings - * @param newValue the network to be added/removed - * @param config The configuration for the software installation - * @param isUsingCitybike if citybike is enabled + * @param networks the previously selected networks + * @param networkName the network to be added/removed + * @param type the type of the network * @returns the updated citybike networks */ -export const updateVehicleNetworks = (currentSettings, newValue) => { - let chosenNetworks; +export const updateVehicleNetworks = (networks, networkName, type) => { + let updatedNetworks; + let toggleAction; - if (currentSettings) { - chosenNetworks = currentSettings.find( - o => o.toLowerCase() === newValue.toLowerCase(), - ) - ? without(currentSettings, newValue, newValue.toUpperCase()) - : currentSettings.concat([newValue]); + if (networks.find(o => o.toLowerCase() === networkName.toLowerCase())) { + updatedNetworks = without(networks, networkName, networkName.toUpperCase()); + toggleAction = 'Disable'; } else { - chosenNetworks = [newValue]; + updatedNetworks = networks.concat([networkName]); + toggleAction = 'Enable'; } - if (Array.isArray(currentSettings) && Array.isArray(chosenNetworks)) { - const action = `Settings${ - currentSettings.length > chosenNetworks.length ? 'Disable' : 'Enable' - }CityBikeNetwork`; - addAnalytics(action, newValue); - } - return chosenNetworks; + const action = `Settings${toggleAction}${ + type === 'citybike' ? 'CityBikeNetwork' : 'ScooterNetwork' + }`; + addAnalytics(action, networkName); + + return updatedNetworks; }; export const getVehicleMinZoomOnStopsNearYou = (config, override) => { @@ -184,11 +181,17 @@ export const hasVehicleRentalCode = rentalId => { }; export const mapVehicleRentalFromStore = vehicleRentalStation => { - const network = vehicleRentalStation.networks[0]; + const originalId = vehicleRentalStation.stationId; + const network = + vehicleRentalStation.networks?.[0] || originalId.split(':')[0]; + const stationId = originalId.startsWith(network) + ? originalId + : `${network}:${originalId}`; + const newStation = { ...vehicleRentalStation, network, - stationId: `${network}:${vehicleRentalStation.stationId}`, + stationId, }; delete newStation.networks; return newStation; diff --git a/build/generate-schema.js b/build/generate-schema.js index 2ccb4a3630..ae0153b6bc 100644 --- a/build/generate-schema.js +++ b/build/generate-schema.js @@ -4,7 +4,7 @@ const http = require('https'); const graphqlSchemaSource = process.env.SCHEMA_SRC || - 'https://raw.githubusercontent.com/HSLdevcom/OpenTripPlanner/dev-2.x/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls'; + 'https://raw.githubusercontent.com/HSLdevcom/OpenTripPlanner/dev-2.x/application/src/main/resources/org/opentripplanner/apis/gtfs/schema.graphqls'; const outputGraphQLFilename = 'schema.graphql'; const outputGraphQLFileCopy = `../digitransit-search-util/packages/digitransit-search-util-query-utils/schema/${outputGraphQLFilename}`; diff --git a/build/schema.graphql b/build/schema.graphql index 6e1195f590..28024656e2 100644 --- a/build/schema.graphql +++ b/build/schema.graphql @@ -670,6 +670,11 @@ type Leg { """ headsign: String """ + An identifier for the leg, which can be used to re-fetch transit leg information. + Re-fetching fails when the underlying transit data no longer exists. + """ + id: String + """ Interlines with previous leg. This is true when the same vehicle is used for the previous leg as for this leg and passenger can stay inside the vehicle. @@ -1166,6 +1171,11 @@ type QueryType { time: Int! ): Trip """ + Try refetching the current state of a transit leg using its id. + This fails when the underlying transit data (mostly IDs) has changed or are no longer available. + """ + leg(id: String!): Leg + """ Get all places (stops, stations, etc. with coordinates) within the specified radius from a location. The returned type is a Relay connection (see https://facebook.github.io/relay/graphql/connections.htm). The placeAtDistance @@ -1512,7 +1522,7 @@ type QueryType { walkSpeed: Float, "Whether the itinerary must be wheelchair accessible. Default value: false" wheelchair: Boolean - ): Plan @async + ): Plan @async @deprecated(reason : "Use `planConnection` instead.") """ Plan (itinerary) search that follows [GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm). @@ -1597,7 +1607,7 @@ type QueryType { number of itineraries in each search. """ searchWindow: Duration - ): PlanConnection @async @deprecated(reason : "Experimental and can include breaking changes, use plan instead") + ): PlanConnection @async "Get a single rental vehicle based on its ID, i.e. value of field `vehicleId`" rentalVehicle(id: String!): RentalVehicle "Get all rental vehicles" @@ -1620,9 +1630,17 @@ type QueryType { "Only return routes with these feedIds" feeds: [String], "Only return routes with these ids" - ids: [String], + ids: [String] @deprecated(reason : "Since it is hard to reason about the ID filter being combined with others in this resolver, it will be moved to a separate one."), "Query routes by this name" name: String, + """ + Only include routes whose pattern operates on at least one service date specified by this filter. + + **Note**: A service date is a technical term useful for transit planning purposes and might not + correspond to a how a passenger thinks of a calendar date. For example, a night bus running + on Sunday morning at 1am to 3am, might have the previous Saturday's service date. + """ + serviceDates: LocalDateRangeInput, "Only include routes, which use one of these modes" transportModes: [Mode] ): [Route] @@ -1847,7 +1865,16 @@ type Route implements Node { "Transport mode of this route, e.g. `BUS`" mode: TransitMode "List of patterns which operate on this route" - patterns: [Pattern] + patterns( + """ + Filter patterns by the service dates they operate on. + + **Note**: A service date is a technical term useful for transit planning purposes and might not + correspond to a how a passenger thinks of a calendar date. For example, a night bus running + on Sunday morning at 1am to 3am, might have the previous Saturday's service date. + """ + serviceDates: LocalDateRangeInput + ): [Pattern] "Short name of the route, usually a line number, e.g. 550" shortName: String """ @@ -1984,7 +2011,16 @@ type Stop implements Node & PlaceInterface { "Identifier of the platform, usually a number. This value is only present for stops that are part of a station" platformCode: String "Routes which pass through this stop" - routes: [Route!] + routes( + """ + Only include routes which are operational on at least one service date specified by this filter. + + **Note**: A service date is a technical term useful for transit planning purposes and might not + correspond to a how a passenger thinks of a calendar date. For example, a night bus running + on Sunday morning at 1am to 3am, might have the previous Saturday's service date. + """ + serviceDates: LocalDateRangeInput + ): [Route!] "Returns timetable of the specified pattern at this stop" stopTimesForPattern( "Id of the pattern" @@ -3045,6 +3081,12 @@ enum PlanAccessMode { """ BICYCLE_RENTAL """ + Driving to a stop and boarding a vehicle with the car. + Access can use driving only if the mode used for transfers + and egress is also `CAR`. + """ + CAR + """ Getting dropped off by a car to a location that is accessible with a car. Note, this can include walking after the drop-off. """ @@ -3154,6 +3196,11 @@ enum PlanEgressMode { """ BICYCLE_RENTAL """ + Driving from a stop to the destination. Egress can use driving only if the mode + used for access and transfers is also `CAR`. + """ + CAR + """ Getting picked up by a car from a location that is accessible with a car. Note, this can include walking before the pickup. """ @@ -3191,6 +3238,11 @@ enum PlanTransferMode { cycling if the mode used for access and egress is also `BICYCLE`. """ BICYCLE + """ + Driving between transit vehicles. Transfers can only use driving if the mode + used for access and egress is also `CAR`. + """ + CAR "Walking between transit vehicles (typically between stops)." WALK } @@ -3517,6 +3569,13 @@ scalar GeoJson @specifiedBy(url : "https://www.rfcreader.com/#rfc7946") scalar Grams +""" +An ISO-8601-formatted local date, i.e. `2024-05-24` for the 24th of May, 2024. + +ISO-8601 allows many different date formats, however only the most common one - `yyyy-MM-dd` - is accepted. +""" +scalar LocalDate @specifiedBy(url : "https://www.iso.org/standard/70907.html") + "A IETF BCP 47 language tag" scalar Locale @specifiedBy(url : "https://www.rfcreader.com/#rfc5646") @@ -3857,6 +3916,23 @@ input InputUnpreferred { useUnpreferredRoutesPenalty: Int @deprecated(reason : "Use unpreferredCost instead") } +"Filters an entity by a date range." +input LocalDateRangeInput { + """ + **Exclusive** end date of the filter. This means that if you want a time window from Sunday to + Sunday, `end` must be on Monday. + + If `null` this means that no end filter is applied and all entities that are after or on `start` + are selected. + """ + end: LocalDate + """ + **Inclusive** start date of the filter. If `null` this means that no `start` filter is applied and all + dates that are before `end` are selected. + """ + start: LocalDate +} + """ The filter definition to include or exclude parking facilities used during routing. diff --git a/digitransit-component/packages/digitransit-component-autosuggest-panel/README.md b/digitransit-component/packages/digitransit-component-autosuggest-panel/README.md index 1ad69aee98..1e36a6c4ad 100644 --- a/digitransit-component/packages/digitransit-component-autosuggest-panel/README.md +++ b/digitransit-component/packages/digitransit-component-autosuggest-panel/README.md @@ -73,7 +73,7 @@ const getAutoSuggestIcons: { return ['citybike-stop-digitransit', '#f2b62d']; } } -const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. all available options are Locations, Stops, Routes, VehicleRentalStation, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets. +const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. all available options are Locations, Stops, Stations, Routes, VehicleRentalStation, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets. const sources = ['Favourite', 'History', 'Datasource'] // Defines where you are searching. all available are: Favourite, History (previously searched searches), and Datasource. Leave empty to use all sources. { * } * const transportMode = undefined; * const placeholder = "stop-near-you"; - * const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. all available options are Locations, Stops, Routes, VehicleRentalStations, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets. + * const targets = ['Locations', 'Stops', 'Routes']; // Defines what you are searching. Options are Locations, Stops, Stations, Routes, VehicleRentalStations, FutureRoutes, MapPosition and CurrentPosition. Leave empty to search all targets. * const sources = ['Favourite', 'History', 'Datasource'] // Defines where you are searching. all available are: Favourite, History (previously searched searches) and Datasource. Leave empty to use all sources. * return ( * { - return filterMatchingToInput(stops, input, [ +function filterFavouriteStops(stopsAndStations, input, useStops, useStations) { + return stopsAndStations.then(stopsStations => { + const candidates = stopsStations.filter(s => + s.type === 'stop' ? useStops : useStations, + ); + return filterMatchingToInput(candidates, input, [ 'properties.name', 'properties.name', 'properties.address', @@ -229,9 +232,12 @@ const routeLayers = [ 'route-FERRY', 'route-SUBWAY', 'route-AIRPLANE', + 'route-FUNICULAR', ]; -const locationLayers = ['favouritePlace', 'venue', 'address', 'street']; +const locationLayers = ['venue', 'address', 'street']; const parkingLayers = ['carpark', 'bikepark']; +const stopLayers = ['stop', 'station']; + /** * Executes the search * @@ -323,16 +329,17 @@ export function getSearchResults( } if (allSources || sources.includes('Datasource')) { - const geocodingLayers = ['station', 'venue', 'address', 'street']; - const feedis = feedIDs.map(v => `gtfs${v}`); - const geosources = geocodingSources.concat(feedis).join(','); + const geocodingLayers = ['venue', 'address', 'street']; + if (targets.includes('Stations')) { + geocodingLayers.push('station'); // search stations from OSM + } searchComponents.push( getGeocodingResults( input, searchParams, language, focusPoint, - geosources, + geocodingSources.join(','), URL_PELIAS, minimalRegexp, geocodingLayers, @@ -341,18 +348,10 @@ export function getSearchResults( } if (allSources || sources.includes('History')) { const locationHistory = getOldSearches(context, 'endpoint'); - const dropLayers = [ - 'currentPosition', - 'selectFromMap', - 'futureRoute', - 'ownLocations', - 'vehicleRentalStation', - 'bikepark', - 'carpark', - 'stop', - 'back', - ]; + const dropLayers = ['bikestation']; + dropLayers.push(...stopLayers); dropLayers.push(...routeLayers); + dropLayers.push(...parkingLayers); searchComponents.push( filterOldSearches(locationHistory, input, dropLayers), ); @@ -386,25 +385,18 @@ export function getSearchResults( } if (allSources || sources.includes('History')) { const history = getOldSearches(context); - const dropLayers = [ - 'currentPosition', - 'selectFromMap', - 'futureRoute', - 'ownLocations', - 'favouritePlace', - 'bikestation', - 'vehicleRentalStation', - 'back', - 'stop', - 'station', - ]; + const dropLayers = ['bikestation']; + dropLayers.push(...stopLayers); dropLayers.push(...routeLayers); dropLayers.push(...locationLayers); searchComponents.push(filterOldSearches(history, input, dropLayers)); } } - if (allTargets || targets.includes('Stops')) { + const useStops = targets.includes('Stops'); + const useStations = targets.includes('Stations'); + + if (allTargets || useStops || useStations) { if (sources.includes('Favourite')) { const favouriteStops = getFavouriteStops(context); let stopsAndStations; @@ -430,10 +422,18 @@ export function getSearchResults( return results; }); } - searchComponents.push(filterFavouriteStops(stopsAndStations, input)); + searchComponents.push( + filterFavouriteStops(stopsAndStations, input, useStops, useStations), + ); } if (allSources || sources.includes('Datasource')) { - const geocodingLayers = ['stop', 'station']; + const geocodingLayers = []; + if (useStops) { + geocodingLayers.push('stop'); + } + if (useStations) { + geocodingLayers.push('station'); + } const searchParams = geocodingSize && geocodingSize !== 10 ? { size: geocodingSize } : {}; if (geocodingSearchParams && geocodingSearchParams['boundary.country']) { @@ -445,14 +445,14 @@ export function getSearchResults( if (allTargets || targets.includes('Locations')) { searchParams.dedupestops = 1; } - const feedis = feedIDs.map(v => `gtfs${v}`).join(','); + const feeds = feedIDs.map(v => `gtfs${v}`).join(','); searchComponents.push( getGeocodingResults( input, searchParams, language, focusPoint, - feedis, + feeds, URL_PELIAS, minimalRegexp, geocodingLayers, @@ -471,23 +471,17 @@ export function getSearchResults( } return true; }); - const dropLayers = [ - 'currentPosition', - 'selectFromMap', - 'futureRoute', - 'ownLocations', - 'favouritePlace', - 'vehicleRentalStation', - 'back', - ]; + const dropLayers = ['bikestation']; dropLayers.push(...routeLayers); dropLayers.push(...locationLayers); dropLayers.push(...parkingLayers); + if (!useStops) { + dropLayers.push('stop'); + } + if (!useStations) { + dropLayers.push('station'); + } if (transportMode) { - if (transportMode !== 'route-CITYBIKE') { - dropLayers.push('vehicleRentalStation'); - dropLayers.push('bikestation'); - } searchComponents.push( filterOldSearches(stopHistory, input, dropLayers).then(result => filterResults ? filterResults(result, mode) : result, @@ -500,7 +494,6 @@ export function getSearchResults( } } } - if (allTargets || targets.includes('Routes')) { if (sources.includes('Favourite')) { const favouriteRoutes = getFavouriteRoutes(context); @@ -518,26 +511,14 @@ export function getSearchResults( ); if (allSources || sources.includes('History')) { const routeHistory = getOldSearches(context); - const dropLayers = [ - 'currentPosition', - 'selectFromMap', - 'futureRoute', - 'favouritePlace', - 'stop', - 'station', - 'bikepark', - 'carpark', - 'ownLocations', - 'back', - ]; + const dropLayers = ['bikestation']; if (transportMode) { - if (transportMode !== 'route-CITYBIKE') { - dropLayers.push('vehicleRentalStation'); - dropLayers.push('bikestation'); - } dropLayers.push(...routeLayers.filter(i => !(i === transportMode))); } + dropLayers.push(...stopLayers); dropLayers.push(...locationLayers); + dropLayers.push(...parkingLayers); + searchComponents.push( filterOldSearches(routeHistory, input, dropLayers).then(results => filterResults ? filterResults(results, mode, 'Routes') : results, @@ -578,6 +559,15 @@ export function getSearchResults( }), ); } + if (allSources || sources.includes('History')) { + const history = getOldSearches(context); + const dropLayers = [...stopLayers]; + dropLayers.push(...routeLayers); + dropLayers.push(...locationLayers); + dropLayers.push(...parkingLayers); + + searchComponents.push(filterOldSearches(history, input, dropLayers)); + } } const searchResultsPromise = Promise.all(searchComponents) diff --git a/digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate/package.json b/digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate/package.json index 30bdbcb355..737f1e6445 100644 --- a/digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate/package.json +++ b/digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate/package.json @@ -1,6 +1,6 @@ { "name": "@digitransit-search-util/digitransit-search-util-execute-search-immidiate", - "version": "2.0.3", + "version": "3.0.1", "description": "digitransit-search-util execute-search-immidiate module", "main": "index.js", "publishConfig": { diff --git a/digitransit-search-util/packages/digitransit-search-util-get-json/package.json b/digitransit-search-util/packages/digitransit-search-util-get-json/package.json index a007c1ae88..b2ce27d1d6 100644 --- a/digitransit-search-util/packages/digitransit-search-util-get-json/package.json +++ b/digitransit-search-util/packages/digitransit-search-util-get-json/package.json @@ -22,6 +22,6 @@ "license": "(AGPL-3.0 OR EUPL-1.2)", "dependencies": { "@digitransit-search-util/digitransit-search-util-serialize": "0.0.2", - "axios": "1.6.7" + "axios": "1.7.7" } } diff --git a/digitransit-search-util/packages/digitransit-search-util-query-utils/schema/schema.graphql b/digitransit-search-util/packages/digitransit-search-util-query-utils/schema/schema.graphql index 6e1195f590..28024656e2 100644 --- a/digitransit-search-util/packages/digitransit-search-util-query-utils/schema/schema.graphql +++ b/digitransit-search-util/packages/digitransit-search-util-query-utils/schema/schema.graphql @@ -670,6 +670,11 @@ type Leg { """ headsign: String """ + An identifier for the leg, which can be used to re-fetch transit leg information. + Re-fetching fails when the underlying transit data no longer exists. + """ + id: String + """ Interlines with previous leg. This is true when the same vehicle is used for the previous leg as for this leg and passenger can stay inside the vehicle. @@ -1166,6 +1171,11 @@ type QueryType { time: Int! ): Trip """ + Try refetching the current state of a transit leg using its id. + This fails when the underlying transit data (mostly IDs) has changed or are no longer available. + """ + leg(id: String!): Leg + """ Get all places (stops, stations, etc. with coordinates) within the specified radius from a location. The returned type is a Relay connection (see https://facebook.github.io/relay/graphql/connections.htm). The placeAtDistance @@ -1512,7 +1522,7 @@ type QueryType { walkSpeed: Float, "Whether the itinerary must be wheelchair accessible. Default value: false" wheelchair: Boolean - ): Plan @async + ): Plan @async @deprecated(reason : "Use `planConnection` instead.") """ Plan (itinerary) search that follows [GraphQL Cursor Connections Specification](https://relay.dev/graphql/connections.htm). @@ -1597,7 +1607,7 @@ type QueryType { number of itineraries in each search. """ searchWindow: Duration - ): PlanConnection @async @deprecated(reason : "Experimental and can include breaking changes, use plan instead") + ): PlanConnection @async "Get a single rental vehicle based on its ID, i.e. value of field `vehicleId`" rentalVehicle(id: String!): RentalVehicle "Get all rental vehicles" @@ -1620,9 +1630,17 @@ type QueryType { "Only return routes with these feedIds" feeds: [String], "Only return routes with these ids" - ids: [String], + ids: [String] @deprecated(reason : "Since it is hard to reason about the ID filter being combined with others in this resolver, it will be moved to a separate one."), "Query routes by this name" name: String, + """ + Only include routes whose pattern operates on at least one service date specified by this filter. + + **Note**: A service date is a technical term useful for transit planning purposes and might not + correspond to a how a passenger thinks of a calendar date. For example, a night bus running + on Sunday morning at 1am to 3am, might have the previous Saturday's service date. + """ + serviceDates: LocalDateRangeInput, "Only include routes, which use one of these modes" transportModes: [Mode] ): [Route] @@ -1847,7 +1865,16 @@ type Route implements Node { "Transport mode of this route, e.g. `BUS`" mode: TransitMode "List of patterns which operate on this route" - patterns: [Pattern] + patterns( + """ + Filter patterns by the service dates they operate on. + + **Note**: A service date is a technical term useful for transit planning purposes and might not + correspond to a how a passenger thinks of a calendar date. For example, a night bus running + on Sunday morning at 1am to 3am, might have the previous Saturday's service date. + """ + serviceDates: LocalDateRangeInput + ): [Pattern] "Short name of the route, usually a line number, e.g. 550" shortName: String """ @@ -1984,7 +2011,16 @@ type Stop implements Node & PlaceInterface { "Identifier of the platform, usually a number. This value is only present for stops that are part of a station" platformCode: String "Routes which pass through this stop" - routes: [Route!] + routes( + """ + Only include routes which are operational on at least one service date specified by this filter. + + **Note**: A service date is a technical term useful for transit planning purposes and might not + correspond to a how a passenger thinks of a calendar date. For example, a night bus running + on Sunday morning at 1am to 3am, might have the previous Saturday's service date. + """ + serviceDates: LocalDateRangeInput + ): [Route!] "Returns timetable of the specified pattern at this stop" stopTimesForPattern( "Id of the pattern" @@ -3045,6 +3081,12 @@ enum PlanAccessMode { """ BICYCLE_RENTAL """ + Driving to a stop and boarding a vehicle with the car. + Access can use driving only if the mode used for transfers + and egress is also `CAR`. + """ + CAR + """ Getting dropped off by a car to a location that is accessible with a car. Note, this can include walking after the drop-off. """ @@ -3154,6 +3196,11 @@ enum PlanEgressMode { """ BICYCLE_RENTAL """ + Driving from a stop to the destination. Egress can use driving only if the mode + used for access and transfers is also `CAR`. + """ + CAR + """ Getting picked up by a car from a location that is accessible with a car. Note, this can include walking before the pickup. """ @@ -3191,6 +3238,11 @@ enum PlanTransferMode { cycling if the mode used for access and egress is also `BICYCLE`. """ BICYCLE + """ + Driving between transit vehicles. Transfers can only use driving if the mode + used for access and egress is also `CAR`. + """ + CAR "Walking between transit vehicles (typically between stops)." WALK } @@ -3517,6 +3569,13 @@ scalar GeoJson @specifiedBy(url : "https://www.rfcreader.com/#rfc7946") scalar Grams +""" +An ISO-8601-formatted local date, i.e. `2024-05-24` for the 24th of May, 2024. + +ISO-8601 allows many different date formats, however only the most common one - `yyyy-MM-dd` - is accepted. +""" +scalar LocalDate @specifiedBy(url : "https://www.iso.org/standard/70907.html") + "A IETF BCP 47 language tag" scalar Locale @specifiedBy(url : "https://www.rfcreader.com/#rfc5646") @@ -3857,6 +3916,23 @@ input InputUnpreferred { useUnpreferredRoutesPenalty: Int @deprecated(reason : "Use unpreferredCost instead") } +"Filters an entity by a date range." +input LocalDateRangeInput { + """ + **Exclusive** end date of the filter. This means that if you want a time window from Sunday to + Sunday, `end` must be on Monday. + + If `null` this means that no end filter is applied and all entities that are after or on `start` + are selected. + """ + end: LocalDate + """ + **Inclusive** start date of the filter. If `null` this means that no `start` filter is applied and all + dates that are before `end` are selected. + """ + start: LocalDate +} + """ The filter definition to include or exclude parking facilities used during routing. diff --git a/docs/Installation.md b/docs/Installation.md index 7b2f32f56f..31745130c6 100644 --- a/docs/Installation.md +++ b/docs/Installation.md @@ -14,12 +14,27 @@ You also need a C compiler: - OS X: Xcode 5.0 or later - Windows: for example MSVC 2013 Express +### WSL +To use Windows Subsystem for Linux in digitransit-ui development you may need to do at least the following +1. Add the following to your `/etc/hosts`. This is because the project uses ipv6 compliant `::1` instead of ipv4 style `0.0.0.0`: +``` +::1 ip6-localhost ip6-loopback localhost +``` +2. Add the following to your `/etc/wsl.conf` if not yet present. This prevents WSL from regenerating the `/etc/hosts` as well as the `/etc/resolv.conf`: +``` +[network] +generateResolvConf=false +generateHosts = false +``` + ## Install watchman ### Version A bit newer version of watchman is now required and 4.9.0 is no longer supported. -Version 20220320.140531.0, for example, works. +Working versions include at least +- 20220320.140531.0 +- 20240407.093313.0 ### OS X @@ -89,7 +104,7 @@ By default digitransit-ui uses services from https://dev-api.digitransit.fi but If you want to specify different URL (not just base URL) for individual services, you can define variables OTP_URL, MAP_URL and/or GEOCODING_BASE_URL (URL path before /search or /reverse). - `yarn run build` -- `GEOCODING_BASE_URL=https://api.digitransit.fi/geocoding/v1 OTP_URL=https://api.digitransit.fi/routing/v1/routers/finland/ yarn run start` +- `GEOCODING_BASE_URL=https://api.digitransit.fi/geocoding/v1 OTP_URL=https://api.digitransit.fi/routing/v2/finland/ yarn run start` ### Using Sentry to track client errors (optional) Sentry can be configured like so: diff --git a/package.json b/package.json index f3df387584..e9a383c981 100644 --- a/package.json +++ b/package.json @@ -133,6 +133,7 @@ "@babel/preset-env": "7.23.9", "@babel/preset-react": "7.23.3", "@babel/register": "7.23.7", + "@hsl-fi/button": "^1.2.4", "@hsl-fi/container-spinner": "0.3.2", "@hsl-fi/hooks": "1.2.4", "@hsl-fi/modal": " ^0.3.2", @@ -142,16 +143,16 @@ "@hsl-fi/site-header": "4.5.0", "@mapbox/sphericalmercator": "1.1.0", "@mapbox/vector-tile": "1.3.1", - "axios": "1.6.7", + "axios": "1.7.7", "babel-plugin-dynamic-import-node": "2.3.3", "babel-plugin-relay": "16.2.0", - "body-parser": "1.19.0", + "body-parser": "1.20.3", "classnames": "2.2.6", - "connect-redis": "7.1.1", + "connect-redis": "5.0.0", "cookie-parser": "1.4.5", "debug": "4.3.4", "esm": "3.2.25", - "express": "4.17.1", + "express": "4.20.0", "express-http-proxy": "1.6.2", "express-session": "1.18.0", "express-static-gzip": "2.0.8", @@ -204,7 +205,7 @@ "react-swipe": "6.0.4", "react-truncate-markup": "5.1.0", "recompose": "0.30.0", - "redis": "4.6.13", + "redis": "2.8.0", "relay-runtime": "16.2.0", "serialize-javascript": "4.0.0", "suncalc": "1.8.0", @@ -265,7 +266,7 @@ "eslint-plugin-react": "7.33.2", "eslint-plugin-react-hooks": "4.6.0", "favicons-webpack-plugin": "4.2.0", - "fetch-mock": "9.11.0", + "fetch-mock": "^12.0.2", "file-loader": "5.0.2", "git-precommit-checks": "3.0.0", "graphql": "16.8.1", @@ -293,7 +294,7 @@ "postcss-loader": "^4", "prettier": "3.1.1", "relay-compiler": "16.2.0", - "rollup": "2.35.1", + "rollup": "2.79.2", "rollup-plugin-babel": "4.4.0", "rollup-plugin-commonjs": "10.1.0", "rollup-plugin-peer-deps-external": "2.2.4", diff --git a/sass/_main.scss b/sass/_main.scss index 5c5f3534f5..dcf055ec56 100644 --- a/sass/_main.scss +++ b/sass/_main.scss @@ -12,6 +12,7 @@ $body-font-weight: $font-weight-medium; @import 'base/elements'; @import '~zurb-foundation-5/scss/foundation/components/grid'; @import 'base/helper-classes-after-foundations'; +@import 'base/spacing'; // Some of these files override sass variables Foundation uses, // so they must be loaded before the relevant foundation modules @@ -63,6 +64,7 @@ $body-font-weight: $font-weight-medium; @import '../app/component/itinerary/mobile-ticket-purchase-information'; @import 'base/button'; @import '../app/component/itinerary/navigator'; +@import '../app/component/itinerary/NavigatorIntro/navigator-intro'; /* Modal */ @import '~foundation-apps/scss/helpers/breakpoints'; diff --git a/sass/base/_helper-classes.scss b/sass/base/_helper-classes.scss index 740b9e66e5..ec34c58e18 100644 --- a/sass/base/_helper-classes.scss +++ b/sass/base/_helper-classes.scss @@ -44,6 +44,10 @@ color: $ferry-color; } +.ferry-external { + color: $external-feed-color; +} + .funicular { color: $funicular-color; } diff --git a/sass/base/_spacing.scss b/sass/base/_spacing.scss new file mode 100644 index 0000000000..9530e5b926 --- /dev/null +++ b/sass/base/_spacing.scss @@ -0,0 +1,32 @@ +$fixed-space-xxs: 4px; +$fixed-space-xs: 8px; +$fixed-space-s: 16px; +$fixed-space-m: 24px; +$fixed-space-l: 32px; +$fixed-space-xl: 48px; +$fixed-space-xxl: 64px; +$fixed-space-xxxl: 80px; + +:root { + --space-xxs: #{$fixed-space-xxs}; + --space-xs: #{$fixed-space-xs}; + --space-s: #{$fixed-space-s}; + --space-m: #{$fixed-space-m}; + --space-l: #{$fixed-space-l}; + --space-xl: #{$fixed-space-xl}; + --space-xxl: #{$fixed-space-xxl}; + --space-xxxl: #{$fixed-space-xxxl}; +} + +@media screen and (max-width: 900px) { + :root { + --space-xxs: #{$fixed-space-xxs}; + --space-xs: #{$fixed-space-xxs}; + --space-s: #{$fixed-space-xs}; + --space-m: #{$fixed-space-s}; + --space-l: #{$fixed-space-m}; + --space-xl: #{$fixed-space-l}; + --space-xxl: #{$fixed-space-xl}; + --space-xxxl: #{$fixed-space-xxl}; + } +} diff --git a/sass/themes/default/_theme.scss b/sass/themes/default/_theme.scss index 746ee791dd..4ebcc77e15 100644 --- a/sass/themes/default/_theme.scss +++ b/sass/themes/default/_theme.scss @@ -62,6 +62,9 @@ $caution-icon-color: $white; $caution-icon-font-color: none; $top-bar-color: $primary-color; $nav-content-color: false; +$disclaimer-background-color: rgba(254, 209, 0, 0.1); +$disclaimer-border-color: #fed100; +$link-color-accessible: $primary-color; /* Vehicle palette */ $airplane-color: $livi-airplane-blue; @@ -75,12 +78,15 @@ $ferry-color: $livi-ferry-blue; $funicular-color: $livi-funicular-pink; $citybike-color: #f2b62d; $citybike-off-color: #919191; -$walk-color: #666; +$walk-color: #000; $wait-color: #979797; $bicycle-color: #666; $car-color: #333; -$scooter-color: #bababa; +$scooter-color: #c5cad2; +$scooter-map-color: #666; $call-agency-color: #666; +$external-feed-color: #c5cad2; +$external-feed-map-color: #666; /* Fonts */ $font-family: 'Roboto', arial, georgia, serif; @@ -89,6 +95,7 @@ $button-font-family: $font-family; $font-weight-book: 400; $font-weight-medium: 700; $font-weight-map-container: $font-weight-book; +$font-weight-disclaimer: $font-weight-medium; $letter-spacing: 0; $letter-spacing-front-page: -0.67px; $font-family-narrow: 'Roboto Condensed', 'Arial Condensed', arial, georgia, @@ -121,6 +128,7 @@ $padding-xlarge: 2em; $border-radius-small: 2px; $border-radius: 3px; $border-radius-bigger: 8px; +$border-radius-disclaimer: $border-radius; $spinner-image: url('../default/default-spinner.png'); /* Navbar dimensions */ diff --git a/sass/themes/hameenlinna/_theme.scss b/sass/themes/hameenlinna/_theme.scss index 85c8574e42..8efa1a652d 100644 --- a/sass/themes/hameenlinna/_theme.scss +++ b/sass/themes/hameenlinna/_theme.scss @@ -1,7 +1,7 @@ @import '../../base/waltti'; /* main theme colors */ -$primary-color: #f76013; +$primary-color: rgb(196, 40, 31); $secondary-color: darken($primary-color, 20%); $hilight-color: $primary-color; $action-color: $primary-color; @@ -15,3 +15,6 @@ $desktop-title-color: $primary-color; $desktop-title-arrow-icon-color: $secondary-color; $link-color: $primary-color; $top-bar-color: $primary-color; + +/* Navbar dimensions */ +$nav-logo-height: 4em; diff --git a/sass/themes/hsl/_theme.scss b/sass/themes/hsl/_theme.scss index 8958549ea6..ef98062cee 100644 --- a/sass/themes/hsl/_theme.scss +++ b/sass/themes/hsl/_theme.scss @@ -13,6 +13,7 @@ $hsl-metro-orange: #ca4000; $hsl-bus-express: #ca4000; $hsl-rail-red: #8c4799; $hsl-ferry-blue: #007a97; +$hsl-blue-accessible: #0074bf; /* Application palette */ $primary-color: $hsl-blue; @@ -31,6 +32,9 @@ $link-color: $primary-color; $desktop-title-color: #007ac9; $desktop-title-arrow-icon-color: $secondary-color; $top-bar-color: $primary-color; +$disclaimer-background-color: #e5f2fa; +$disclaimer-border-color: #e5f2fa; +$link-color-accessible: $hsl-blue-accessible; /* Vehicle palette */ $airplane-color: #0046ad; @@ -56,3 +60,7 @@ $font-family-narrow: 'Gotham XNarrow SSm A', 'Gotham XNarrow SSm B', /* Spinner */ $spinner-image: url('hsl-spinner.png'); +$font-weight-disclaimer: 400 !important; + +/* Borders */ +$border-radius-disclaimer: 8px; diff --git a/sass/themes/varely/_theme.scss b/sass/themes/varely/_theme.scss index 853e8ce3d6..f3d155283c 100644 --- a/sass/themes/varely/_theme.scss +++ b/sass/themes/varely/_theme.scss @@ -12,7 +12,6 @@ $standalone-btn-color: $primary-color; $link-color: $primary-color; /* Component palette */ -$standalone-btn-color: #fff; $desktop-title-color: $primary-color; $desktop-title-arrow-icon-color: $white; $link-color: $primary-color; diff --git a/scripts/README.md b/scripts/README.md index 0613f70d9f..f40d37425c 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,16 +1,20 @@ # Using scripts -## Before using: +## Before using ``` source ui.sh ``` ## Usage examples -Using remote instance of OTP with subscription key. +Using remote instance of OTP with subscription key: ``` SUBSCRIPTION_KEY= ui hsl ``` -Using local instance of OTP on port `9080`. +Using local instance of OTP on port `9080`: +``` +SUBSCRIPTION_KEY= uiotp matka +``` +In case you do not need features usable with a subscription key when running a local instance of OTP on port `9080`: +``` +NO_SUBSCRIPTION_KEY=true uiotp matka ``` -uiotp matka -``` \ No newline at end of file diff --git a/scripts/ui.sh b/scripts/ui.sh index 3c1cd304ea..a2f0da62a1 100755 --- a/scripts/ui.sh +++ b/scripts/ui.sh @@ -1,17 +1,22 @@ #!/usr/bin/env bash ui () { + if [ "$SUBSCRIPTION_KEY" = "" -a "$NO_SUBSCRIPTION_KEY" != "true" ]; then + echo "In order to use the UI you need to set the SUBSCRIPTION_KEY environment variable." + echo "If you want to run the UI without a subscription key, set NO_SUBSCRIPTION_KEY=true." + return 1 2>/dev/null + fi CONFIG=$1 API_SUBSCRIPTION_QUERY_PARAMETER_NAME=digitransit-subscription-key API_SUBSCRIPTION_HEADER_NAME=digitransit-subscription-key API_SUBSCRIPTION_TOKEN=$SUBSCRIPTION_KEY yarn run dev } uiotp () { if [ "$1" = "hsl" ]; then - OTP_URL=http://localhost:9080/otp/routers/hsl/ ui hsl + OTP_URL=http://localhost:9080/otp/ ui hsl elif [ "$1" = "matka" ]; then - OTP_URL=http://localhost:9080/otp/routers/finland/ ui matka + OTP_URL=http://localhost:9080/otp/ ui matka elif [ "$1" = "kela" ]; then - OTP_URL=http://localhost:9080/otp/routers/kela/ ui kela + OTP_URL=http://localhost:9080/otp/ ui kela else - OTP_URL=http://localhost:9080/otp/routers/waltti/ ui $1 + OTP_URL=http://localhost:9080/otp/ ui $1 fi } diff --git a/server/passport-openid-connect/openidConnect.js b/server/passport-openid-connect/openidConnect.js index 16b86dbb05..df6dcd677e 100644 --- a/server/passport-openid-connect/openidConnect.js +++ b/server/passport-openid-connect/openidConnect.js @@ -4,7 +4,7 @@ const session = require('express-session'); const redis = require('redis'); const axios = require('axios'); const moment = require('moment'); -const RedisStore = require('connect-redis').default; +const RedisStore = require('connect-redis')(session); const LoginStrategy = require('./Strategy').Strategy; const clearAllUserSessions = false; // set true if logout should erase all user's sessions @@ -28,13 +28,13 @@ export default function setUpOIDC(app, port, indexPath, hostnames) { const RedisHost = process.env.REDIS_HOST || 'localhost'; const RedisPort = process.env.REDIS_PORT || 6379; - const RedisProtocol = process.env.REDIS_HOST ? 'rediss' : 'redis'; - const RedisURL = `${RedisProtocol}://${RedisHost}:${RedisPort}`; const RedisKey = process.env.REDIS_KEY; const RedisClient = RedisKey - ? redis.createClient({ url: RedisURL, password: RedisKey }) - : redis.createClient({ url: RedisURL }); - RedisClient.connect().catch(console.error); + ? redis.createClient(RedisPort, RedisHost, { + auth_pass: RedisKey, + tls: { servername: RedisHost }, + }) + : redis.createClient(RedisPort, RedisHost); const redirectUris = hostnames.map(host => `${host}${callbackPath}`); const postLogoutRedirectUris = hostnames.map( @@ -61,7 +61,7 @@ export default function setUpOIDC(app, port, indexPath, hostnames) { console.log(`adding session for used ${userId} id ${sessionId}`); } if (clearAllUserSessions) { - RedisClient.sAdd(`sessions-${userId}`, sessionId); + RedisClient.sadd(`sessions-${userId}`, sessionId); } }, }); @@ -125,6 +125,8 @@ export default function setUpOIDC(app, port, indexPath, hostnames) { session({ secret: process.env.SESSION_SECRET || 'reittiopas_secret', store: new RedisStore({ + host: RedisHost, + port: RedisPort, client: RedisClient, ttl: 60 * 60 * 24 * 60, }), @@ -204,7 +206,7 @@ export default function setUpOIDC(app, port, indexPath, hostnames) { } const sessions = `sessions-${req.session.userId}`; req.logout({}, () => { - RedisClient.sMembers(sessions).then(sessionIds => { + RedisClient.smembers(sessions, function (err, sessionIds) { req.session.destroy(function () { res.clearCookie('connect.sid'); if (sessionIds && sessionIds.length > 0) { diff --git a/server/server.js b/server/server.js index 5f1e18e3b8..ae2c0c5f98 100644 --- a/server/server.js +++ b/server/server.js @@ -261,12 +261,7 @@ function setUpAvailableTickets() { ? `?${config.API_SUBSCRIPTION_QUERY_PARAMETER_NAME}=${config.API_SUBSCRIPTION_TOKEN}` : ''; // try to fetch available ticketTypes every four seconds with 4 retries - retryFetch( - `${config.URL.OTP}index/graphql${queryParameters}`, - 4, - 4000, - options, - ) + retryFetch(`${config.URL.OTP}gtfs/v1${queryParameters}`, 4, 4000, options) .then(res => res.json()) .then( result => { @@ -286,7 +281,7 @@ function setUpAvailableTickets() { console.log('failed to load availableTickets at launch, retrying'); // Continue attempts to fetch available ticketTypes in the background for one day once every minute retryFetch( - `${config.URL.OTP}index/graphql${queryParameters}`, + `${config.URL.OTP}gtfs/v1${queryParameters}`, 1440, 60000, options, diff --git a/static/assets/geojson/hml_zone_lines_20230214.geojson b/static/assets/geojson/hml_zone_lines_20230214.geojson index 5e3f256219..48a5a807ac 100644 --- a/static/assets/geojson/hml_zone_lines_20230214.geojson +++ b/static/assets/geojson/hml_zone_lines_20230214.geojson @@ -1 +1 @@ -{"type":"FeatureCollection","generator":"JOSM","features":[{"type":"Feature","properties":{"Name":"A","icon":{"id":"hml-hml-icon-zone-a","svg":""}},"geometry":{"type":"Point","coordinates":[24.4575,60.9971]}},{"type":"Feature","properties":{"Name":"B","icon":{"id":"hml-icon-zone-b","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[24.276,61.0441],[24.6137,60.9243]]}},{"type":"Feature","properties":{"Name":"C","icon":{"id":"hml-icon-zone-c","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[24.0097,61.0241],[24.9588,61.1327],[24.5314,60.8211]]}},{"type":"Feature","properties":{"Name":"D","icon":{"id":"hml-icon-zone-d","svg":""}},"geometry":{"type":"Point","coordinates":[24.7224,60.7024]}},{"type":"Feature","properties":{"Name":"E","icon":{"id":"hml-icon-zone-e","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[25.1669,60.9758],[25.697,61.1711],[25.9003,60.8275]]}},{"type":"Feature","properties":{"Name":"F","icon":{"id":"hml-icon-zone-f","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[25.5157,61.0477],[25.8151,60.9024]]}},{"type":"Feature","properties":{"Name":"G","icon":{"id":"hml-icon-zone-g","svg":""}},"geometry":{"type":"Point","coordinates":[25.6421,60.9824]}},{"type":"Feature","properties":{"Id":"7"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.7145,60.7966],[24.7279,60.7957],[24.7344,60.7954],[24.7798,60.7839],[24.8153,60.7795],[24.8131,60.7766],[24.8283,60.7736],[24.8364,60.7761],[24.8221,60.7566],[24.8331,60.7573],[24.8403,60.7528],[24.8306,60.7492],[24.8447,60.7352],[24.829,60.7277],[24.8225,60.7192],[24.8277,60.7125],[24.8137,60.7091],[24.8039,60.702],[24.8156,60.6973],[24.8339,60.6818],[24.8351,60.6663],[24.8183,60.6685],[24.8095,60.6728],[24.7793,60.6539],[24.7642,60.6599],[24.7563,60.6545],[24.7493,60.6496],[24.7399,60.6475],[24.6913,60.6493],[24.6518,60.6602],[24.6391,60.6588],[24.6159,60.6676],[24.6134,60.6739],[24.6197,60.6844],[24.6056,60.6928],[24.6876,60.7256],[24.6907,60.7515]]}},{"type":"Feature","properties":{"Id":"3"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.6907,60.7515],[24.6706,60.773],[24.6531,60.7679],[24.6229,60.7797],[24.6237,60.756],[24.6026,60.7585],[24.5588,60.7641],[24.5595,60.765],[24.5574,60.7653],[24.5549,60.7648],[24.5531,60.7632],[24.5529,60.7635],[24.5512,60.7634],[24.5498,60.763],[24.5485,60.7603],[24.5471,60.7601],[24.545,60.7592],[24.5442,60.7576],[24.5413,60.7573],[24.5372,60.7573],[24.5345,60.7554],[24.5351,60.7551],[24.5383,60.7541],[24.5396,60.753],[24.5379,60.7522],[24.534,60.7527],[24.5322,60.7539],[24.5297,60.7537],[24.527,60.7523],[24.526,60.7508],[24.5233,60.7501],[24.5231,60.7488],[24.5216,60.7475],[24.5124,60.7502],[24.5039,60.754],[24.4908,60.7444],[24.4751,60.7472],[24.4359,60.7602],[24.4145,60.7565],[24.398,60.754],[24.3347,60.7946],[24.3114,60.7943],[24.2954,60.7983],[24.2793,60.7963],[24.2531,60.786],[24.2168,60.8125],[24.1755,60.8204],[24.1287,60.8192],[24.099,60.7963],[24.0922,60.7853],[24.0762,60.79],[24.0713,60.7911],[24.0706,60.792],[24.0632,60.7934],[24.0618,60.7969],[24.0396,60.8177],[24.0403,60.82],[24.0367,60.8204],[24.03,60.8231],[24.043,60.8254],[24.0447,60.8249],[24.0537,60.8303],[24.0596,60.8348],[23.9887,60.8794],[24.0216,60.9284],[23.9947,60.9359],[23.9867,60.9367],[23.9759,60.9404],[23.9635,60.9446],[23.9532,60.9463],[23.9667,60.9545],[23.9697,60.9553],[23.9709,60.9567],[23.9664,60.9572],[23.9586,60.9578],[23.9555,60.9571],[23.9478,60.9605],[23.9455,60.9604],[23.9433,60.9596],[23.942,60.9619],[23.9389,60.9639],[23.9361,60.9663],[23.9352,60.9662],[23.936,60.9637],[23.9409,60.9613],[23.9416,60.9597],[23.9064,60.9681],[23.8808,60.9737],[23.8794,60.9721],[23.8746,60.9737],[23.8658,60.9722],[23.8681,60.9715],[23.8658,60.9702],[23.8585,60.9726],[23.8563,60.9716],[23.8526,60.9804],[23.8247,60.9955],[23.815,61.0007],[23.8342,61.0026],[23.8338,61.01],[23.8358,61.0099],[23.8375,61.0092],[23.8358,61.0085],[23.8356,61.0074],[23.8377,61.0068],[23.8417,61.0072],[23.845,61.008],[23.8455,61.0095],[23.8464,61.0114],[23.8503,61.0128],[23.8547,61.0129],[23.8555,61.0117],[23.8574,61.012],[23.8585,61.0136],[23.862,61.0154],[23.8651,61.0149],[23.869,61.0167],[23.8681,61.0174],[23.871,61.018],[23.8742,61.0185],[23.876,61.0196],[23.878,61.0212],[23.8787,61.0224],[23.8745,61.0251],[23.8701,61.0285],[23.868,61.032],[23.8662,61.0373],[23.8214,61.0292],[23.7923,61.0249],[23.8047,61.036],[23.7956,61.0437],[23.8035,61.051],[23.7565,61.0574],[23.7864,61.0725],[23.7836,61.0735],[23.7842,61.0742],[23.7883,61.0734],[23.7975,61.0765],[23.8035,61.0793],[23.8253,61.0823],[23.8451,61.0744],[23.898,61.0853],[23.9078,61.0869],[23.9061,61.0884],[23.9085,61.0892],[23.9096,61.0883],[23.913,61.0892],[23.9139,61.0905],[23.9199,61.092],[23.9197,61.0904],[23.9239,61.0901],[23.9237,61.0881],[23.9213,61.0842],[23.9237,61.0837],[23.9253,61.085],[23.9258,61.088],[23.9258,61.0898],[23.9288,61.0895],[23.9283,61.0903],[23.9267,61.0911],[23.9246,61.0933],[23.935,61.0959],[23.9477,61.0993],[23.9572,61.1017],[23.9581,61.102],[24.0105,61.1155],[24.0261,61.1196],[24.0235,61.1208],[24.0256,61.1222],[24.0369,61.1248],[24.0411,61.1225],[24.0466,61.1244],[24.0516,61.1218],[24.0519,61.1204],[24.0621,61.1187],[24.0657,61.121],[24.0645,61.1221],[24.0643,61.123],[24.0894,61.1258],[24.11,61.1283],[24.1413,61.123],[24.1421,61.1247],[24.1439,61.1259],[24.1433,61.1274],[24.1439,61.129],[24.1413,61.1291],[24.1388,61.1314],[24.135,61.1328],[24.1337,61.1383],[24.1393,61.1434],[24.156,61.144],[24.1827,61.1451],[24.1941,61.1464],[24.2309,61.1501],[24.2353,61.1518],[24.297,61.1916],[24.2655,61.2087],[24.2578,61.2183],[24.2622,61.2227],[24.2656,61.2251],[24.2668,61.226],[24.2695,61.2256],[24.2731,61.229],[24.2686,61.2304],[24.2747,61.2348],[24.2768,61.2349],[24.2822,61.2405],[24.3018,61.2333],[24.3312,61.238],[24.3491,61.241],[24.3574,61.2422],[24.365,61.244],[24.3862,61.2496],[24.395,61.2478],[24.3994,61.2469],[24.4028,61.2536],[24.4117,61.2568],[24.4188,61.257],[24.4199,61.2549],[24.4179,61.2533],[24.4189,61.2529],[24.4201,61.2533],[24.4225,61.2549],[24.4259,61.2574],[24.43,61.2635],[24.4475,61.2698],[24.4554,61.2677],[24.4581,61.2681],[24.4651,61.2701],[24.4687,61.2723],[24.4757,61.2753],[24.4833,61.278],[24.4837,61.2791],[24.4857,61.279],[24.4925,61.2816],[24.5171,61.2898],[24.5264,61.2923],[24.5467,61.2973],[24.5545,61.299],[24.5605,61.3005],[24.5625,61.3001],[24.562,61.3009],[24.5628,61.3013],[24.5643,61.3007],[24.5647,61.3015],[24.5732,61.3037],[24.5791,61.3005],[24.5815,61.2983],[24.584,61.2976],[24.5851,61.2946],[24.5845,61.2929],[24.5869,61.2926],[24.5895,61.2882],[24.5946,61.2912],[24.6207,61.286],[24.6369,61.2825],[24.6376,61.2833],[24.6413,61.2825],[24.6406,61.2819],[24.6536,61.2793],[24.6661,61.2767],[24.6692,61.2776],[24.6704,61.2788],[24.6871,61.2798],[24.6913,61.2778],[24.7023,61.2726],[24.7083,61.2725],[24.7126,61.2761],[24.717,61.2794],[24.7168,61.283],[24.7181,61.2837],[24.7197,61.2987],[24.7318,61.3174],[24.7467,61.2979],[24.7564,61.286],[24.7706,61.2678],[24.8059,61.2727],[24.8122,61.2725],[24.8143,61.2735],[24.826,61.276],[24.8341,61.2754],[24.8416,61.2746],[24.8437,61.2755],[24.8448,61.2775],[24.8465,61.2785],[24.8914,61.2878],[24.8781,61.2979],[24.914,61.3246],[24.9172,61.3214],[24.9162,61.3164],[24.9156,61.3154],[24.9151,61.3143],[24.9153,61.314],[24.9214,61.3139],[24.921,61.3006],[24.921,61.286],[24.923,61.2831],[24.9263,61.2821],[24.9285,61.281],[24.931,61.2806],[24.9333,61.281],[24.9357,61.2834],[24.9408,61.2854],[24.9404,61.2869],[24.9442,61.2882],[24.9457,61.2896],[24.9474,61.2908],[24.9503,61.2896],[24.9546,61.2867],[24.9555,61.2834],[24.9594,61.281],[24.963,61.2811],[24.9648,61.2814],[24.9662,61.2784],[24.973,61.2762],[24.9766,61.2757],[24.982,61.2758],[24.988,61.2762],[24.9898,61.2777],[24.9999,61.2832],[25.0057,61.2862],[25.0118,61.2903],[25.0142,61.2908],[25.0141,61.2883],[25.0142,61.2853],[25.0126,61.2823],[25.0129,61.2787],[25.0161,61.2747],[25.029,61.2464],[25.0643,61.251],[25.0964,61.2558],[25.131,61.2515],[25.1674,61.2436],[25.1864,61.2402],[25.203,61.2411],[25.2008,61.2286],[25.1999,61.2219],[25.2066,61.2198],[25.2131,61.218],[25.2183,61.2141],[25.2233,61.2123],[25.2303,61.2073],[25.2344,61.2035],[25.2346,61.1994],[25.2405,61.1973],[25.2484,61.1952],[25.2558,61.1948],[25.2534,61.1924],[25.253,61.1895],[25.2604,61.1856],[25.2593,61.1821],[25.2554,61.1786],[25.2501,61.1763],[25.2508,61.175],[25.2535,61.1741],[25.2525,61.1727],[25.2538,61.1718],[25.2569,61.1716],[25.2551,61.1704],[25.2546,61.1693],[25.2555,61.168],[25.2545,61.167],[25.2577,61.1649],[25.2586,61.1628],[25.2619,61.161],[25.2698,61.1583],[25.2694,61.1569],[25.258,61.1595],[25.2561,61.1539],[25.2525,61.1479],[25.2466,61.1471],[25.2404,61.1448],[25.2361,61.1401],[25.246,61.1313],[25.2589,61.1284],[25.2545,61.1254],[25.2461,61.1242],[25.2444,61.1206],[25.2397,61.1146],[25.2262,61.1113],[25.2131,61.1036]]}},{"type":"Feature","properties":{"Id":"4"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.2131,61.1036],[25.2127,61.1034],[25.1981,61.0762],[25.1701,61.074],[25.1523,61.063],[25.057,61.0501],[25.0551,61.0484],[25.0532,61.0466],[25.0497,61.0434],[25.0452,61.0393],[25.0396,61.0343],[25.0344,61.0327],[25.0287,61.0309],[25.0454,61.0166],[25.0382,61.0118],[25.0351,61.0097],[25.0261,61.0043],[25.0274,60.9936],[25.0483,60.993],[25.0594,60.9859],[25.0403,60.9676],[25.0259,60.9617],[25.0075,60.9279],[25.0275,60.9278]]}},{"type":"Feature","properties":{"Id":"2"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.6924,60.9094],[24.6951,60.911],[24.6867,60.9439],[24.7246,61.0626],[24.7172,61.0743],[24.6907,61.0832],[24.5007,61.1023],[24.3369,61.1227],[24.2689,61.1061],[24.2501,61.0741],[24.203,61.0497],[24.2169,60.9935],[24.253,60.8937],[24.2695,60.8863],[24.3113,60.8894],[24.4562,60.8851],[24.603,60.8949],[24.6924,60.9094]]}},{"type":"Feature","properties":{"Id":"6"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.7145,60.7966],[24.7328,60.7765],[24.7495,60.7585],[24.6907,60.7515]]}},{"type":"Feature","properties":{"Id":"9"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.3255,60.9088],[25.3469,60.9001],[25.3699,60.8933],[25.3804,60.8899],[25.4033,60.8836],[25.4436,60.8751],[25.4785,60.8668],[25.5078,60.8524],[25.5283,60.8448],[25.5445,60.8388],[25.5661,60.8341],[25.5877,60.8304],[25.608,60.8285],[25.6456,60.8268],[25.6888,60.8261],[25.7354,60.8292],[25.7931,60.835],[25.8346,60.8415],[25.8799,60.8511],[25.9118,60.8611],[25.9573,60.8773],[25.991,60.8888],[26.0197,60.908],[26.0288,60.914],[26.0341,60.9199],[26.0367,60.9277],[26.0327,60.9444],[26.027,60.9553],[26.0132,60.9751],[25.9929,61.001],[25.9766,61.0209],[25.9569,61.039],[25.9131,61.0669],[25.8858,61.0839],[25.8658,61.0951],[25.8429,61.1028],[25.8144,61.1124],[25.7814,61.1206],[25.7388,61.128],[25.703,61.1317],[25.6624,61.1334],[25.6414,61.1332],[25.6035,61.1312],[25.5661,61.1269],[25.5198,61.1185],[25.491,61.1101],[25.4603,61.0993],[25.4326,61.0868],[25.4136,61.0798],[25.3934,61.0736],[25.3671,61.0654],[25.351,61.0593],[25.3309,61.0512],[25.2894,61.0319],[25.279,61.0269],[25.2685,61.0216],[25.2628,61.0182],[25.261,61.0152],[25.257,61.0078],[25.2614,60.9916],[25.2817,60.9605],[25.3031,60.9347],[25.3255,60.9088]]}},{"type":"Feature","properties":{"Id":"5"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.0275,60.9278],[25.0303,60.924],[25.0356,60.917],[25.0228,60.9148],[25.0229,60.9148],[25.0229,60.9147],[25.0229,60.9146],[25.0227,60.9146],[25.0226,60.9146],[25.0225,60.9145],[25.0225,60.9144],[25.0226,60.9143],[25.0227,60.9142],[25.0228,60.9142],[25.0228,60.9141],[25.023,60.914],[25.0231,60.914],[25.0232,60.914],[25.0235,60.9139],[25.0236,60.9139],[25.0237,60.9138],[25.0238,60.9137],[25.0239,60.9137],[25.0242,60.9136],[25.0246,60.9135],[25.0247,60.9135],[25.0248,60.9134],[25.025,60.9134],[25.0249,60.9133],[25.0247,60.9133],[25.0247,60.9132],[25.0247,60.9131],[25.0248,60.9129],[25.0249,60.9126],[25.0249,60.9125],[25.025,60.9122],[25.025,60.9119],[25.0248,60.9115],[25.0198,60.9117],[25.0199,60.9124],[25.0137,60.9126],[25.0135,60.9115],[25.0116,60.9109],[25.0059,60.9091],[24.9974,60.9065],[24.9914,60.9111],[24.9805,60.9077],[24.9927,60.8999],[24.9638,60.892],[24.9653,60.8864],[24.9525,60.8879],[24.9384,60.8898],[24.9361,60.891],[24.9347,60.8907],[24.9373,60.8885],[24.94,60.8877],[24.9389,60.886],[24.9386,60.8837],[24.9408,60.8825],[24.9427,60.8823],[24.9447,60.8805],[24.9456,60.8778],[24.9469,60.8721],[24.9525,60.8669],[24.9523,60.8647],[24.9507,60.8607],[24.9489,60.8613],[24.9446,60.8574],[24.9467,60.8575],[24.9475,60.8573],[24.9466,60.8535],[24.9428,60.8503],[24.9421,60.8484],[24.9421,60.8467],[24.9373,60.8471],[24.9347,60.8474],[24.9313,60.8456],[24.9313,60.8446],[24.9286,60.8444],[24.9263,60.8443],[24.9233,60.845],[24.9208,60.8459],[24.9167,60.8465],[24.9139,60.8464],[24.9137,60.8423],[24.9096,60.8406],[24.9073,60.8406],[24.9055,60.8409],[24.906,60.8393],[24.904,60.8392],[24.9019,60.8393],[24.9001,60.8388],[24.8914,60.8385],[24.8896,60.8396],[24.8882,60.8409],[24.8856,60.8422],[24.8838,60.8444],[24.8822,60.8457],[24.8801,60.8463],[24.8777,60.8472],[24.8769,60.8476],[24.8713,60.8485],[24.8664,60.8494],[24.8632,60.8502],[24.8603,60.8521],[24.8579,60.8524],[24.8556,60.8524],[24.8529,60.8532],[24.8521,60.8536],[24.8512,60.8555],[24.8483,60.8572],[24.8461,60.8582],[24.8441,60.8599],[24.8424,60.8607],[24.84,60.8601],[24.8408,60.8612],[24.8437,60.8614],[24.8439,60.8619],[24.8435,60.8628],[24.8436,60.8639],[24.8452,60.8642],[24.8465,60.8661],[24.8175,60.8678],[24.8095,60.8688],[24.8096,60.8552],[24.8086,60.8549],[24.8066,60.8528],[24.8056,60.8506],[24.8014,60.8487],[24.7962,60.8467],[24.7961,60.8444],[24.7975,60.8424],[24.7955,60.8412],[24.7952,60.8388],[24.7972,60.8362],[24.7953,60.8338],[24.793,60.8322],[24.7921,60.8319],[24.7903,60.8327],[24.7877,60.837],[24.7847,60.8391],[24.7328,60.836],[24.725,60.8168],[24.7197,60.8092],[24.7148,60.8042],[24.7127,60.7993],[24.7145,60.7966]]}},{"type":"Feature","properties":{"Id":"8"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.608,61.0111],[25.6006,61.0075],[25.5943,61.0035],[25.5884,60.9989],[25.5861,60.9954],[25.5831,60.99],[25.582,60.9848],[25.5823,60.9803],[25.5828,60.9775],[25.5832,60.975],[25.5867,60.9701],[25.5889,60.9676],[25.5908,60.9653],[25.5987,60.9561],[25.6057,60.9511],[25.618,60.9468],[25.6263,60.9451],[25.6426,60.9436],[25.6523,60.9433],[25.6594,60.9433],[25.6664,60.9438],[25.6778,60.9449],[25.6847,60.9464],[25.6909,60.9484],[25.697,60.9508],[25.7013,60.9535],[25.7099,60.9584],[25.7199,60.9646],[25.7271,60.972],[25.7307,60.9805],[25.7323,60.988],[25.7301,60.9937],[25.7257,61.0007],[25.7236,61.0029],[25.7147,61.0109],[25.7025,61.0138],[25.6867,61.0161],[25.668,61.0168],[25.6535,61.0174],[25.6448,61.017],[25.6355,61.0163],[25.6238,61.0145],[25.6159,61.013],[25.608,61.0111]]}},{"type":"Feature","properties":{"Id":"10"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.0275,60.9278],[25.0463,60.9277],[25.0938,60.919],[25.0975,60.905],[25.1224,60.8986],[25.1895,60.8905],[25.2249,60.882],[25.2457,60.8664],[25.251,60.8578],[25.2889,60.8328],[25.3574,60.8004],[25.4136,60.7792],[25.4333,60.7954],[25.4745,60.7927],[25.4973,60.7667],[25.6452,60.7706],[25.6666,60.771],[25.7256,60.772],[25.7809,60.7769],[25.8497,60.7865],[25.8739,60.7913],[25.9141,60.8048],[25.9528,60.8163],[25.982,60.8255],[26.099,60.856],[26.1395,60.867],[26.1658,60.9102],[26.177,60.928],[26.176,60.9464],[26.1438,61.0137],[26.1241,61.0755],[26.087,61.0977],[26.0645,61.1138],[25.9923,61.1482],[25.9641,61.1594],[25.9282,61.1709],[25.8678,61.1874],[25.8027,61.2007],[25.7498,61.2067],[25.6916,61.2099],[25.6419,61.2106],[25.589,61.2083],[25.5348,61.2039],[25.4869,61.1959],[25.461,61.1898],[25.4219,61.1778],[25.3644,61.1499],[25.3271,61.1326],[25.2909,61.1107],[25.2626,61.1066],[25.2131,61.1036]]}},{"type":"Feature","properties":{"Id":"1"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.5895,60.9742],[24.5937,60.9709],[24.5878,60.9619],[24.5843,60.9597],[24.5688,60.9568],[24.557,60.9545],[24.5463,60.9572],[24.541,60.9465],[24.5304,60.9412],[24.5207,60.9392],[24.4083,60.953],[24.3794,60.9642],[24.3535,60.9799],[24.3399,60.9984],[24.3731,61.0177],[24.3804,61.0284],[24.4132,61.0325],[24.4385,61.0373],[24.472,61.0422],[24.4781,61.0354],[24.5131,61.0413],[24.5736,61.0145],[24.5993,60.9794],[24.5895,60.9742]]}}]} \ No newline at end of file +{"type":"FeatureCollection","generator":"JOSM","features":[{"type":"Feature","properties":{"Name":"A","icon":{"id":"hml-hml-icon-zone-a","svg":""}},"geometry":{"type":"Point","coordinates":[24.4575,60.9971]}},{"type":"Feature","properties":{"Name":"B","icon":{"id":"hml-icon-zone-b","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[24.276,61.0441],[24.6137,60.9243]]}},{"type":"Feature","properties":{"Name":"C","icon":{"id":"hml-icon-zone-c","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[24.0097,61.0241],[24.9588,61.1327],[24.5314,60.8211]]}},{"type":"Feature","properties":{"Name":"D","icon":{"id":"hml-icon-zone-d","svg":""}},"geometry":{"type":"Point","coordinates":[24.7224,60.7024]}},{"type":"Feature","properties":{"Name":"E","icon":{"id":"hml-icon-zone-e","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[25.1669,60.9758],[25.697,61.1711],[25.9003,60.8275]]}},{"type":"Feature","properties":{"Name":"F","icon":{"id":"hml-icon-zone-f","svg":""}},"geometry":{"type":"MultiPoint","coordinates":[[25.5157,61.0477],[25.8151,60.9024]]}},{"type":"Feature","properties":{"Name":"G","icon":{"id":"hml-icon-zone-g","svg":""}},"geometry":{"type":"Point","coordinates":[25.6421,60.9824]}},{"type":"Feature","properties":{"Id":"7"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.7145,60.7966],[24.7279,60.7957],[24.7344,60.7954],[24.7798,60.7839],[24.8153,60.7795],[24.8131,60.7766],[24.8283,60.7736],[24.8364,60.7761],[24.8221,60.7566],[24.8331,60.7573],[24.8403,60.7528],[24.8306,60.7492],[24.8447,60.7352],[24.829,60.7277],[24.8225,60.7192],[24.8277,60.7125],[24.8137,60.7091],[24.8039,60.702],[24.8156,60.6973],[24.8339,60.6818],[24.8351,60.6663],[24.8183,60.6685],[24.8095,60.6728],[24.7793,60.6539],[24.7642,60.6599],[24.7563,60.6545],[24.7493,60.6496],[24.7399,60.6475],[24.6913,60.6493],[24.6518,60.6602],[24.6391,60.6588],[24.6159,60.6676],[24.6134,60.6739],[24.6197,60.6844],[24.6056,60.6928],[24.6876,60.7256],[24.6907,60.7515]]}},{"type":"Feature","properties":{"Id":"3"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.6907,60.7515],[24.6706,60.773],[24.6531,60.7679],[24.6229,60.7797],[24.6237,60.756],[24.6026,60.7585],[24.5588,60.7641],[24.5595,60.765],[24.5574,60.7653],[24.5549,60.7648],[24.5531,60.7632],[24.5529,60.7635],[24.5512,60.7634],[24.5498,60.763],[24.5485,60.7603],[24.5471,60.7601],[24.545,60.7592],[24.5442,60.7576],[24.5413,60.7573],[24.5372,60.7573],[24.5345,60.7554],[24.5351,60.7551],[24.5383,60.7541],[24.5396,60.753],[24.5379,60.7522],[24.534,60.7527],[24.5322,60.7539],[24.5297,60.7537],[24.527,60.7523],[24.526,60.7508],[24.5233,60.7501],[24.5231,60.7488],[24.5216,60.7475],[24.5124,60.7502],[24.5039,60.754],[24.4908,60.7444],[24.4751,60.7472],[24.4359,60.7602],[24.4145,60.7565],[24.398,60.754],[24.3347,60.7946],[24.3114,60.7943],[24.2954,60.7983],[24.2793,60.7963],[24.2531,60.786],[24.2168,60.8125],[24.1755,60.8204],[24.1287,60.8192],[24.099,60.7963],[24.0922,60.7853],[24.0762,60.79],[24.0713,60.7911],[24.0706,60.792],[24.0632,60.7934],[24.0618,60.7969],[24.0396,60.8177],[24.0403,60.82],[24.0367,60.8204],[24.03,60.8231],[24.043,60.8254],[24.0447,60.8249],[24.0537,60.8303],[24.0596,60.8348],[23.9887,60.8794],[24.0216,60.9284],[23.9947,60.9359],[23.9867,60.9367],[23.9759,60.9404],[23.9635,60.9446],[23.9532,60.9463],[23.9667,60.9545],[23.9697,60.9553],[23.9709,60.9567],[23.9664,60.9572],[23.9586,60.9578],[23.9555,60.9571],[23.9478,60.9605],[23.9455,60.9604],[23.9433,60.9596],[23.942,60.9619],[23.9389,60.9639],[23.9361,60.9663],[23.9352,60.9662],[23.936,60.9637],[23.9409,60.9613],[23.9416,60.9597],[23.9064,60.9681],[23.8808,60.9737],[23.8794,60.9721],[23.8746,60.9737],[23.8658,60.9722],[23.8681,60.9715],[23.8658,60.9702],[23.8585,60.9726],[23.8563,60.9716],[23.8526,60.9804],[23.8247,60.9955],[23.815,61.0007],[23.8342,61.0026],[23.8338,61.01],[23.8358,61.0099],[23.8375,61.0092],[23.8358,61.0085],[23.8356,61.0074],[23.8377,61.0068],[23.8417,61.0072],[23.845,61.008],[23.8455,61.0095],[23.8464,61.0114],[23.8503,61.0128],[23.8547,61.0129],[23.8555,61.0117],[23.8574,61.012],[23.8585,61.0136],[23.862,61.0154],[23.8651,61.0149],[23.869,61.0167],[23.8681,61.0174],[23.871,61.018],[23.8742,61.0185],[23.876,61.0196],[23.878,61.0212],[23.8787,61.0224],[23.8745,61.0251],[23.8701,61.0285],[23.868,61.032],[23.8662,61.0373],[23.8214,61.0292],[23.7923,61.0249],[23.8047,61.036],[23.7956,61.0437],[23.8035,61.051],[23.7565,61.0574],[23.7864,61.0725],[23.7836,61.0735],[23.7842,61.0742],[23.7883,61.0734],[23.7975,61.0765],[23.8035,61.0793],[23.8253,61.0823],[23.8451,61.0744],[23.898,61.0853],[23.9078,61.0869],[23.9061,61.0884],[23.9085,61.0892],[23.9096,61.0883],[23.913,61.0892],[23.9139,61.0905],[23.9199,61.092],[23.9197,61.0904],[23.9239,61.0901],[23.9237,61.0881],[23.9213,61.0842],[23.9237,61.0837],[23.9253,61.085],[23.9258,61.088],[23.9258,61.0898],[23.9288,61.0895],[23.9283,61.0903],[23.9267,61.0911],[23.9246,61.0933],[23.935,61.0959],[23.9477,61.0993],[23.9572,61.1017],[23.9581,61.102],[24.0105,61.1155],[24.0261,61.1196],[24.0235,61.1208],[24.0256,61.1222],[24.0369,61.1248],[24.0411,61.1225],[24.0466,61.1244],[24.0516,61.1218],[24.0519,61.1204],[24.0621,61.1187],[24.0657,61.121],[24.0645,61.1221],[24.0643,61.123],[24.0894,61.1258],[24.11,61.1283],[24.1413,61.123],[24.1421,61.1247],[24.1439,61.1259],[24.1433,61.1274],[24.1439,61.129],[24.1413,61.1291],[24.1388,61.1314],[24.135,61.1328],[24.1337,61.1383],[24.1393,61.1434],[24.156,61.144],[24.1827,61.1451],[24.1941,61.1464],[24.2309,61.1501],[24.2353,61.1518],[24.297,61.1916],[24.2655,61.2087],[24.2578,61.2183],[24.2622,61.2227],[24.2656,61.2251],[24.2668,61.226],[24.2695,61.2256],[24.2731,61.229],[24.2686,61.2304],[24.2747,61.2348],[24.2768,61.2349],[24.2822,61.2405],[24.3018,61.2333],[24.3312,61.238],[24.3491,61.241],[24.3574,61.2422],[24.365,61.244],[24.3862,61.2496],[24.395,61.2478],[24.3994,61.2469],[24.4028,61.2536],[24.4117,61.2568],[24.4188,61.257],[24.4199,61.2549],[24.4179,61.2533],[24.4189,61.2529],[24.4201,61.2533],[24.4225,61.2549],[24.4259,61.2574],[24.43,61.2635],[24.4475,61.2698],[24.4554,61.2677],[24.4581,61.2681],[24.4651,61.2701],[24.4687,61.2723],[24.4757,61.2753],[24.4833,61.278],[24.4837,61.2791],[24.4857,61.279],[24.4925,61.2816],[24.5171,61.2898],[24.5264,61.2923],[24.5467,61.2973],[24.5545,61.299],[24.5605,61.3005],[24.5625,61.3001],[24.562,61.3009],[24.5628,61.3013],[24.5643,61.3007],[24.5647,61.3015],[24.5732,61.3037],[24.5791,61.3005],[24.5815,61.2983],[24.584,61.2976],[24.5851,61.2946],[24.5845,61.2929],[24.5869,61.2926],[24.5895,61.2882],[24.5946,61.2912],[24.6207,61.286],[24.6369,61.2825],[24.6376,61.2833],[24.6413,61.2825],[24.6406,61.2819],[24.6536,61.2793],[24.6661,61.2767],[24.6692,61.2776],[24.6704,61.2788],[24.6871,61.2798],[24.6913,61.2778],[24.7023,61.2726],[24.7083,61.2725],[24.7126,61.2761],[24.717,61.2794],[24.7168,61.283],[24.7181,61.2837],[24.7197,61.2987],[24.7318,61.3174],[24.7467,61.2979],[24.7564,61.286],[24.7706,61.2678],[24.8059,61.2727],[24.8122,61.2725],[24.8143,61.2735],[24.826,61.276],[24.8341,61.2754],[24.8416,61.2746],[24.8437,61.2755],[24.8448,61.2775],[24.8465,61.2785],[24.8914,61.2878],[24.8781,61.2979],[24.914,61.3246],[24.9172,61.3214],[24.9162,61.3164],[24.9156,61.3154],[24.9151,61.3143],[24.9153,61.314],[24.9214,61.3139],[24.921,61.3006],[24.921,61.286],[24.923,61.2831],[24.9263,61.2821],[24.9285,61.281],[24.931,61.2806],[24.9333,61.281],[24.9357,61.2834],[24.9408,61.2854],[24.9404,61.2869],[24.9442,61.2882],[24.9457,61.2896],[24.9474,61.2908],[24.9503,61.2896],[24.9546,61.2867],[24.9555,61.2834],[24.9594,61.281],[24.963,61.2811],[24.9648,61.2814],[24.9662,61.2784],[24.973,61.2762],[24.9766,61.2757],[24.982,61.2758],[24.988,61.2762],[24.9898,61.2777],[24.9999,61.2832],[25.0057,61.2862],[25.0118,61.2903],[25.0142,61.2908],[25.0141,61.2883],[25.0142,61.2853],[25.0126,61.2823],[25.0129,61.2787],[25.0161,61.2747],[25.029,61.2464],[25.0643,61.251],[25.0964,61.2558],[25.131,61.2515],[25.1674,61.2436],[25.1864,61.2402],[25.203,61.2411],[25.2008,61.2286],[25.1999,61.2219],[25.2066,61.2198],[25.2131,61.218],[25.2183,61.2141],[25.2233,61.2123],[25.2303,61.2073],[25.2344,61.2035],[25.2346,61.1994],[25.2405,61.1973],[25.2484,61.1952],[25.2558,61.1948],[25.2534,61.1924],[25.253,61.1895],[25.2604,61.1856],[25.2593,61.1821],[25.2554,61.1786],[25.2501,61.1763],[25.2508,61.175],[25.2535,61.1741],[25.2525,61.1727],[25.2538,61.1718],[25.2569,61.1716],[25.2551,61.1704],[25.2546,61.1693],[25.2555,61.168],[25.2545,61.167],[25.2577,61.1649],[25.2586,61.1628],[25.2619,61.161],[25.2698,61.1583],[25.2694,61.1569],[25.258,61.1595],[25.2561,61.1539],[25.2525,61.1479],[25.2466,61.1471],[25.2404,61.1448],[25.2361,61.1401],[25.246,61.1313],[25.2589,61.1284],[25.2545,61.1254],[25.2461,61.1242],[25.2444,61.1206],[25.2397,61.1146],[25.2262,61.1113],[25.2131,61.1036]]}},{"type":"Feature","properties":{"Id":"4"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.2131,61.1036],[25.2127,61.1034],[25.1981,61.0762],[25.1701,61.074],[25.1523,61.063],[25.057,61.0501],[25.0551,61.0484],[25.0532,61.0466],[25.0497,61.0434],[25.0452,61.0393],[25.0396,61.0343],[25.0344,61.0327],[25.0287,61.0309],[25.0454,61.0166],[25.0382,61.0118],[25.0351,61.0097],[25.0261,61.0043],[25.0274,60.9936],[25.0483,60.993],[25.0594,60.9859],[25.0403,60.9676],[25.0259,60.9617],[25.0075,60.9279],[25.0275,60.9278]]}},{"type":"Feature","properties":{"Id":"2"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.6924,60.9094],[24.6951,60.911],[24.6867,60.9439],[24.7246,61.0626],[24.7172,61.0743],[24.6907,61.0832],[24.5007,61.1023],[24.3369,61.1227],[24.2689,61.1061],[24.2501,61.0741],[24.203,61.0497],[24.2169,60.9935],[24.253,60.8937],[24.2695,60.8863],[24.3113,60.8894],[24.4562,60.8851],[24.603,60.8949],[24.6924,60.9094]]}},{"type":"Feature","properties":{"Id":"6"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.7145,60.7966],[24.7328,60.7765],[24.7495,60.7585],[24.6907,60.7515]]}},{"type":"Feature","properties":{"Id":"9"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.3255,60.9088],[25.3469,60.9001],[25.3699,60.8933],[25.3804,60.8899],[25.4033,60.8836],[25.4436,60.8751],[25.4785,60.8668],[25.5078,60.8524],[25.5283,60.8448],[25.5445,60.8388],[25.5661,60.8341],[25.5877,60.8304],[25.608,60.8285],[25.6456,60.8268],[25.6888,60.8261],[25.7354,60.8292],[25.7931,60.835],[25.8346,60.8415],[25.8799,60.8511],[25.9118,60.8611],[25.9573,60.8773],[25.991,60.8888],[26.0197,60.908],[26.0288,60.914],[26.0341,60.9199],[26.0367,60.9277],[26.0327,60.9444],[26.027,60.9553],[26.0132,60.9751],[25.9929,61.001],[25.9766,61.0209],[25.9569,61.039],[25.9131,61.0669],[25.8858,61.0839],[25.8658,61.0951],[25.8429,61.1028],[25.8144,61.1124],[25.7814,61.1206],[25.7388,61.128],[25.703,61.1317],[25.6624,61.1334],[25.6414,61.1332],[25.6035,61.1312],[25.5661,61.1269],[25.5198,61.1185],[25.491,61.1101],[25.4603,61.0993],[25.4326,61.0868],[25.4136,61.0798],[25.3934,61.0736],[25.3671,61.0654],[25.351,61.0593],[25.3309,61.0512],[25.2894,61.0319],[25.279,61.0269],[25.2685,61.0216],[25.2628,61.0182],[25.261,61.0152],[25.257,61.0078],[25.2614,60.9916],[25.2817,60.9605],[25.3031,60.9347],[25.3255,60.9088]]}},{"type":"Feature","properties":{"Id":"5"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.0275,60.9278],[25.0303,60.924],[25.0356,60.917],[25.0228,60.9148],[25.0229,60.9148],[25.0229,60.9147],[25.0229,60.9146],[25.0227,60.9146],[25.0226,60.9146],[25.0225,60.9145],[25.0225,60.9144],[25.0226,60.9143],[25.0227,60.9142],[25.0228,60.9142],[25.0228,60.9141],[25.023,60.914],[25.0231,60.914],[25.0232,60.914],[25.0235,60.9139],[25.0236,60.9139],[25.0237,60.9138],[25.0238,60.9137],[25.0239,60.9137],[25.0242,60.9136],[25.0246,60.9135],[25.0247,60.9135],[25.0248,60.9134],[25.025,60.9134],[25.0249,60.9133],[25.0247,60.9133],[25.0247,60.9132],[25.0247,60.9131],[25.0248,60.9129],[25.0249,60.9126],[25.0249,60.9125],[25.025,60.9122],[25.025,60.9119],[25.0248,60.9115],[25.0198,60.9117],[25.0199,60.9124],[25.0137,60.9126],[25.0135,60.9115],[25.0116,60.9109],[25.0059,60.9091],[24.9974,60.9065],[24.9914,60.9111],[24.9805,60.9077],[24.9927,60.8999],[24.9638,60.892],[24.9653,60.8864],[24.9525,60.8879],[24.9384,60.8898],[24.9361,60.891],[24.9347,60.8907],[24.9373,60.8885],[24.94,60.8877],[24.9389,60.886],[24.9386,60.8837],[24.9408,60.8825],[24.9427,60.8823],[24.9447,60.8805],[24.9456,60.8778],[24.9469,60.8721],[24.9525,60.8669],[24.9523,60.8647],[24.9507,60.8607],[24.9489,60.8613],[24.9446,60.8574],[24.9467,60.8575],[24.9475,60.8573],[24.9466,60.8535],[24.9428,60.8503],[24.9421,60.8484],[24.9421,60.8467],[24.9373,60.8471],[24.9347,60.8474],[24.9313,60.8456],[24.9313,60.8446],[24.9286,60.8444],[24.9263,60.8443],[24.9233,60.845],[24.9208,60.8459],[24.9167,60.8465],[24.9139,60.8464],[24.9137,60.8423],[24.9096,60.8406],[24.9073,60.8406],[24.9055,60.8409],[24.906,60.8393],[24.904,60.8392],[24.9019,60.8393],[24.9001,60.8388],[24.8914,60.8385],[24.8896,60.8396],[24.8882,60.8409],[24.8856,60.8422],[24.8838,60.8444],[24.8822,60.8457],[24.8801,60.8463],[24.8777,60.8472],[24.8769,60.8476],[24.8713,60.8485],[24.8664,60.8494],[24.8632,60.8502],[24.8603,60.8521],[24.8579,60.8524],[24.8556,60.8524],[24.8529,60.8532],[24.8521,60.8536],[24.8512,60.8555],[24.8483,60.8572],[24.8461,60.8582],[24.8441,60.8599],[24.8424,60.8607],[24.84,60.8601],[24.8408,60.8612],[24.8437,60.8614],[24.8439,60.8619],[24.8435,60.8628],[24.8436,60.8639],[24.8452,60.8642],[24.8465,60.8661],[24.8175,60.8678],[24.8095,60.8688],[24.8096,60.8552],[24.8086,60.8549],[24.8066,60.8528],[24.8056,60.8506],[24.8014,60.8487],[24.7962,60.8467],[24.7961,60.8444],[24.7975,60.8424],[24.7955,60.8412],[24.7952,60.8388],[24.7972,60.8362],[24.7953,60.8338],[24.793,60.8322],[24.7921,60.8319],[24.7903,60.8327],[24.7877,60.837],[24.7847,60.8391],[24.7328,60.836],[24.725,60.8168],[24.7197,60.8092],[24.7148,60.8042],[24.7127,60.7993],[24.7145,60.7966]]}},{"type":"Feature","properties":{"Id":"8"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.608,61.0111],[25.6006,61.0075],[25.5943,61.0035],[25.5884,60.9989],[25.5861,60.9954],[25.5831,60.99],[25.582,60.9848],[25.5823,60.9803],[25.5828,60.9775],[25.5832,60.975],[25.5867,60.9701],[25.5889,60.9676],[25.5908,60.9653],[25.5987,60.9561],[25.6057,60.9511],[25.618,60.9468],[25.6263,60.9451],[25.6426,60.9436],[25.6523,60.9433],[25.6594,60.9433],[25.6664,60.9438],[25.6778,60.9449],[25.6847,60.9464],[25.6909,60.9484],[25.697,60.9508],[25.7013,60.9535],[25.7099,60.9584],[25.7199,60.9646],[25.7271,60.972],[25.7307,60.9805],[25.7323,60.988],[25.7301,60.9937],[25.7257,61.0007],[25.7236,61.0029],[25.7147,61.0109],[25.7025,61.0138],[25.6867,61.0161],[25.668,61.0168],[25.6535,61.0174],[25.6448,61.017],[25.6355,61.0163],[25.6238,61.0145],[25.6159,61.013],[25.608,61.0111]]}},{"type":"Feature","properties":{"Id":"10"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[25.0275,60.9278],[25.0463,60.9277],[25.0938,60.919],[25.0975,60.905],[25.1224,60.8986],[25.1895,60.8905],[25.2249,60.882],[25.2457,60.8664],[25.251,60.8578],[25.2889,60.8328],[25.3574,60.8004],[25.4136,60.7792],[25.4333,60.7954],[25.4745,60.7927],[25.4973,60.7667],[25.6452,60.7706],[25.6666,60.771],[25.7256,60.772],[25.7809,60.7769],[25.8497,60.7865],[25.8739,60.7913],[25.9141,60.8048],[25.9528,60.8163],[25.982,60.8255],[26.099,60.856],[26.1395,60.867],[26.1658,60.9102],[26.177,60.928],[26.176,60.9464],[26.1438,61.0137],[26.1241,61.0755],[26.087,61.0977],[26.0645,61.1138],[25.9923,61.1482],[25.9641,61.1594],[25.9282,61.1709],[25.8678,61.1874],[25.8027,61.2007],[25.7498,61.2067],[25.6916,61.2099],[25.6419,61.2106],[25.589,61.2083],[25.5348,61.2039],[25.4869,61.1959],[25.461,61.1898],[25.4219,61.1778],[25.3644,61.1499],[25.3271,61.1326],[25.2909,61.1107],[25.2626,61.1066],[25.2131,61.1036]]}},{"type":"Feature","properties":{"Id":"1"},"styles": [{"color": "#666","weight": 2,"opacity": 1},{"color": "#333","weight": 12,"opacity": 0.2}],"geometry":{"type":"LineString","coordinates":[[24.5895,60.9742],[24.5937,60.9709],[24.5878,60.9619],[24.5843,60.9597],[24.5688,60.9568],[24.557,60.9545],[24.5463,60.9572],[24.541,60.9465],[24.5304,60.9412],[24.5207,60.9392],[24.4083,60.953],[24.3794,60.9642],[24.3535,60.9799],[24.3399,60.9984],[24.3731,61.0177],[24.3804,61.0284],[24.4132,61.0325],[24.4385,61.0373],[24.472,61.0422],[24.4781,61.0354],[24.5131,61.0413],[24.5736,61.0145],[24.5993,60.9794],[24.5895,60.9742]]}}]} \ No newline at end of file diff --git a/static/assets/geojson/oulu_zone_lines_20230223.geojson b/static/assets/geojson/oulu_zone_lines_20230223.geojson deleted file mode 100644 index 92bdf602aa..0000000000 --- a/static/assets/geojson/oulu_zone_lines_20230223.geojson +++ /dev/null @@ -1,437 +0,0 @@ -{ - "type" : "FeatureCollection", - "name" : "Zone lines", - "features" : [ - { - "type" : "Feature", - "geometry" : { - "type" : "MultiLineString", - "coordinates" : [ - [ - [ 25.51554, 65.00542 ], - [ 25.49561, 65.00566 ], - [ 25.4818, 65.00914 ], - [ 25.47246, 65.00281 ], - [ 25.47111, 65.00184 ], - [ 25.46984, 64.99943 ], - [ 25.46982, 64.99852 ], - [ 25.46532, 64.99826 ], - [ 25.46636, 64.99203 ], - [ 25.45722, 64.99173 ], - [ 25.45625, 65.0008 ], - [ 25.447, 65.00337 ], - [ 25.46545, 65.01575 ], - [ 25.47719, 65.01274 ], - [ 25.48815, 65.01967 ], - [ 25.51561, 65.01963 ], - [ 25.51554, 65.00542 ] - ] - ] - }, - "properties" : { - "Zone" : "A" - }, - "styles": [ - { - "color": "#666", - "weight": 2, - "opacity": 1 - }, - { - "color": "#333", - "weight": 12, - "opacity": 0.2 - } - ] - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiLineString", - "coordinates" : [ - [ - [ 25.43364, 65.10678 ], - [ 25.44692, 65.10378 ], - [ 25.45545, 65.10318 ], - [ 25.46731, 65.10219 ], - [ 25.47916, 65.10079 ], - [ 25.49149, 65.09939 ], - [ 25.5114, 65.0974 ], - [ 25.54033, 65.0936 ], - [ 25.54934, 65.09081 ], - [ 25.57492, 65.08884 ], - [ 25.59458, 65.08413 ], - [ 25.61988, 65.07392 ], - [ 25.63907, 65.06617 ], - [ 25.65066, 65.05705 ], - [ 25.65561, 65.05316 ], - [ 25.65703, 65.04253 ], - [ 25.65733, 65.03665 ], - [ 25.68226, 65.0138 ], - [ 25.66103, 64.97528 ], - [ 25.65746, 64.96804 ], - [ 25.6471, 64.95993 ], - [ 25.62062, 64.95018 ], - [ 25.60354, 64.94261 ], - [ 25.60042, 64.94116 ], - [ 25.53781, 64.93933 ], - [ 25.53021, 64.93947 ], - [ 25.52013, 64.93947 ], - [ 25.51462, 64.94038 ], - [ 25.48227, 64.94365 ], - [ 25.44734, 64.94709 ], - [ 25.42269, 64.95834 ], - [ 25.38548, 64.97611 ], - [ 25.36039, 65.01502 ], - [ 25.36231, 65.05244 ], - [ 25.35495, 65.08677 ], - [ 25.39002, 65.10598 ], - [ 25.40235, 65.10817 ], - [ 25.41278, 65.10778 ], - [ 25.42369, 65.10678 ], - [ 25.43364, 65.10678 ] - ] - ] - }, - "properties" : { - "Zone" : "B" - }, - "styles": [ - { - "color": "#666", - "weight": 2, - "opacity": 1 - }, - { - "color": "#333", - "weight": 12, - "opacity": 0.2 - } - ] - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiLineString", - "coordinates" : [ - [ - [ 25.16761, 64.91963 ], - [ 25.23926, 64.90159 ], - [ 25.30701, 64.90234 ], - [ 25.30787, 64.90292 ], - [ 25.36762, 64.90272 ], - [ 25.36051, 64.89327 ], - [ 25.36785, 64.87838 ], - [ 25.38445, 64.87596 ], - [ 25.40389, 64.88462 ], - [ 25.44666, 64.88096 ], - [ 25.44846, 64.89206 ], - [ 25.45462, 64.88884 ], - [ 25.46695, 64.88743 ], - [ 25.47359, 64.8822 ], - [ 25.4807, 64.87757 ], - [ 25.48307, 64.86952 ], - [ 25.52338, 64.86609 ], - [ 25.54424, 64.85683 ], - [ 25.54803, 64.8532 ], - [ 25.5523, 64.84978 ], - [ 25.57885, 64.84413 ], - [ 25.58265, 64.84554 ], - [ 25.60588, 64.84313 ], - [ 25.6111, 64.84655 ], - [ 25.63382, 64.84306 ], - [ 25.649, 64.84532 ], - [ 25.72896, 64.90684 ], - [ 25.75766, 64.88426 ], - [ 25.8124, 64.89778 ], - [ 25.83144, 64.89063 ], - [ 25.86296, 64.90374 ], - [ 25.84971, 64.93688 ], - [ 25.87478, 64.95948 ], - [ 25.88367, 64.97984 ], - [ 25.89459, 65.01513 ], - [ 25.87154, 65.07126 ], - [ 25.84047, 65.09484 ], - [ 25.82257, 65.10758 ], - [ 25.81119, 65.12294 ], - [ 25.80502, 65.1355 ], - [ 25.79147, 65.14749 ], - [ 25.7763, 65.15093 ], - [ 25.71147, 65.15924 ], - [ 25.63925, 65.17417 ], - [ 25.62666, 65.17303 ], - [ 25.58234, 65.16372 ], - [ 25.48988, 65.16855 ], - [ 25.40876, 65.18469 ], - [ 25.40793, 65.19256 ], - [ 25.40548, 65.19944 ], - [ 25.39924, 65.20578 ], - [ 25.38279, 65.21102 ], - [ 25.36568, 65.2556 ], - [ 25.34379, 65.25606 ], - [ 25.33777, 65.23498 ], - [ 25.30217, 65.22748 ], - [ 25.25034, 65.21361 ], - [ 25.13893, 65.18786 ], - [ 25.0727, 65.16972 ] - ] - ] - }, - "properties" : { - "Zone" : "C" - }, - "styles": [ - { - "color": "#666", - "weight": 2, - "opacity": 1 - }, - { - "color": "#333", - "weight": 12, - "opacity": 0.2 - } - ] - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiLineString", - "coordinates" : [ - [ - [ 25.16761, 64.91963 ], - [ 25.09717, 64.9374 ], - [ 25.08711, 64.94619 ], - [ 25.07505, 64.95031 ], - [ 25.06441, 64.95801 ], - [ 25.06398, 64.98721 ], - [ 25.08256, 65.01499 ], - [ 25.13078, 65.05843 ], - [ 25.08389, 65.10859 ], - [ 25.06057, 65.13917 ], - [ 25.0727, 65.16972 ] - ], - [ - [ 25.0727, 65.16972 ], - [ 24.86341, 65.2643 ], - [ 25.18074, 65.36758 ], - [ 25.55096, 65.36987 ], - [ 25.59834, 65.33964 ], - [ 25.65927, 65.28825 ], - [ 25.69391, 65.28326 ], - [ 26.19367, 65.20071 ], - [ 26.27172, 65.13415 ], - [ 26.36475, 65.07011 ], - [ 26.37898, 64.92535 ], - [ 26.01732, 64.79914 ], - [ 25.77056, 64.74457 ], - [ 25.6097, 64.73526 ], - [ 25.41711, 64.75487 ], - [ 25.14846, 64.82569 ], - [ 25.13314, 64.8429 ], - [ 25.16761, 64.91963 ] - ], - [ - [ 26.50007, 64.85976 ], - [ 26.4853, 64.86789 ], - [ 26.46895, 64.86739 ], - [ 26.45897, 64.85179 ], - [ 26.42985, 64.8584 ], - [ 26.40791, 64.86501 ], - [ 26.39554, 64.84399 ], - [ 26.43304, 64.83144 ], - [ 26.44501, 64.82601 ], - [ 26.44381, 64.81022 ], - [ 26.46057, 64.77497 ], - [ 26.46795, 64.76425 ], - [ 26.45798, 64.7503 ], - [ 26.30668, 64.72283 ], - [ 26.3484, 64.70419 ], - [ 26.37496, 64.67014 ], - [ 26.38634, 64.65066 ], - [ 26.36358, 64.63116 ], - [ 26.31426, 64.64578 ], - [ 26.31426, 64.6149 ], - [ 26.35978, 64.59701 ], - [ 26.39392, 64.59538 ], - [ 26.45219, 64.62296 ], - [ 26.50326, 64.5908 ], - [ 26.45461, 64.56933 ], - [ 26.44703, 64.54978 ], - [ 26.26495, 64.46652 ], - [ 26.21943, 64.46161 ], - [ 25.93115, 64.55141 ], - [ 25.87046, 64.51879 ], - [ 25.80218, 64.55141 ], - [ 25.77942, 64.55141 ], - [ 25.74907, 64.51716 ], - [ 25.64286, 64.58073 ], - [ 25.60493, 64.60352 ], - [ 25.32872, 64.66875 ], - [ 25.16492, 64.73173 ], - [ 24.96388, 64.80127 ], - [ 24.95299, 64.81611 ], - [ 24.9925, 64.84534 ], - [ 24.9904, 64.86806 ], - [ 24.9973, 64.91029 ], - [ 24.9525, 64.90695 ], - [ 24.96198, 64.88795 ], - [ 24.93029, 64.88205 ], - [ 24.87698, 64.8854 ], - [ 24.84332, 64.88423 ], - [ 24.80594, 64.88915 ], - [ 24.52639, 64.88682 ], - [ 24.52909, 65.13691 ], - [ 24.53366, 65.21009 ], - [ 24.59363, 65.2664 ], - [ 24.65562, 65.32135 ], - [ 25.20285, 65.65626 ], - [ 26.17012, 65.82225 ], - [ 26.15481, 65.50275 ], - [ 26.17504, 65.50289 ], - [ 26.18028, 65.49901 ], - [ 26.15462, 65.49066 ], - [ 26.15335, 65.41907 ], - [ 26.40131, 65.37366 ], - [ 26.41269, 65.36162 ], - [ 26.42426, 65.34782 ], - [ 26.3913, 65.34948 ], - [ 26.38636, 65.33167 ], - [ 26.39953, 65.32517 ], - [ 26.37878, 65.31701 ], - [ 26.35684, 65.32018 ], - [ 26.28183, 65.27917 ], - [ 26.2559, 65.28334 ], - [ 26.23556, 65.27399 ], - [ 26.31934, 65.20046 ], - [ 26.46376, 65.15105 ], - [ 26.59901, 65.09752 ], - [ 26.62773, 65.09634 ], - [ 26.63132, 65.07348 ], - [ 26.62095, 65.05549 ], - [ 26.64048, 65.03843 ], - [ 26.65925, 65.01423 ], - [ 26.70593, 65.01322 ], - [ 26.71271, 65.00698 ], - [ 26.6804, 64.98928 ], - [ 26.69117, 64.97882 ], - [ 26.73785, 64.98978 ], - [ 26.76936, 64.96194 ], - [ 26.76617, 64.95231 ], - [ 26.67083, 64.90684 ], - [ 26.66324, 64.89236 ], - [ 26.63252, 64.89245 ], - [ 26.56031, 64.90667 ], - [ 26.51762, 64.84976 ], - [ 26.49488, 64.85179 ], - [ 26.50007, 64.85976 ] - ] - ] - }, - "properties" : { - "Zone" : "D" - }, - "styles": [ - { - "color": "#666", - "weight": 2, - "opacity": 1 - }, - { - "color": "#333", - "weight": 12, - "opacity": 0.2 - } - ] - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiPoint", - "coordinates" : [ - [ 25.39518, 65.02666 ], - [ 25.50007, 64.96569 ], - [ 25.48548, 65.05152 ], - [ 25.58994, 65.01164 ] - ] - }, - "properties" : { - "icon":{ - "id":"oulu-icon-zone-a", - "svg":"" - } - } - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiPoint", - "coordinates" : [ - [ 25.55729, 64.89643 ], - [ 25.49243, 65.14108 ], - [ 25.20924, 65.02839 ], - [ 25.81446, 65.03219 ] - ] - }, - "properties" : { - "icon":{ - "id":"oulu-icon-zone-b", - "svg":"" - } - } - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiPoint", - "coordinates" : [ - [ 25.51165, 65.27636 ], - [ 26.13439, 65.02676 ], - [ 25.61468, 64.79426 ] - ] - }, - "properties" : { - "icon":{ - "id":"oulu-icon-zone-c", - "svg":"" - } - } - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiPoint", - "coordinates" : [ - [ 25.97905, 64.6705 ], - [ 26.51844, 64.99121 ], - [ 26.08786, 65.3356 ], - [ 25.18226, 65.48508 ], - [ 24.79492, 65.10786 ] - ] - }, - "properties" : { - "icon":{ - "id":"oulu-icon-zone-d", - "svg":"" - - } - } - }, - { - "type" : "Feature", - "geometry" : { - "type" : "MultiPoint", - "coordinates" : [ - [ 25.46599, 65.00735 ] - ] - }, - "properties" : { - "icon":{ - "id":"oulu-icon-zone-l", - "svg":"" - } - - } - } - ] -} \ No newline at end of file diff --git a/static/assets/geojson/oulu_zone_lines_20241011.geojson b/static/assets/geojson/oulu_zone_lines_20241011.geojson new file mode 100644 index 0000000000..d790b57b82 --- /dev/null +++ b/static/assets/geojson/oulu_zone_lines_20241011.geojson @@ -0,0 +1,403 @@ +{ + "type": "FeatureCollection", + "name": "Zone lines", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "MultiLineString", + "coordinates": [ + [ + [ + 26.50007, + 64.85976 + ], + [ + 26.4853, + 64.86789 + ], + [ + 26.46895, + 64.86739 + ], + [ + 26.45897, + 64.85179 + ], + [ + 26.42985, + 64.8584 + ], + [ + 26.40791, + 64.86501 + ], + [ + 26.39554, + 64.84399 + ], + [ + 26.43304, + 64.83144 + ], + [ + 26.44501, + 64.82601 + ], + [ + 26.44381, + 64.81022 + ], + [ + 26.46057, + 64.77497 + ], + [ + 26.46795, + 64.76425 + ], + [ + 26.45798, + 64.7503 + ], + [ + 26.30668, + 64.72283 + ], + [ + 26.3484, + 64.70419 + ], + [ + 26.37496, + 64.67014 + ], + [ + 26.38634, + 64.65066 + ], + [ + 26.36358, + 64.63116 + ], + [ + 26.31426, + 64.64578 + ], + [ + 26.31426, + 64.6149 + ], + [ + 26.35978, + 64.59701 + ], + [ + 26.39392, + 64.59538 + ], + [ + 26.45219, + 64.62296 + ], + [ + 26.50326, + 64.5908 + ], + [ + 26.45461, + 64.56933 + ], + [ + 26.44703, + 64.54978 + ], + [ + 26.26495, + 64.46652 + ], + [ + 26.21943, + 64.46161 + ], + [ + 25.93115, + 64.55141 + ], + [ + 25.87046, + 64.51879 + ], + [ + 25.80218, + 64.55141 + ], + [ + 25.77942, + 64.55141 + ], + [ + 25.74907, + 64.51716 + ], + [ + 25.64286, + 64.58073 + ], + [ + 25.60493, + 64.60352 + ], + [ + 25.32872, + 64.66875 + ], + [ + 25.16492, + 64.73173 + ], + [ + 24.96388, + 64.80127 + ], + [ + 24.95299, + 64.81611 + ], + [ + 24.9925, + 64.84534 + ], + [ + 24.9904, + 64.86806 + ], + [ + 24.9973, + 64.91029 + ], + [ + 24.9525, + 64.90695 + ], + [ + 24.96198, + 64.88795 + ], + [ + 24.93029, + 64.88205 + ], + [ + 24.87698, + 64.8854 + ], + [ + 24.84332, + 64.88423 + ], + [ + 24.80594, + 64.88915 + ], + [ + 24.52639, + 64.88682 + ], + [ + 24.52909, + 65.13691 + ], + [ + 24.53366, + 65.21009 + ], + [ + 24.59363, + 65.2664 + ], + [ + 24.65562, + 65.32135 + ], + [ + 25.20285, + 65.65626 + ], + [ + 26.17012, + 65.82225 + ], + [ + 26.15481, + 65.50275 + ], + [ + 26.17504, + 65.50289 + ], + [ + 26.18028, + 65.49901 + ], + [ + 26.15462, + 65.49066 + ], + [ + 26.15335, + 65.41907 + ], + [ + 26.40131, + 65.37366 + ], + [ + 26.41269, + 65.36162 + ], + [ + 26.42426, + 65.34782 + ], + [ + 26.3913, + 65.34948 + ], + [ + 26.38636, + 65.33167 + ], + [ + 26.39953, + 65.32517 + ], + [ + 26.37878, + 65.31701 + ], + [ + 26.35684, + 65.32018 + ], + [ + 26.28183, + 65.27917 + ], + [ + 26.2559, + 65.28334 + ], + [ + 26.23556, + 65.27399 + ], + [ + 26.31934, + 65.20046 + ], + [ + 26.46376, + 65.15105 + ], + [ + 26.59901, + 65.09752 + ], + [ + 26.62773, + 65.09634 + ], + [ + 26.63132, + 65.07348 + ], + [ + 26.62095, + 65.05549 + ], + [ + 26.64048, + 65.03843 + ], + [ + 26.65925, + 65.01423 + ], + [ + 26.70593, + 65.01322 + ], + [ + 26.71271, + 65.00698 + ], + [ + 26.6804, + 64.98928 + ], + [ + 26.69117, + 64.97882 + ], + [ + 26.73785, + 64.98978 + ], + [ + 26.76936, + 64.96194 + ], + [ + 26.76617, + 64.95231 + ], + [ + 26.67083, + 64.90684 + ], + [ + 26.66324, + 64.89236 + ], + [ + 26.63252, + 64.89245 + ], + [ + 26.56031, + 64.90667 + ], + [ + 26.51762, + 64.84976 + ], + [ + 26.49488, + 64.85179 + ], + [ + 26.50007, + 64.85976 + ] + ] + ] + }, + "properties": { + "Zone": "Oulu" + }, + "styles": [ + { + "color": "#666", + "weight": 2, + "opacity": 1 + }, + { + "color": "#333", + "weight": 12, + "opacity": 0.2 + } + ] + } + ] +} \ No newline at end of file diff --git a/static/assets/svg-sprite.default.svg b/static/assets/svg-sprite.default.svg index 48df87502b..9ffdc699a9 100644 --- a/static/assets/svg-sprite.default.svg +++ b/static/assets/svg-sprite.default.svg @@ -864,8 +864,8 @@ - - + + - + @@ -1841,7 +1841,7 @@ - + @@ -2812,14 +2812,43 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/static/assets/svg-sprite.hsl.svg b/static/assets/svg-sprite.hsl.svg index 3bc295ea46..6be1983b93 100644 --- a/static/assets/svg-sprite.hsl.svg +++ b/static/assets/svg-sprite.hsl.svg @@ -100,6 +100,10 @@ + + + + @@ -167,7 +171,7 @@ - + @@ -835,8 +839,8 @@ - - + + - + @@ -2753,14 +2757,42 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/e2e/RoutePage.test.js b/test/e2e/RoutePage.test.js index aab53ab73b..57f2051cec 100644 --- a/test/e2e/RoutePage.test.js +++ b/test/e2e/RoutePage.test.js @@ -1,7 +1,5 @@ /* eslint-disable compat/compat */ /* eslint-disable no-undef */ -import RoutePageBatchMockData from './mock-data/RoutePageBatchQueryResponse.json'; -import RoutePageBatchTampereMockData from './mock-data/RoutePageBatchTampereResponse.json'; import RoutePageStopListMockData from './mock-data/RoutePageStopListQueryResponse.json'; import RoutePageStopListTampereMockData from './mock-data/RoutePageStopListTampereResponse.json'; import getConfig from './helpers/image-snapshot-config'; @@ -14,31 +12,7 @@ const platform = (process.env.MOBILE === 'true' && 'mobile') || 'desktop'; const isMobile = platform === 'mobile'; const mockRoutes = async page => { - await page.route('**/index/graphql/batch', async (route, request) => { - if (request.method() === 'POST') { - if (request.postData().includes('routeRoutes_RouteTitle_Query')) { - const mockData = - config === 'tampere' - ? RoutePageBatchTampereMockData - : RoutePageBatchMockData; - await route.fulfill({ - headers: { 'access-control-allow-origin': '*' }, - status: 200, - contentType: 'application/json', - body: JSON.stringify(mockData), - }); - } - if (request.postData().includes('FuzzyTripLinkQuery')) { - await route.fulfill({ - headers: { 'access-control-allow-origin': '*' }, - status: 200, - contentType: 'application/json', - body: JSON.stringify([]), - }); - } - } - }); - await page.route('**/index/graphql', async (route, request) => { + await page.route('**/gtfs/v1', async (route, request) => { if (request.method() === 'POST') { if ( request.postData().includes('RoutePatternSelect_similarRoutesQuery') diff --git a/test/e2e/StopPage.test.js b/test/e2e/StopPage.test.js index 840ef5a7ae..59e6fa71ea 100644 --- a/test/e2e/StopPage.test.js +++ b/test/e2e/StopPage.test.js @@ -1,7 +1,6 @@ /* eslint-disable compat/compat */ /* eslint-disable no-undef */ import StopPageMockData from './mock-data/StopPageContenQueryResponse.json'; -import StopPageBatchMockData from './mock-data/StopPageBatchQueryResponse.json'; import getConfig from './helpers/image-snapshot-config'; const config = process.env.CONFIG || 'hsl'; @@ -12,21 +11,7 @@ const platform = (process.env.MOBILE === 'true' && 'mobile') || 'desktop'; const isMobile = platform === 'mobile'; const mockRoutes = async page => { - await page.route('**/index/graphql/batch', async (route, request) => { - if (request.method() === 'POST') { - if ( - request.postData().includes('stopRoutes_StopPageHeaderContainer_Query') - ) { - await route.fulfill({ - headers: { 'access-control-allow-origin': '*' }, - status: 200, - contentType: 'application/json', - body: JSON.stringify(StopPageBatchMockData), - }); - } - } - }); - await page.route('**/index/graphql', async (route, request) => { + await page.route('**/gtfs/v1', async (route, request) => { if (request.method() === 'POST') { if (request.postData().includes('StopPageContentContainerQuery')) { await route.fulfill({ diff --git a/test/e2e/mock-data/RoutePageBatchQueryResponse.json b/test/e2e/mock-data/RoutePageBatchQueryResponse.json deleted file mode 100644 index 13193809fc..0000000000 --- a/test/e2e/mock-data/RoutePageBatchQueryResponse.json +++ /dev/null @@ -1,8923 +0,0 @@ -[ - { - "payload":{ - "data":{ - "route":{ - "gtfsId":"HSL:6181", - "shortName":"181", - "color":null, - "mode":"BUS", - "type":701, - "id":"Um91dGU6SFNMOjYxODE=" - } - } - }, - "id":"routeRoutes_RouteTitle_Query" - }, - { - "payload":{ - "data":{ - "route":{ - "shortName":"181", - "longName":"Kirkkonummi-Siuntio", - "id":"Um91dGU6SFNMOjYxODE=" - } - } - }, - "id":"routeRoutes_RoutePageMeta_Query" - }, - { - "payload":{ - "data":{ - "route":{ - "gtfsId":"HSL:6181", - "color":null, - "shortName":"181", - "longName":"Kirkkonummi-Siuntio", - "mode":"BUS", - "type":701, - "agency":{ - "name":"Helsingin seudun liikenne", - "url":"http://www.hsl.fi/", - "fareUrl":"http://www.hsl.fi/liput", - "id":"QWdlbmN5OkhTTDpIU0w=", - "phone":"(09) 4766 4444" - }, - "patterns":[ - { - "code":"HSL:6181:1:01", - "directionId":1, - "headsign":"Kirkkonummi", - "stops":[ - { - "name":"Siuntio matkahuolto", - "id":"U3RvcDpIU0w6NjMwMjAxMg==", - "gtfsId":"HSL:6302012", - "code":"So3094", - "alerts":[ - - ] - }, - { - "name":"Sudenkaari", - "id":"U3RvcDpIU0w6NjMwMjAxNg==", - "gtfsId":"HSL:6302016", - "code":"So3098", - "alerts":[ - - ] - }, - { - "name":"Billskogintie", - "id":"U3RvcDpIU0w6NjMwMjAwMQ==", - "gtfsId":"HSL:6302001", - "code":"So3083", - "alerts":[ - - ] - }, - { - "name":"Nordanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwMjAwOQ==", - "gtfsId":"HSL:6302009", - "code":"So3091", - "alerts":[ - - ] - }, - { - "name":"Degerbyntie", - "id":"U3RvcDpIU0w6NjMwMjAwNA==", - "gtfsId":"HSL:6302004", - "code":"So3086", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik", - "id":"U3RvcDpIU0w6NjMwMjAxOQ==", - "gtfsId":"HSL:6302019", - "code":"So3101", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwNDAwNw==", - "gtfsId":"HSL:6304007", - "code":"So3118", - "alerts":[ - - ] - }, - { - "name":"Kalliotie", - "id":"U3RvcDpIU0w6NjMwNDAwMg==", - "gtfsId":"HSL:6304002", - "code":"So3113", - "alerts":[ - - ] - }, - { - "name":"Sienitie", - "id":"U3RvcDpIU0w6NjMwNDAwNA==", - "gtfsId":"HSL:6304004", - "code":"So3115", - "alerts":[ - - ] - }, - { - "name":"Störsvik th", - "id":"U3RvcDpIU0w6NjMwNDAwNg==", - "gtfsId":"HSL:6304006", - "code":"So3117", - "alerts":[ - - ] - }, - { - "name":"Tallbacka", - "id":"U3RvcDpIU0w6NjMwNjAwNQ==", - "gtfsId":"HSL:6306005", - "code":"So3126", - "alerts":[ - - ] - }, - { - "name":"Kela", - "id":"U3RvcDpIU0w6NjMwNjAwMw==", - "gtfsId":"HSL:6306003", - "code":"So3124", - "alerts":[ - - ] - }, - { - "name":"Böle", - "id":"U3RvcDpIU0w6NjMwNjAwMA==", - "gtfsId":"HSL:6306000", - "code":"So3121", - "alerts":[ - - ] - }, - { - "name":"Bergträskinpolku", - "id":"U3RvcDpIU0w6NjA1MDIwOQ==", - "gtfsId":"HSL:6050209", - "code":"Ki0509", - "alerts":[ - - ] - }, - { - "name":"Granbackantie", - "id":"U3RvcDpIU0w6NjA1MDIxMQ==", - "gtfsId":"HSL:6050211", - "code":"Ki0511", - "alerts":[ - - ] - }, - { - "name":"Överby", - "id":"U3RvcDpIU0w6NjA1MDIxMw==", - "gtfsId":"HSL:6050213", - "code":"Ki0513", - "alerts":[ - - ] - }, - { - "name":"Karlbergintie", - "id":"U3RvcDpIU0w6NjA0MDIzNQ==", - "gtfsId":"HSL:6040235", - "code":"Ki0435", - "alerts":[ - - ] - }, - { - "name":"Lindalintie", - "id":"U3RvcDpIU0w6NjA0MDIzMQ==", - "gtfsId":"HSL:6040231", - "code":"Ki0431", - "alerts":[ - - ] - }, - { - "name":"Ravalsinkuja", - "id":"U3RvcDpIU0w6NjA0MDIzMw==", - "gtfsId":"HSL:6040233", - "code":"Ki0433", - "alerts":[ - - ] - }, - { - "name":"Kuusala", - "id":"U3RvcDpIU0w6NjA0MDIzNg==", - "gtfsId":"HSL:6040236", - "code":"Ki0436", - "alerts":[ - - ] - }, - { - "name":"Rajapolku", - "id":"U3RvcDpIU0w6NjA0MDIzOQ==", - "gtfsId":"HSL:6040239", - "code":"Ki0439", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3NQ==", - "gtfsId":"HSL:6040275", - "code":"Ki0475", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3Nw==", - "gtfsId":"HSL:6040277", - "code":"Ki0477", - "alerts":[ - - ] - }, - { - "name":"Kirkkotallintie", - "id":"U3RvcDpIU0w6NjA1MDI1MQ==", - "gtfsId":"HSL:6050251", - "code":"Ki0551", - "alerts":[ - - ] - }, - { - "name":"Kirkkonummi mk", - "id":"U3RvcDpIU0w6NjA0MDI5MQ==", - "gtfsId":"HSL:6040291", - "code":"Ki0491", - "alerts":[ - - ] - } - ], - "activeDates":[ - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18yXzA4MDU=" - } - ], - "tripsForDate":[ - { - "stoptimes":[ - { - "scheduledDeparture":25800, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25920, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25980, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26100, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26400, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26580, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26700, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26820, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27240, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27300, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27600, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27840, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":28080, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":28200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA3MTA=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":29100, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29220, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29280, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29340, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29400, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29460, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29700, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29880, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30000, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30120, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30240, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30540, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30600, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30900, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31140, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31380, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31500, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA4MDU=" - } - ], - "id":"UGF0dGVybjpIU0w6NjE4MToxOjAx", - "trips":[ - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25800, - "scheduledDeparture":25800, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25860, - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25860, - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25920, - "scheduledDeparture":25920, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25980, - "scheduledDeparture":25980, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26040, - "scheduledDeparture":26040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26100, - "scheduledDeparture":26100, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26160, - "scheduledDeparture":26160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26400, - "scheduledDeparture":26400, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26580, - "scheduledDeparture":26580, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26700, - "scheduledDeparture":26700, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26820, - "scheduledDeparture":26820, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26940, - "scheduledDeparture":26940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27240, - "scheduledDeparture":27240, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27300, - "scheduledDeparture":27300, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27480, - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27480, - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27600, - "scheduledDeparture":27600, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27720, - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27720, - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27840, - "scheduledDeparture":27840, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27960, - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27960, - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":28080, - "scheduledDeparture":28080, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":28200, - "scheduledDeparture":28200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA3MTA=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29100, - "scheduledDeparture":29100, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29160, - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29160, - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29220, - "scheduledDeparture":29220, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29280, - "scheduledDeparture":29280, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29340, - "scheduledDeparture":29340, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29400, - "scheduledDeparture":29400, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29460, - "scheduledDeparture":29460, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29700, - "scheduledDeparture":29700, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29880, - "scheduledDeparture":29880, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30000, - "scheduledDeparture":30000, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30120, - "scheduledDeparture":30120, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30240, - "scheduledDeparture":30240, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30540, - "scheduledDeparture":30540, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30600, - "scheduledDeparture":30600, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30780, - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30780, - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30900, - "scheduledDeparture":30900, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31020, - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31020, - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31140, - "scheduledDeparture":31140, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31260, - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31260, - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31380, - "scheduledDeparture":31380, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31500, - "scheduledDeparture":31500, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA4MDU=" - } - ] - }, - { - "code":"HSL:6181:0:01", - "directionId":0, - "headsign":"Siuntio", - "stops":[ - { - "name":"Kirkkonummi mk", - "id":"U3RvcDpIU0w6NjA0MDI5NQ==", - "gtfsId":"HSL:6040295", - "code":"Ki0495", - "alerts":[ - - ] - }, - { - "name":"Kirkkotallintie", - "id":"U3RvcDpIU0w6NjA1MDI1MA==", - "gtfsId":"HSL:6050250", - "code":"Ki0550", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3NQ==", - "gtfsId":"HSL:6040275", - "code":"Ki0475", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3Nw==", - "gtfsId":"HSL:6040277", - "code":"Ki0477", - "alerts":[ - - ] - }, - { - "name":"Rajapolku", - "id":"U3RvcDpIU0w6NjA0MDIzOA==", - "gtfsId":"HSL:6040238", - "code":"Ki0438", - "alerts":[ - - ] - }, - { - "name":"Kuusala", - "id":"U3RvcDpIU0w6NjA0MDIzNw==", - "gtfsId":"HSL:6040237", - "code":"Ki0437", - "alerts":[ - - ] - }, - { - "name":"Ravalsinkuja", - "id":"U3RvcDpIU0w6NjA0MDIzNA==", - "gtfsId":"HSL:6040234", - "code":"Ki0434", - "alerts":[ - - ] - }, - { - "name":"Lindalintie", - "id":"U3RvcDpIU0w6NjA1MDIxOQ==", - "gtfsId":"HSL:6050219", - "code":"Ki0519", - "alerts":[ - - ] - }, - { - "name":"Karlbergintie", - "id":"U3RvcDpIU0w6NjA1MDIxNQ==", - "gtfsId":"HSL:6050215", - "code":"Ki0515", - "alerts":[ - - ] - }, - { - "name":"Överby", - "id":"U3RvcDpIU0w6NjA1MDIxNA==", - "gtfsId":"HSL:6050214", - "code":"Ki0514", - "alerts":[ - - ] - }, - { - "name":"Granbackantie", - "id":"U3RvcDpIU0w6NjA1MDIxMg==", - "gtfsId":"HSL:6050212", - "code":"Ki0512", - "alerts":[ - - ] - }, - { - "name":"Bergträskinpolku", - "id":"U3RvcDpIU0w6NjA1MDIxMA==", - "gtfsId":"HSL:6050210", - "code":"Ki0510", - "alerts":[ - - ] - }, - { - "name":"Itäinen kuninkaantie", - "id":"U3RvcDpIU0w6NjA1MDIxNw==", - "gtfsId":"HSL:6050217", - "code":"Ki0517", - "alerts":[ - - ] - }, - { - "name":"Böle", - "id":"U3RvcDpIU0w6NjMwNjAwMQ==", - "gtfsId":"HSL:6306001", - "code":"So3122", - "alerts":[ - - ] - }, - { - "name":"Kela", - "id":"U3RvcDpIU0w6NjMwNjAwMg==", - "gtfsId":"HSL:6306002", - "code":"So3123", - "alerts":[ - - ] - }, - { - "name":"Tallbacka", - "id":"U3RvcDpIU0w6NjMwNjAwNA==", - "gtfsId":"HSL:6306004", - "code":"So3125", - "alerts":[ - - ] - }, - { - "name":"Pikkalan kartano", - "id":"U3RvcDpIU0w6NjMwNzAwNg==", - "gtfsId":"HSL:6307006", - "code":"So3133", - "alerts":[ - - ] - }, - { - "name":"Pikkala", - "id":"U3RvcDpIU0w6NjMwNzAwNQ==", - "gtfsId":"HSL:6307005", - "code":"So3132", - "alerts":[ - - ] - }, - { - "name":"Sienitie", - "id":"U3RvcDpIU0w6NjMwNDAwNA==", - "gtfsId":"HSL:6304004", - "code":"So3115", - "alerts":[ - - ] - }, - { - "name":"Störsvik th", - "id":"U3RvcDpIU0w6NjMwNDAwNQ==", - "gtfsId":"HSL:6304005", - "code":"So3116", - "alerts":[ - - ] - }, - { - "name":"Kalliotie", - "id":"U3RvcDpIU0w6NjMwNDAwMw==", - "gtfsId":"HSL:6304003", - "code":"So3114", - "alerts":[ - - ] - }, - { - "name":"Ruohosuontie", - "id":"U3RvcDpIU0w6NjMwNDAwOQ==", - "gtfsId":"HSL:6304009", - "code":"So3120", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwNDAwOA==", - "gtfsId":"HSL:6304008", - "code":"So3119", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik", - "id":"U3RvcDpIU0w6NjMwMjAxOA==", - "gtfsId":"HSL:6302018", - "code":"So3100", - "alerts":[ - - ] - }, - { - "name":"Degerbyntie", - "id":"U3RvcDpIU0w6NjMwMjAwNQ==", - "gtfsId":"HSL:6302005", - "code":"So3087", - "alerts":[ - - ] - }, - { - "name":"Nordanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwMjAwOA==", - "gtfsId":"HSL:6302008", - "code":"So3090", - "alerts":[ - - ] - }, - { - "name":"Billskogintie", - "id":"U3RvcDpIU0w6NjMwMjAwMA==", - "gtfsId":"HSL:6302000", - "code":"So3082", - "alerts":[ - - ] - }, - { - "name":"Sudenkaari", - "id":"U3RvcDpIU0w6NjMwMjAxNw==", - "gtfsId":"HSL:6302017", - "code":"So3099", - "alerts":[ - - ] - }, - { - "name":"Siuntio matkahuolto", - "id":"U3RvcDpIU0w6NjMwMjAxMg==", - "gtfsId":"HSL:6302012", - "code":"So3094", - "alerts":[ - - ] - } - ], - "activeDates":[ - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8xXzE0MDU=" - } - ], - "tripsForDate":[ - { - "stoptimes":[ - { - "scheduledDeparture":50700, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50760, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50880, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51000, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51120, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51180, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51360, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51480, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51540, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51660, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51840, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52200, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52440, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52560, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52620, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52680, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52800, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52980, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":53040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":53100, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":55800, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55980, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56100, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56220, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56280, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56460, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56580, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56640, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56760, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56880, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57300, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57540, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57660, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57720, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57900, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":58080, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":58140, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":58200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - } - ], - "id":"UGF0dGVybjpIU0w6NjE4MTowOjAx", - "trips":[ - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50700, - "scheduledDeparture":50700, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50760, - "scheduledDeparture":50760, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50820, - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50820, - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50880, - "scheduledDeparture":50880, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50940, - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50940, - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51000, - "scheduledDeparture":51000, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51060, - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51060, - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51120, - "scheduledDeparture":51120, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51180, - "scheduledDeparture":51180, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51360, - "scheduledDeparture":51360, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51480, - "scheduledDeparture":51480, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51540, - "scheduledDeparture":51540, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51660, - "scheduledDeparture":51660, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51780, - "scheduledDeparture":51780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51840, - "scheduledDeparture":51840, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52200, - "scheduledDeparture":52200, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52440, - "scheduledDeparture":52440, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52560, - "scheduledDeparture":52560, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52620, - "scheduledDeparture":52620, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52680, - "scheduledDeparture":52680, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52800, - "scheduledDeparture":52800, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52860, - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52860, - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52980, - "scheduledDeparture":52980, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53040, - "scheduledDeparture":53040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53100, - "scheduledDeparture":53100, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55800, - "scheduledDeparture":55800, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55860, - "scheduledDeparture":55860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55920, - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55920, - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55980, - "scheduledDeparture":55980, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56040, - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56040, - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56100, - "scheduledDeparture":56100, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56160, - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56160, - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56220, - "scheduledDeparture":56220, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56280, - "scheduledDeparture":56280, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56460, - "scheduledDeparture":56460, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56580, - "scheduledDeparture":56580, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56640, - "scheduledDeparture":56640, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56760, - "scheduledDeparture":56760, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56880, - "scheduledDeparture":56880, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56940, - "scheduledDeparture":56940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57300, - "scheduledDeparture":57300, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57540, - "scheduledDeparture":57540, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57660, - "scheduledDeparture":57660, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57720, - "scheduledDeparture":57720, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57780, - "scheduledDeparture":57780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57900, - "scheduledDeparture":57900, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57960, - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57960, - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":58080, - "scheduledDeparture":58080, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":58140, - "scheduledDeparture":58140, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":58200, - "scheduledDeparture":58200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - } - ] - } - ], - "alerts":[ - - ], - "id":"Um91dGU6SFNMOjYxODE=" - } - } - }, - "id":"routeRoutes_RoutePage_Query" - }, - { - "payload":{ - "data":{ - "pattern":{ - "code":"HSL:6181:0:01", - "directionId":0, - "headsign":"Siuntio", - "geometry":[ - { - "lat":60.119666, - "lon":24.441534 - }, - { - "lat":60.119735, - "lon":24.440639 - }, - { - "lat":60.119986, - "lon":24.440473 - }, - { - "lat":60.12001, - "lon":24.440729 - }, - { - "lat":60.120045, - "lon":24.440982 - }, - { - "lat":60.120089, - "lon":24.44127 - }, - { - "lat":60.120213, - "lon":24.441865 - }, - { - "lat":60.12023, - "lon":24.441991 - }, - { - "lat":60.120257, - "lon":24.441974 - }, - { - "lat":60.120311, - "lon":24.442011 - }, - { - "lat":60.120374, - "lon":24.441993 - }, - { - "lat":60.120401, - "lon":24.442012 - }, - { - "lat":60.120464, - "lon":24.441977 - }, - { - "lat":60.120743, - "lon":24.441783 - }, - { - "lat":60.120887, - "lon":24.441659 - }, - { - "lat":60.121031, - "lon":24.441535 - }, - { - "lat":60.121148, - "lon":24.441446 - }, - { - "lat":60.121328, - "lon":24.441215 - }, - { - "lat":60.121445, - "lon":24.441019 - }, - { - "lat":60.121563, - "lon":24.440822 - }, - { - "lat":60.121644, - "lon":24.440716 - }, - { - "lat":60.121662, - "lon":24.440716 - }, - { - "lat":60.121662, - "lon":24.440752 - }, - { - "lat":60.121688, - "lon":24.440788 - }, - { - "lat":60.121733, - "lon":24.440807 - }, - { - "lat":60.121778, - "lon":24.440771 - }, - { - "lat":60.121822, - "lon":24.44097 - }, - { - "lat":60.12184, - "lon":24.44106 - }, - { - "lat":60.121866, - "lon":24.44124 - }, - { - "lat":60.121884, - "lon":24.441366 - }, - { - "lat":60.121901, - "lon":24.44151 - }, - { - "lat":60.121919, - "lon":24.441601 - }, - { - "lat":60.121928, - "lon":24.441673 - }, - { - "lat":60.121892, - "lon":24.441672 - }, - { - "lat":60.121892, - "lon":24.441708 - }, - { - "lat":60.121874, - "lon":24.44169 - }, - { - "lat":60.121847, - "lon":24.441708 - }, - { - "lat":60.121784, - "lon":24.441815 - }, - { - "lat":60.121747, - "lon":24.44194 - }, - { - "lat":60.121747, - "lon":24.44203 - }, - { - "lat":60.121738, - "lon":24.442066 - }, - { - "lat":60.121747, - "lon":24.442156 - }, - { - "lat":60.1218, - "lon":24.442264 - }, - { - "lat":60.121872, - "lon":24.442337 - }, - { - "lat":60.121926, - "lon":24.442338 - }, - { - "lat":60.121997, - "lon":24.442285 - }, - { - "lat":60.122043, - "lon":24.442214 - }, - { - "lat":60.122052, - "lon":24.44198 - }, - { - "lat":60.122385, - "lon":24.441913 - }, - { - "lat":60.123346, - "lon":24.441638 - }, - { - "lat":60.123759, - "lon":24.441481 - }, - { - "lat":60.123867, - "lon":24.441465 - }, - { - "lat":60.124145, - "lon":24.441451 - }, - { - "lat":60.124837, - "lon":24.441244 - }, - { - "lat":60.125591, - "lon":24.441164 - }, - { - "lat":60.125744, - "lon":24.441166 - }, - { - "lat":60.126031, - "lon":24.441242 - }, - { - "lat":60.126371, - "lon":24.441391 - }, - { - "lat":60.12647, - "lon":24.441482 - }, - { - "lat":60.126693, - "lon":24.441755 - }, - { - "lat":60.126961, - "lon":24.442118 - }, - { - "lat":60.12739, - "lon":24.44288 - }, - { - "lat":60.128397, - "lon":24.4448 - }, - { - "lat":60.128924, - "lon":24.445707 - }, - { - "lat":60.129192, - "lon":24.44607 - }, - { - "lat":60.129317, - "lon":24.446252 - }, - { - "lat":60.1298, - "lon":24.446762 - }, - { - "lat":60.129925, - "lon":24.446854 - }, - { - "lat":60.129809, - "lon":24.446744 - }, - { - "lat":60.129666, - "lon":24.446617 - }, - { - "lat":60.129362, - "lon":24.446271 - }, - { - "lat":60.12911, - "lon":24.445899 - }, - { - "lat":60.128924, - "lon":24.445689 - }, - { - "lat":60.128451, - "lon":24.444891 - }, - { - "lat":60.127479, - "lon":24.443025 - }, - { - "lat":60.127229, - "lon":24.44259 - }, - { - "lat":60.126961, - "lon":24.442118 - }, - { - "lat":60.126702, - "lon":24.441755 - }, - { - "lat":60.12647, - "lon":24.441482 - }, - { - "lat":60.126371, - "lon":24.441391 - }, - { - "lat":60.126646, - "lon":24.439937 - }, - { - "lat":60.126729, - "lon":24.439219 - }, - { - "lat":60.126757, - "lon":24.438752 - }, - { - "lat":60.126733, - "lon":24.438068 - }, - { - "lat":60.126663, - "lon":24.437472 - }, - { - "lat":60.12661, - "lon":24.43722 - }, - { - "lat":60.125937, - "lon":24.434494 - }, - { - "lat":60.125786, - "lon":24.433845 - }, - { - "lat":60.125671, - "lon":24.433393 - }, - { - "lat":60.125547, - "lon":24.43287 - }, - { - "lat":60.125433, - "lon":24.432167 - }, - { - "lat":60.125399, - "lon":24.431483 - }, - { - "lat":60.125382, - "lon":24.431123 - }, - { - "lat":60.125423, - "lon":24.42963 - }, - { - "lat":60.125407, - "lon":24.429001 - }, - { - "lat":60.125381, - "lon":24.428659 - }, - { - "lat":60.125346, - "lon":24.428334 - }, - { - "lat":60.125328, - "lon":24.428208 - }, - { - "lat":60.12524, - "lon":24.427793 - }, - { - "lat":60.125142, - "lon":24.42745 - }, - { - "lat":60.124973, - "lon":24.426998 - }, - { - "lat":60.124866, - "lon":24.426745 - }, - { - "lat":60.124429, - "lon":24.426002 - }, - { - "lat":60.12409, - "lon":24.425332 - }, - { - "lat":60.123894, - "lon":24.424826 - }, - { - "lat":60.123725, - "lon":24.42423 - }, - { - "lat":60.12361, - "lon":24.423743 - }, - { - "lat":60.123513, - "lon":24.423238 - }, - { - "lat":60.123479, - "lon":24.42286 - }, - { - "lat":60.123408, - "lon":24.422391 - }, - { - "lat":60.123356, - "lon":24.422013 - }, - { - "lat":60.12332, - "lon":24.421778 - }, - { - "lat":60.123224, - "lon":24.421184 - }, - { - "lat":60.12318, - "lon":24.420859 - }, - { - "lat":60.123059, - "lon":24.419239 - }, - { - "lat":60.123034, - "lon":24.418771 - }, - { - "lat":60.122867, - "lon":24.417635 - }, - { - "lat":60.122752, - "lon":24.417094 - }, - { - "lat":60.122682, - "lon":24.416644 - }, - { - "lat":60.122647, - "lon":24.41623 - }, - { - "lat":60.122677, - "lon":24.415115 - }, - { - "lat":60.122661, - "lon":24.414557 - }, - { - "lat":60.122566, - "lon":24.413351 - }, - { - "lat":60.122568, - "lon":24.412775 - }, - { - "lat":60.122587, - "lon":24.412524 - }, - { - "lat":60.122669, - "lon":24.412021 - }, - { - "lat":60.123068, - "lon":24.410713 - }, - { - "lat":60.123267, - "lon":24.410158 - }, - { - "lat":60.123304, - "lon":24.410014 - }, - { - "lat":60.123394, - "lon":24.409818 - }, - { - "lat":60.123602, - "lon":24.409407 - }, - { - "lat":60.123828, - "lon":24.408959 - }, - { - "lat":60.123909, - "lon":24.408726 - }, - { - "lat":60.124, - "lon":24.408421 - }, - { - "lat":60.124091, - "lon":24.408063 - }, - { - "lat":60.124191, - "lon":24.407578 - }, - { - "lat":60.124228, - "lon":24.407309 - }, - { - "lat":60.124246, - "lon":24.407057 - }, - { - "lat":60.124229, - "lon":24.406805 - }, - { - "lat":60.124159, - "lon":24.406319 - }, - { - "lat":60.124018, - "lon":24.405561 - }, - { - "lat":60.123938, - "lon":24.405147 - }, - { - "lat":60.123903, - "lon":24.404894 - }, - { - "lat":60.123895, - "lon":24.404732 - }, - { - "lat":60.123895, - "lon":24.404571 - }, - { - "lat":60.123896, - "lon":24.404391 - }, - { - "lat":60.123878, - "lon":24.404211 - }, - { - "lat":60.123888, - "lon":24.403923 - }, - { - "lat":60.123908, - "lon":24.403168 - }, - { - "lat":60.123901, - "lon":24.402646 - }, - { - "lat":60.123867, - "lon":24.40216 - }, - { - "lat":60.123726, - "lon":24.401277 - }, - { - "lat":60.1237, - "lon":24.400845 - }, - { - "lat":60.123719, - "lon":24.400539 - }, - { - "lat":60.123901, - "lon":24.399768 - }, - { - "lat":60.123947, - "lon":24.399427 - }, - { - "lat":60.123966, - "lon":24.399013 - }, - { - "lat":60.123932, - "lon":24.398203 - }, - { - "lat":60.123872, - "lon":24.397591 - }, - { - "lat":60.123774, - "lon":24.397032 - }, - { - "lat":60.123721, - "lon":24.396834 - }, - { - "lat":60.123597, - "lon":24.396526 - }, - { - "lat":60.12349, - "lon":24.396291 - }, - { - "lat":60.123168, - "lon":24.395496 - }, - { - "lat":60.123106, - "lon":24.395153 - }, - { - "lat":60.122975, - "lon":24.393857 - }, - { - "lat":60.12287, - "lon":24.393082 - }, - { - "lat":60.122686, - "lon":24.391659 - }, - { - "lat":60.122678, - "lon":24.391191 - }, - { - "lat":60.122734, - "lon":24.3904 - }, - { - "lat":60.122727, - "lon":24.389969 - }, - { - "lat":60.122666, - "lon":24.389284 - }, - { - "lat":60.122604, - "lon":24.388834 - }, - { - "lat":60.122454, - "lon":24.388167 - }, - { - "lat":60.122241, - "lon":24.387391 - }, - { - "lat":60.122099, - "lon":24.386616 - }, - { - "lat":60.122064, - "lon":24.386255 - }, - { - "lat":60.121995, - "lon":24.385337 - }, - { - "lat":60.121944, - "lon":24.384599 - }, - { - "lat":60.121891, - "lon":24.384041 - }, - { - "lat":60.121529, - "lon":24.379144 - }, - { - "lat":60.121416, - "lon":24.377811 - }, - { - "lat":60.121293, - "lon":24.376964 - }, - { - "lat":60.121231, - "lon":24.37664 - }, - { - "lat":60.121142, - "lon":24.376225 - }, - { - "lat":60.121036, - "lon":24.375756 - }, - { - "lat":60.120849, - "lon":24.375161 - }, - { - "lat":60.120742, - "lon":24.374854 - }, - { - "lat":60.120279, - "lon":24.373733 - }, - { - "lat":60.120172, - "lon":24.373408 - }, - { - "lat":60.120145, - "lon":24.373246 - }, - { - "lat":60.120049, - "lon":24.372292 - }, - { - "lat":60.120014, - "lon":24.372094 - }, - { - "lat":60.119934, - "lon":24.371877 - }, - { - "lat":60.1198, - "lon":24.371677 - }, - { - "lat":60.119289, - "lon":24.371276 - }, - { - "lat":60.119084, - "lon":24.370968 - }, - { - "lat":60.118986, - "lon":24.370715 - }, - { - "lat":60.11895, - "lon":24.370535 - }, - { - "lat":60.118863, - "lon":24.36985 - }, - { - "lat":60.11882, - "lon":24.369077 - }, - { - "lat":60.118839, - "lon":24.368735 - }, - { - "lat":60.119085, - "lon":24.367443 - }, - { - "lat":60.119086, - "lon":24.367101 - }, - { - "lat":60.118997, - "lon":24.366705 - }, - { - "lat":60.118926, - "lon":24.366542 - }, - { - "lat":60.118594, - "lon":24.365927 - }, - { - "lat":60.118381, - "lon":24.365349 - }, - { - "lat":60.118238, - "lon":24.364808 - }, - { - "lat":60.118132, - "lon":24.364231 - }, - { - "lat":60.11801, - "lon":24.363222 - }, - { - "lat":60.117976, - "lon":24.362341 - }, - { - "lat":60.117855, - "lon":24.360685 - }, - { - "lat":60.11769, - "lon":24.358669 - }, - { - "lat":60.117646, - "lon":24.358255 - }, - { - "lat":60.117584, - "lon":24.358056 - }, - { - "lat":60.117451, - "lon":24.357605 - }, - { - "lat":60.116977, - "lon":24.356791 - }, - { - "lat":60.11678, - "lon":24.356555 - }, - { - "lat":60.116458, - "lon":24.356389 - }, - { - "lat":60.116315, - "lon":24.356172 - }, - { - "lat":60.116198, - "lon":24.355973 - }, - { - "lat":60.116091, - "lon":24.355738 - }, - { - "lat":60.116003, - "lon":24.355395 - }, - { - "lat":60.115994, - "lon":24.355215 - }, - { - "lat":60.116357, - "lon":24.353727 - }, - { - "lat":60.116439, - "lon":24.353404 - }, - { - "lat":60.11636, - "lon":24.35281 - }, - { - "lat":60.116163, - "lon":24.35243 - }, - { - "lat":60.115993, - "lon":24.35214 - }, - { - "lat":60.115725, - "lon":24.351832 - }, - { - "lat":60.114956, - "lon":24.350834 - }, - { - "lat":60.114696, - "lon":24.350472 - }, - { - "lat":60.114581, - "lon":24.349949 - }, - { - "lat":60.114378, - "lon":24.348742 - }, - { - "lat":60.114334, - "lon":24.34831 - }, - { - "lat":60.114391, - "lon":24.347322 - }, - { - "lat":60.114474, - "lon":24.346495 - }, - { - "lat":60.114493, - "lon":24.346064 - }, - { - "lat":60.114386, - "lon":24.345631 - }, - { - "lat":60.114217, - "lon":24.345162 - }, - { - "lat":60.114047, - "lon":24.344765 - }, - { - "lat":60.113815, - "lon":24.344313 - }, - { - "lat":60.113592, - "lon":24.343933 - }, - { - "lat":60.113467, - "lon":24.343805 - }, - { - "lat":60.113225, - "lon":24.343641 - }, - { - "lat":60.112929, - "lon":24.34344 - }, - { - "lat":60.11275, - "lon":24.343205 - }, - { - "lat":60.11259, - "lon":24.342807 - }, - { - "lat":60.112501, - "lon":24.342501 - }, - { - "lat":60.112466, - "lon":24.342177 - }, - { - "lat":60.112457, - "lon":24.341871 - }, - { - "lat":60.112503, - "lon":24.34144 - }, - { - "lat":60.112558, - "lon":24.340973 - }, - { - "lat":60.112686, - "lon":24.34011 - }, - { - "lat":60.112787, - "lon":24.339194 - }, - { - "lat":60.112888, - "lon":24.338476 - }, - { - "lat":60.112916, - "lon":24.337973 - }, - { - "lat":60.112934, - "lon":24.337649 - }, - { - "lat":60.112917, - "lon":24.337307 - }, - { - "lat":60.112882, - "lon":24.336749 - }, - { - "lat":60.112848, - "lon":24.336354 - }, - { - "lat":60.112777, - "lon":24.335903 - }, - { - "lat":60.112653, - "lon":24.335327 - }, - { - "lat":60.1126, - "lon":24.334841 - }, - { - "lat":60.11252, - "lon":24.334462 - }, - { - "lat":60.112467, - "lon":24.334228 - }, - { - "lat":60.112387, - "lon":24.333993 - }, - { - "lat":60.112307, - "lon":24.333669 - }, - { - "lat":60.11229, - "lon":24.333471 - }, - { - "lat":60.112281, - "lon":24.333273 - }, - { - "lat":60.112273, - "lon":24.333039 - }, - { - "lat":60.112282, - "lon":24.332805 - }, - { - "lat":60.11231, - "lon":24.332536 - }, - { - "lat":60.112364, - "lon":24.332321 - }, - { - "lat":60.112455, - "lon":24.332052 - }, - { - "lat":60.112599, - "lon":24.331802 - }, - { - "lat":60.11268, - "lon":24.331587 - }, - { - "lat":60.112753, - "lon":24.3313 - }, - { - "lat":60.112807, - "lon":24.331103 - }, - { - "lat":60.112727, - "lon":24.33076 - }, - { - "lat":60.112647, - "lon":24.330454 - }, - { - "lat":60.112603, - "lon":24.330165 - }, - { - "lat":60.112568, - "lon":24.329931 - }, - { - "lat":60.112578, - "lon":24.329608 - }, - { - "lat":60.112614, - "lon":24.329356 - }, - { - "lat":60.112686, - "lon":24.329123 - }, - { - "lat":60.112759, - "lon":24.328944 - }, - { - "lat":60.113092, - "lon":24.32839 - }, - { - "lat":60.113363, - "lon":24.327674 - }, - { - "lat":60.113688, - "lon":24.326922 - }, - { - "lat":60.114041, - "lon":24.325846 - }, - { - "lat":60.114366, - "lon":24.324878 - }, - { - "lat":60.11443, - "lon":24.324627 - }, - { - "lat":60.114466, - "lon":24.324448 - }, - { - "lat":60.114503, - "lon":24.32425 - }, - { - "lat":60.114548, - "lon":24.323872 - }, - { - "lat":60.114567, - "lon":24.323513 - }, - { - "lat":60.114577, - "lon":24.323315 - }, - { - "lat":60.114579, - "lon":24.322542 - }, - { - "lat":60.114591, - "lon":24.321067 - }, - { - "lat":60.114612, - "lon":24.319791 - }, - { - "lat":60.114623, - "lon":24.319144 - }, - { - "lat":60.114651, - "lon":24.318532 - }, - { - "lat":60.114707, - "lon":24.31776 - }, - { - "lat":60.114763, - "lon":24.316915 - }, - { - "lat":60.114782, - "lon":24.31652 - }, - { - "lat":60.114783, - "lon":24.316106 - }, - { - "lat":60.114731, - "lon":24.31544 - }, - { - "lat":60.114705, - "lon":24.314936 - }, - { - "lat":60.114706, - "lon":24.314559 - }, - { - "lat":60.114733, - "lon":24.314289 - }, - { - "lat":60.114752, - "lon":24.314056 - }, - { - "lat":60.114842, - "lon":24.313661 - }, - { - "lat":60.115015, - "lon":24.312961 - }, - { - "lat":60.115007, - "lon":24.312422 - }, - { - "lat":60.114981, - "lon":24.312134 - }, - { - "lat":60.114973, - "lon":24.311612 - }, - { - "lat":60.115001, - "lon":24.311001 - }, - { - "lat":60.114995, - "lon":24.309976 - }, - { - "lat":60.115014, - "lon":24.309599 - }, - { - "lat":60.11506, - "lon":24.30897 - }, - { - "lat":60.115134, - "lon":24.308197 - }, - { - "lat":60.115189, - "lon":24.30764 - }, - { - "lat":60.115244, - "lon":24.307101 - }, - { - "lat":60.115272, - "lon":24.306616 - }, - { - "lat":60.115282, - "lon":24.306328 - }, - { - "lat":60.115231, - "lon":24.305033 - }, - { - "lat":60.115205, - "lon":24.304529 - }, - { - "lat":60.11517, - "lon":24.304114 - }, - { - "lat":60.115135, - "lon":24.303862 - }, - { - "lat":60.115108, - "lon":24.303628 - }, - { - "lat":60.11501, - "lon":24.303339 - }, - { - "lat":60.114868, - "lon":24.302978 - }, - { - "lat":60.114725, - "lon":24.302474 - }, - { - "lat":60.114565, - "lon":24.302041 - }, - { - "lat":60.114253, - "lon":24.301031 - }, - { - "lat":60.11419, - "lon":24.301066 - }, - { - "lat":60.113893, - "lon":24.300812 - }, - { - "lat":60.113732, - "lon":24.300648 - }, - { - "lat":60.113661, - "lon":24.300558 - }, - { - "lat":60.113401, - "lon":24.300035 - }, - { - "lat":60.11333, - "lon":24.299872 - }, - { - "lat":60.113258, - "lon":24.299764 - }, - { - "lat":60.113124, - "lon":24.299547 - }, - { - "lat":60.112999, - "lon":24.29942 - }, - { - "lat":60.112936, - "lon":24.299365 - }, - { - "lat":60.112784, - "lon":24.299238 - }, - { - "lat":60.11264, - "lon":24.299201 - }, - { - "lat":60.112425, - "lon":24.299235 - }, - { - "lat":60.112272, - "lon":24.299305 - }, - { - "lat":60.112012, - "lon":24.299429 - }, - { - "lat":60.111787, - "lon":24.299445 - }, - { - "lat":60.111599, - "lon":24.299389 - }, - { - "lat":60.111366, - "lon":24.299279 - }, - { - "lat":60.111169, - "lon":24.299115 - }, - { - "lat":60.11099, - "lon":24.298862 - }, - { - "lat":60.110838, - "lon":24.298627 - }, - { - "lat":60.110713, - "lon":24.29832 - }, - { - "lat":60.110579, - "lon":24.298031 - }, - { - "lat":60.110499, - "lon":24.297833 - }, - { - "lat":60.110382, - "lon":24.29758 - }, - { - "lat":60.110275, - "lon":24.297381 - }, - { - "lat":60.110105, - "lon":24.297146 - }, - { - "lat":60.10981, - "lon":24.296909 - }, - { - "lat":60.109648, - "lon":24.29671 - }, - { - "lat":60.109505, - "lon":24.296511 - }, - { - "lat":60.109398, - "lon":24.29624 - }, - { - "lat":60.109309, - "lon":24.295934 - }, - { - "lat":60.109238, - "lon":24.295592 - }, - { - "lat":60.109016, - "lon":24.294547 - }, - { - "lat":60.108927, - "lon":24.294168 - }, - { - "lat":60.108865, - "lon":24.293844 - }, - { - "lat":60.108803, - "lon":24.293592 - }, - { - "lat":60.108732, - "lon":24.293358 - }, - { - "lat":60.108598, - "lon":24.292871 - }, - { - "lat":60.108491, - "lon":24.292546 - }, - { - "lat":60.108268, - "lon":24.292041 - }, - { - "lat":60.108152, - "lon":24.291752 - }, - { - "lat":60.107866, - "lon":24.291228 - }, - { - "lat":60.107651, - "lon":24.290849 - }, - { - "lat":60.10741, - "lon":24.290487 - }, - { - "lat":60.107311, - "lon":24.290378 - }, - { - "lat":60.107195, - "lon":24.290269 - }, - { - "lat":60.10706, - "lon":24.290196 - }, - { - "lat":60.106953, - "lon":24.290141 - }, - { - "lat":60.106818, - "lon":24.290122 - }, - { - "lat":60.106692, - "lon":24.290157 - }, - { - "lat":60.106567, - "lon":24.29021 - }, - { - "lat":60.106432, - "lon":24.290263 - }, - { - "lat":60.106324, - "lon":24.290423 - }, - { - "lat":60.106225, - "lon":24.29053 - }, - { - "lat":60.106063, - "lon":24.290745 - }, - { - "lat":60.105829, - "lon":24.29112 - }, - { - "lat":60.105351, - "lon":24.291853 - }, - { - "lat":60.105108, - "lon":24.29221 - }, - { - "lat":60.104892, - "lon":24.292496 - }, - { - "lat":60.104703, - "lon":24.292692 - }, - { - "lat":60.104505, - "lon":24.292906 - }, - { - "lat":60.104271, - "lon":24.293156 - }, - { - "lat":60.103929, - "lon":24.293746 - }, - { - "lat":60.103541, - "lon":24.294425 - }, - { - "lat":60.103316, - "lon":24.294819 - }, - { - "lat":60.103046, - "lon":24.29541 - }, - { - "lat":60.102911, - "lon":24.295606 - }, - { - "lat":60.102685, - "lon":24.296055 - }, - { - "lat":60.102586, - "lon":24.296323 - }, - { - "lat":60.102414, - "lon":24.296933 - }, - { - "lat":60.102233, - "lon":24.297381 - }, - { - "lat":60.102125, - "lon":24.297613 - }, - { - "lat":60.101972, - "lon":24.297792 - }, - { - "lat":60.101747, - "lon":24.297951 - }, - { - "lat":60.101298, - "lon":24.298289 - }, - { - "lat":60.100857, - "lon":24.298626 - }, - { - "lat":60.100633, - "lon":24.298714 - }, - { - "lat":60.100336, - "lon":24.298891 - }, - { - "lat":60.100228, - "lon":24.298998 - }, - { - "lat":60.100111, - "lon":24.299087 - }, - { - "lat":60.099958, - "lon":24.299283 - }, - { - "lat":60.099877, - "lon":24.299462 - }, - { - "lat":60.099859, - "lon":24.299624 - }, - { - "lat":60.099823, - "lon":24.299659 - }, - { - "lat":60.09985, - "lon":24.299768 - }, - { - "lat":60.099903, - "lon":24.300128 - }, - { - "lat":60.099938, - "lon":24.300308 - }, - { - "lat":60.099955, - "lon":24.300649 - }, - { - "lat":60.099955, - "lon":24.300883 - }, - { - "lat":60.099945, - "lon":24.301099 - }, - { - "lat":60.0999, - "lon":24.301332 - }, - { - "lat":60.099809, - "lon":24.301583 - }, - { - "lat":60.099746, - "lon":24.301726 - }, - { - "lat":60.099647, - "lon":24.301887 - }, - { - "lat":60.099503, - "lon":24.302029 - }, - { - "lat":60.099306, - "lon":24.302153 - }, - { - "lat":60.099225, - "lon":24.302134 - }, - { - "lat":60.099235, - "lon":24.301739 - }, - { - "lat":60.099253, - "lon":24.301362 - }, - { - "lat":60.099254, - "lon":24.300948 - }, - { - "lat":60.099255, - "lon":24.300607 - }, - { - "lat":60.099188, - "lon":24.298593 - }, - { - "lat":60.099136, - "lon":24.297658 - }, - { - "lat":60.099049, - "lon":24.296776 - }, - { - "lat":60.098943, - "lon":24.295805 - }, - { - "lat":60.098766, - "lon":24.294689 - }, - { - "lat":60.098465, - "lon":24.293087 - }, - { - "lat":60.098207, - "lon":24.29206 - }, - { - "lat":60.097966, - "lon":24.291087 - }, - { - "lat":60.097548, - "lon":24.289412 - }, - { - "lat":60.097388, - "lon":24.288727 - }, - { - "lat":60.096479, - "lon":24.289798 - }, - { - "lat":60.095724, - "lon":24.290546 - }, - { - "lat":60.095346, - "lon":24.290884 - }, - { - "lat":60.094888, - "lon":24.291221 - }, - { - "lat":60.094267, - "lon":24.291809 - }, - { - "lat":60.093556, - "lon":24.292737 - }, - { - "lat":60.093196, - "lon":24.292985 - }, - { - "lat":60.092998, - "lon":24.293217 - }, - { - "lat":60.092854, - "lon":24.293521 - }, - { - "lat":60.092457, - "lon":24.294615 - }, - { - "lat":60.09215, - "lon":24.295223 - }, - { - "lat":60.092033, - "lon":24.295492 - }, - { - "lat":60.091871, - "lon":24.295706 - }, - { - "lat":60.091655, - "lon":24.295848 - }, - { - "lat":60.091323, - "lon":24.296042 - }, - { - "lat":60.091089, - "lon":24.296238 - }, - { - "lat":60.090819, - "lon":24.296541 - }, - { - "lat":60.090612, - "lon":24.296773 - }, - { - "lat":60.090387, - "lon":24.296932 - }, - { - "lat":60.090073, - "lon":24.297127 - }, - { - "lat":60.089749, - "lon":24.297448 - }, - { - "lat":60.089371, - "lon":24.297732 - }, - { - "lat":60.089065, - "lon":24.297981 - }, - { - "lat":60.088832, - "lon":24.298122 - }, - { - "lat":60.088661, - "lon":24.298282 - }, - { - "lat":60.088445, - "lon":24.298496 - }, - { - "lat":60.088256, - "lon":24.298872 - }, - { - "lat":60.08794, - "lon":24.299336 - }, - { - "lat":60.087724, - "lon":24.299693 - }, - { - "lat":60.087472, - "lon":24.300104 - }, - { - "lat":60.087247, - "lon":24.300426 - }, - { - "lat":60.087004, - "lon":24.300657 - }, - { - "lat":60.086761, - "lon":24.300781 - }, - { - "lat":60.08659, - "lon":24.300942 - }, - { - "lat":60.086213, - "lon":24.301333 - }, - { - "lat":60.08588, - "lon":24.301636 - }, - { - "lat":60.085691, - "lon":24.301706 - }, - { - "lat":60.085458, - "lon":24.30165 - }, - { - "lat":60.084443, - "lon":24.301353 - }, - { - "lat":60.0843, - "lon":24.301262 - }, - { - "lat":60.084139, - "lon":24.301099 - }, - { - "lat":60.083933, - "lon":24.300845 - }, - { - "lat":60.083736, - "lon":24.300628 - }, - { - "lat":60.08336, - "lon":24.300427 - }, - { - "lat":60.083172, - "lon":24.300227 - }, - { - "lat":60.083001, - "lon":24.300028 - }, - { - "lat":60.082868, - "lon":24.299614 - }, - { - "lat":60.082627, - "lon":24.298947 - }, - { - "lat":60.082547, - "lon":24.298551 - }, - { - "lat":60.082449, - "lon":24.298263 - }, - { - "lat":60.08236, - "lon":24.298028 - }, - { - "lat":60.082235, - "lon":24.29774 - }, - { - "lat":60.08211, - "lon":24.297505 - }, - { - "lat":60.08203, - "lon":24.297235 - }, - { - "lat":60.081932, - "lon":24.296713 - }, - { - "lat":60.081826, - "lon":24.295993 - }, - { - "lat":60.081782, - "lon":24.295616 - }, - { - "lat":60.081622, - "lon":24.294878 - }, - { - "lat":60.081534, - "lon":24.294176 - }, - { - "lat":60.08221, - "lon":24.292781 - }, - { - "lat":60.08114, - "lon":24.289628 - }, - { - "lat":60.080555, - "lon":24.290467 - }, - { - "lat":60.080805, - "lon":24.291008 - }, - { - "lat":60.080894, - "lon":24.29126 - }, - { - "lat":60.08101, - "lon":24.29171 - }, - { - "lat":60.081107, - "lon":24.292196 - }, - { - "lat":60.081383, - "lon":24.293456 - }, - { - "lat":60.081525, - "lon":24.294158 - }, - { - "lat":60.081578, - "lon":24.294464 - }, - { - "lat":60.081613, - "lon":24.294734 - }, - { - "lat":60.081693, - "lon":24.29522 - }, - { - "lat":60.081773, - "lon":24.295651 - }, - { - "lat":60.081835, - "lon":24.296029 - }, - { - "lat":60.08187, - "lon":24.296389 - }, - { - "lat":60.081932, - "lon":24.296731 - }, - { - "lat":60.081976, - "lon":24.296965 - }, - { - "lat":60.082003, - "lon":24.297163 - }, - { - "lat":60.082074, - "lon":24.297379 - }, - { - "lat":60.082163, - "lon":24.297613 - }, - { - "lat":60.082333, - "lon":24.297992 - }, - { - "lat":60.082547, - "lon":24.298551 - }, - { - "lat":60.082636, - "lon":24.298893 - }, - { - "lat":60.082689, - "lon":24.299091 - }, - { - "lat":60.082805, - "lon":24.299469 - }, - { - "lat":60.083028, - "lon":24.300028 - }, - { - "lat":60.083162, - "lon":24.300263 - }, - { - "lat":60.083369, - "lon":24.300409 - }, - { - "lat":60.083646, - "lon":24.300591 - }, - { - "lat":60.083754, - "lon":24.300646 - }, - { - "lat":60.083924, - "lon":24.300827 - }, - { - "lat":60.084192, - "lon":24.301189 - }, - { - "lat":60.084327, - "lon":24.301298 - }, - { - "lat":60.084443, - "lon":24.301371 - }, - { - "lat":60.085458, - "lon":24.301668 - }, - { - "lat":60.085664, - "lon":24.30167 - }, - { - "lat":60.08588, - "lon":24.3016 - }, - { - "lat":60.086114, - "lon":24.301422 - }, - { - "lat":60.08659, - "lon":24.300942 - }, - { - "lat":60.086716, - "lon":24.300817 - }, - { - "lat":60.086887, - "lon":24.300729 - }, - { - "lat":60.087265, - "lon":24.30039 - }, - { - "lat":60.087544, - "lon":24.299997 - }, - { - "lat":60.088229, - "lon":24.298889 - }, - { - "lat":60.088463, - "lon":24.298514 - }, - { - "lat":60.088805, - "lon":24.298104 - }, - { - "lat":60.089335, - "lon":24.297803 - }, - { - "lat":60.089749, - "lon":24.297448 - }, - { - "lat":60.089956, - "lon":24.297252 - }, - { - "lat":60.090234, - "lon":24.297021 - }, - { - "lat":60.090441, - "lon":24.296915 - }, - { - "lat":60.090711, - "lon":24.296666 - }, - { - "lat":60.091098, - "lon":24.296238 - }, - { - "lat":60.091341, - "lon":24.296025 - }, - { - "lat":60.091646, - "lon":24.295866 - }, - { - "lat":60.091907, - "lon":24.295634 - }, - { - "lat":60.092087, - "lon":24.295348 - }, - { - "lat":60.092457, - "lon":24.294561 - }, - { - "lat":60.092619, - "lon":24.294167 - }, - { - "lat":60.092791, - "lon":24.293648 - }, - { - "lat":60.092917, - "lon":24.293432 - }, - { - "lat":60.093034, - "lon":24.293182 - }, - { - "lat":60.093205, - "lon":24.293003 - }, - { - "lat":60.093394, - "lon":24.292861 - }, - { - "lat":60.093538, - "lon":24.292719 - }, - { - "lat":60.093754, - "lon":24.292451 - }, - { - "lat":60.094258, - "lon":24.291809 - }, - { - "lat":60.094735, - "lon":24.291346 - }, - { - "lat":60.095328, - "lon":24.290866 - }, - { - "lat":60.096227, - "lon":24.290047 - }, - { - "lat":60.096839, - "lon":24.28937 - }, - { - "lat":60.097388, - "lon":24.288727 - }, - { - "lat":60.097317, - "lon":24.288439 - }, - { - "lat":60.09729, - "lon":24.288277 - }, - { - "lat":60.097219, - "lon":24.287899 - }, - { - "lat":60.097078, - "lon":24.287125 - }, - { - "lat":60.096917, - "lon":24.286081 - }, - { - "lat":60.096767, - "lon":24.285055 - }, - { - "lat":60.096671, - "lon":24.284012 - }, - { - "lat":60.09661, - "lon":24.282808 - }, - { - "lat":60.096432, - "lon":24.27824 - }, - { - "lat":60.096399, - "lon":24.27256 - }, - { - "lat":60.096387, - "lon":24.269523 - }, - { - "lat":60.096394, - "lon":24.266 - }, - { - "lat":60.096313, - "lon":24.261758 - }, - { - "lat":60.096185, - "lon":24.258323 - }, - { - "lat":60.096116, - "lon":24.257262 - }, - { - "lat":60.096072, - "lon":24.256417 - }, - { - "lat":60.095994, - "lon":24.255123 - }, - { - "lat":60.095827, - "lon":24.253306 - }, - { - "lat":60.095694, - "lon":24.251939 - }, - { - "lat":60.095874, - "lon":24.251869 - }, - { - "lat":60.09643, - "lon":24.251783 - }, - { - "lat":60.09652, - "lon":24.251766 - }, - { - "lat":60.096852, - "lon":24.251715 - }, - { - "lat":60.097365, - "lon":24.251611 - }, - { - "lat":60.098038, - "lon":24.251508 - }, - { - "lat":60.098829, - "lon":24.251281 - }, - { - "lat":60.099359, - "lon":24.251141 - }, - { - "lat":60.099817, - "lon":24.250857 - }, - { - "lat":60.100284, - "lon":24.250591 - }, - { - "lat":60.100787, - "lon":24.250253 - }, - { - "lat":60.101318, - "lon":24.249826 - }, - { - "lat":60.102172, - "lon":24.249094 - }, - { - "lat":60.103026, - "lon":24.248454 - }, - { - "lat":60.103502, - "lon":24.248134 - }, - { - "lat":60.103646, - "lon":24.248027 - }, - { - "lat":60.104777, - "lon":24.247532 - }, - { - "lat":60.105667, - "lon":24.247143 - }, - { - "lat":60.106152, - "lon":24.246878 - }, - { - "lat":60.106305, - "lon":24.246807 - }, - { - "lat":60.106799, - "lon":24.246397 - }, - { - "lat":60.106988, - "lon":24.246255 - }, - { - "lat":60.107446, - "lon":24.245845 - }, - { - "lat":60.10777, - "lon":24.245523 - }, - { - "lat":60.108076, - "lon":24.245184 - }, - { - "lat":60.108283, - "lon":24.244897 - }, - { - "lat":60.10894, - "lon":24.244039 - }, - { - "lat":60.109452, - "lon":24.243306 - }, - { - "lat":60.109605, - "lon":24.243109 - }, - { - "lat":60.109947, - "lon":24.24268 - }, - { - "lat":60.110325, - "lon":24.242305 - }, - { - "lat":60.110676, - "lon":24.242002 - }, - { - "lat":60.111233, - "lon":24.241593 - }, - { - "lat":60.111601, - "lon":24.241434 - }, - { - "lat":60.112104, - "lon":24.24124 - }, - { - "lat":60.112337, - "lon":24.241169 - }, - { - "lat":60.11267, - "lon":24.241118 - }, - { - "lat":60.11337, - "lon":24.241051 - }, - { - "lat":60.114698, - "lon":24.241079 - }, - { - "lat":60.115694, - "lon":24.241103 - }, - { - "lat":60.116592, - "lon":24.24111 - }, - { - "lat":60.117256, - "lon":24.241061 - }, - { - "lat":60.117382, - "lon":24.241062 - }, - { - "lat":60.117552, - "lon":24.241063 - }, - { - "lat":60.118082, - "lon":24.240905 - }, - { - "lat":60.118387, - "lon":24.2408 - }, - { - "lat":60.118765, - "lon":24.240658 - }, - { - "lat":60.119376, - "lon":24.240339 - }, - { - "lat":60.119888, - "lon":24.239983 - }, - { - "lat":60.120472, - "lon":24.23952 - }, - { - "lat":60.120876, - "lon":24.239217 - }, - { - "lat":60.121092, - "lon":24.239039 - }, - { - "lat":60.121254, - "lon":24.238932 - }, - { - "lat":60.121991, - "lon":24.238344 - }, - { - "lat":60.122701, - "lon":24.237666 - }, - { - "lat":60.123277, - "lon":24.237129 - }, - { - "lat":60.123447, - "lon":24.236951 - }, - { - "lat":60.123942, - "lon":24.236523 - }, - { - "lat":60.124688, - "lon":24.236042 - }, - { - "lat":60.125478, - "lon":24.23558 - }, - { - "lat":60.126341, - "lon":24.235119 - }, - { - "lat":60.126727, - "lon":24.23487 - }, - { - "lat":60.127114, - "lon":24.234423 - }, - { - "lat":60.127716, - "lon":24.233744 - }, - { - "lat":60.12831, - "lon":24.232992 - }, - { - "lat":60.128544, - "lon":24.232778 - }, - { - "lat":60.128859, - "lon":24.232457 - }, - { - "lat":60.129038, - "lon":24.23235 - }, - { - "lat":60.129335, - "lon":24.232244 - }, - { - "lat":60.129685, - "lon":24.232138 - }, - { - "lat":60.130205, - "lon":24.232213 - }, - { - "lat":60.130492, - "lon":24.232305 - }, - { - "lat":60.130636, - "lon":24.23236 - }, - { - "lat":60.131057, - "lon":24.232507 - }, - { - "lat":60.131398, - "lon":24.232528 - }, - { - "lat":60.131587, - "lon":24.232475 - }, - { - "lat":60.131812, - "lon":24.232333 - }, - { - "lat":60.132, - "lon":24.232154 - }, - { - "lat":60.132351, - "lon":24.231725 - }, - { - "lat":60.132576, - "lon":24.231367 - }, - { - "lat":60.132729, - "lon":24.231134 - }, - { - "lat":60.132909, - "lon":24.230883 - }, - { - "lat":60.133008, - "lon":24.230704 - }, - { - "lat":60.133215, - "lon":24.230472 - }, - { - "lat":60.133449, - "lon":24.230311 - }, - { - "lat":60.133853, - "lon":24.229954 - }, - { - "lat":60.134329, - "lon":24.229616 - }, - { - "lat":60.134725, - "lon":24.229295 - }, - { - "lat":60.135084, - "lon":24.229027 - }, - { - "lat":60.13521, - "lon":24.228884 - }, - { - "lat":60.135273, - "lon":24.228849 - }, - { - "lat":60.135588, - "lon":24.228509 - }, - { - "lat":60.13593, - "lon":24.228134 - }, - { - "lat":60.136064, - "lon":24.228027 - }, - { - "lat":60.136298, - "lon":24.22783 - }, - { - "lat":60.136577, - "lon":24.227651 - }, - { - "lat":60.136927, - "lon":24.227546 - }, - { - "lat":60.13716, - "lon":24.227511 - }, - { - "lat":60.137232, - "lon":24.22753 - }, - { - "lat":60.137313, - "lon":24.227531 - }, - { - "lat":60.137376, - "lon":24.227549 - }, - { - "lat":60.137483, - "lon":24.227532 - }, - { - "lat":60.137555, - "lon":24.227532 - }, - { - "lat":60.137591, - "lon":24.227514 - }, - { - "lat":60.137842, - "lon":24.22748 - }, - { - "lat":60.138166, - "lon":24.227339 - }, - { - "lat":60.138283, - "lon":24.227303 - }, - { - "lat":60.13848, - "lon":24.227179 - }, - { - "lat":60.138741, - "lon":24.227019 - }, - { - "lat":60.138956, - "lon":24.226894 - }, - { - "lat":60.139106, - "lon":24.22677 - }, - { - "lat":60.139083, - "lon":24.226625 - }, - { - "lat":60.138913, - "lon":24.225868 - }, - { - "lat":60.138833, - "lon":24.225472 - }, - { - "lat":60.138762, - "lon":24.225111 - }, - { - "lat":60.1387, - "lon":24.224841 - }, - { - "lat":60.138583, - "lon":24.22502 - } - ], - "stops":[ - { - "lat":60.119658, - "lon":24.441538, - "name":"Kirkkonummi mk", - "gtfsId":"HSL:6040295", - "code":"Ki0495", - "desc":"Matkakeskus", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA0MDI5NQ==", - "platformCode":"15" - }, - { - "lat":60.124165, - "lon":24.441558, - "name":"Kirkkotallintie", - "gtfsId":"HSL:6050250", - "code":"Ki0550", - "desc":"Kirkkonummentie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDI1MA==", - "platformCode":null - }, - { - "lat":60.129061, - "lon":24.446102, - "name":"Gesterbynkaari", - "gtfsId":"HSL:6040275", - "code":"Ki0475", - "desc":"Gesterbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA0MDI3NQ==", - "platformCode":null - }, - { - "lat":60.129131, - "lon":24.445824, - "name":"Gesterbynkaari", - "gtfsId":"HSL:6040277", - "code":"Ki0477", - "desc":"Gesterbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA0MDI3Nw==", - "platformCode":null - }, - { - "lat":60.125828, - "lon":24.433405, - "name":"Rajapolku", - "gtfsId":"HSL:6040238", - "code":"Ki0438", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA0MDIzOA==", - "platformCode":null - }, - { - "lat":60.125218, - "lon":24.42728, - "name":"Kuusala", - "gtfsId":"HSL:6040237", - "code":"Ki0437", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA0MDIzNw==", - "platformCode":null - }, - { - "lat":60.123458, - "lon":24.422153, - "name":"Ravalsinkuja", - "gtfsId":"HSL:6040234", - "code":"Ki0434", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA0MDIzNA==", - "platformCode":null - }, - { - "lat":60.12335, - "lon":24.410108, - "name":"Lindalintie", - "gtfsId":"HSL:6050219", - "code":"Ki0519", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDIxOQ==", - "platformCode":null - }, - { - "lat":60.123956, - "lon":24.40427, - "name":"Karlbergintie", - "gtfsId":"HSL:6050215", - "code":"Ki0515", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDIxNQ==", - "platformCode":null - }, - { - "lat":60.123608, - "lon":24.39643, - "name":"Överby", - "gtfsId":"HSL:6050214", - "code":"Ki0514", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDIxNA==", - "platformCode":null - }, - { - "lat":60.12206, - "lon":24.385388, - "name":"Granbackantie", - "gtfsId":"HSL:6050212", - "code":"Ki0512", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDIxMg==", - "platformCode":null - }, - { - "lat":60.121138, - "lon":24.376124, - "name":"Bergträskinpolku", - "gtfsId":"HSL:6050210", - "code":"Ki0510", - "desc":"Överbyntie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDIxMA==", - "platformCode":null - }, - { - "lat":60.117976, - "lon":24.362341, - "name":"Itäinen kuninkaantie", - "gtfsId":"HSL:6050217", - "code":"Ki0517", - "desc":"Itäinen kuninkaantie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjA1MDIxNw==", - "platformCode":null - }, - { - "lat":60.114423, - "lon":24.324623, - "name":"Böle", - "gtfsId":"HSL:6306001", - "code":"So3122", - "desc":"Itäinen Kuninkaantie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNjAwMQ==", - "platformCode":null - }, - { - "lat":60.11389, - "lon":24.300788, - "name":"Kela", - "gtfsId":"HSL:6306002", - "code":"So3123", - "desc":"Itäinen Kuninkaantie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNjAwMg==", - "platformCode":null - }, - { - "lat":60.106052, - "lon":24.290729, - "name":"Tallbacka", - "gtfsId":"HSL:6306004", - "code":"So3125", - "desc":"Itäinen Kuninkaantie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNjAwNA==", - "platformCode":null - }, - { - "lat":60.09981, - "lon":24.299634, - "name":"Pikkalan kartano", - "gtfsId":"HSL:6307006", - "code":"So3133", - "desc":"Pikkalan kartano", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNzAwNg==", - "platformCode":null - }, - { - "lat":60.099251, - "lon":24.3006, - "name":"Pikkala", - "gtfsId":"HSL:6307005", - "code":"So3132", - "desc":"Pikkalan kartano", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNzAwNQ==", - "platformCode":null - }, - { - "lat":60.080806, - "lon":24.291003, - "name":"Sienitie", - "gtfsId":"HSL:6304004", - "code":"So3115", - "desc":"Störsvikintie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNDAwNA==", - "platformCode":null - }, - { - "lat":60.097218, - "lon":24.287899, - "name":"Störsvik th", - "gtfsId":"HSL:6304005", - "code":"So3116", - "desc":"Rannikkotie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNDAwNQ==", - "platformCode":null - }, - { - "lat":60.096184, - "lon":24.258319, - "name":"Kalliotie", - "gtfsId":"HSL:6304003", - "code":"So3114", - "desc":"Rannikkotie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNDAwMw==", - "platformCode":null - }, - { - "lat":60.096517, - "lon":24.251887, - "name":"Ruohosuontie", - "gtfsId":"HSL:6304009", - "code":"So3120", - "desc":"Siuntiontie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNDAwOQ==", - "platformCode":null - }, - { - "lat":60.103516, - "lon":24.248267, - "name":"Sunnanvik tiehaara", - "gtfsId":"HSL:6304008", - "code":"So3119", - "desc":"Siuntiontie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwNDAwOA==", - "platformCode":null - }, - { - "lat":60.112345, - "lon":24.241337, - "name":"Sunnanvik", - "gtfsId":"HSL:6302018", - "code":"So3100", - "desc":"Siuntiontie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwMjAxOA==", - "platformCode":null - }, - { - "lat":60.117387, - "lon":24.241306, - "name":"Degerbyntie", - "gtfsId":"HSL:6302005", - "code":"So3087", - "desc":"Siuntiontie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwMjAwNQ==", - "platformCode":null - }, - { - "lat":60.121106, - "lon":24.239152, - "name":"Nordanvik tiehaara", - "gtfsId":"HSL:6302008", - "code":"So3090", - "desc":"Framängintie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwMjAwOA==", - "platformCode":null - }, - { - "lat":60.130476, - "lon":24.232493, - "name":"Billskogintie", - "gtfsId":"HSL:6302000", - "code":"So3082", - "desc":"Siuntiontie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwMjAwMA==", - "platformCode":null - }, - { - "lat":60.135228, - "lon":24.228995, - "name":"Sudenkaari", - "gtfsId":"HSL:6302017", - "code":"So3099", - "desc":"Siuntiontie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwMjAxNw==", - "platformCode":null - }, - { - "lat":60.138558, - "lon":24.22497, - "name":"Siuntio matkahuolto", - "gtfsId":"HSL:6302012", - "code":"So3094", - "desc":"Flemingintie", - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDpIU0w6NjMwMjAxMg==", - "platformCode":null - } - ], - "activeDates":[ - { - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8xXzE0MDU=" - }, - { - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8xXzE1MzA=" - }, - { - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8xXzE0MDU=" - }, - { - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8xXzE1MzA=" - }, - { - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18xXzE0MDU=" - }, - { - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18xXzE1MzA=" - }, - { - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - }, - { - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8xXzE1MzA=" - }, - { - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8xXzE0MDU=" - }, - { - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8xXzE1MzA=" - }, - { - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8xXzE0MDU=" - }, - { - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8xXzE1MzA=" - }, - { - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8xXzE0MDU=" - }, - { - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18xXzE0MDU=" - }, - { - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18xXzE1MzA=" - }, - { - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8xXzE1MzA=" - }, - { - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8xXzE0MDU=" - }, - { - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8xXzE1MzA=" - }, - { - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8xXzE0MDU=" - }, - { - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8xXzE1MzA=" - }, - { - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8xXzE0MDU=" - } - ], - "route":{ - "mode":"BUS", - "color":null, - "id":"Um91dGU6SFNMOjYxODE=" - }, - "id":"UGF0dGVybjpIU0w6NjE4MTowOjAx" - } - } - }, - "id":"routeRoutes_RoutePageMap_Query" - }, - { - "payload":{ - "data":{ - "pattern":{ - "code":"HSL:6181:0:01", - "directionId":0, - "route":{ - "mode":"BUS", - "color":null, - "shortName":"181", - "id":"Um91dGU6SFNMOjYxODE=" - }, - "stops":[ - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":true, - "realtimeState":"UPDATED", - "realtimeArrival":50700, - "realtimeDeparture":50700, - "serviceDay":1640646000, - "scheduledDeparture":50700, - "pickupType":"UPDATED", - "stop":{ - "platformCode":"15", - "id":"U3RvcDpIU0w6NjA0MDI5NQ==" - } - }, - { - "realtime":true, - "realtimeState":"UPDATED", - "realtimeArrival":55800, - "realtimeDeparture":55800, - "serviceDay":1640646000, - "scheduledDeparture":55800, - "pickupType":"UPDATED", - "stop":{ - "platformCode":"15", - "id":"U3RvcDpIU0w6NjA0MDI5NQ==" - } - } - ], - "gtfsId":"HSL:6040295", - "lat":60.119658, - "lon":24.441538, - "name":"Kirkkonummi mk", - "desc":"Matkakeskus", - "code":"Ki0495", - "platformCode":"15", - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA0MDI5NQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50760, - "realtimeDeparture":50760, - "serviceDay":1640646000, - "scheduledDeparture":50760, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDI1MA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":55860, - "realtimeDeparture":55860, - "serviceDay":1640646000, - "scheduledDeparture":55860, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDI1MA==" - } - } - ], - "gtfsId":"HSL:6050250", - "lat":60.124165, - "lon":24.441558, - "name":"Kirkkotallintie", - "desc":"Kirkkonummentie", - "code":"Ki0550", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDI1MA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50820, - "realtimeDeparture":50820, - "serviceDay":1640646000, - "scheduledDeparture":50820, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDI3NQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":55920, - "realtimeDeparture":55920, - "serviceDay":1640646000, - "scheduledDeparture":55920, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDI3NQ==" - } - } - ], - "gtfsId":"HSL:6040275", - "lat":60.129061, - "lon":24.446102, - "name":"Gesterbynkaari", - "desc":"Gesterbyntie", - "code":"Ki0475", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA0MDI3NQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50820, - "realtimeDeparture":50820, - "serviceDay":1640646000, - "scheduledDeparture":50820, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDI3Nw==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":55920, - "realtimeDeparture":55920, - "serviceDay":1640646000, - "scheduledDeparture":55920, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDI3Nw==" - } - } - ], - "gtfsId":"HSL:6040277", - "lat":60.129131, - "lon":24.445824, - "name":"Gesterbynkaari", - "desc":"Gesterbyntie", - "code":"Ki0477", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA0MDI3Nw==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50880, - "realtimeDeparture":50880, - "serviceDay":1640646000, - "scheduledDeparture":50880, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDIzOA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":55980, - "realtimeDeparture":55980, - "serviceDay":1640646000, - "scheduledDeparture":55980, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDIzOA==" - } - } - ], - "gtfsId":"HSL:6040238", - "lat":60.125828, - "lon":24.433405, - "name":"Rajapolku", - "desc":"Överbyntie", - "code":"Ki0438", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA0MDIzOA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50940, - "realtimeDeparture":50940, - "serviceDay":1640646000, - "scheduledDeparture":50940, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDIzNw==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56040, - "realtimeDeparture":56040, - "serviceDay":1640646000, - "scheduledDeparture":56040, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDIzNw==" - } - } - ], - "gtfsId":"HSL:6040237", - "lat":60.125218, - "lon":24.42728, - "name":"Kuusala", - "desc":"Överbyntie", - "code":"Ki0437", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA0MDIzNw==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50940, - "realtimeDeparture":50940, - "serviceDay":1640646000, - "scheduledDeparture":50940, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDIzNA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56040, - "realtimeDeparture":56040, - "serviceDay":1640646000, - "scheduledDeparture":56040, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA0MDIzNA==" - } - } - ], - "gtfsId":"HSL:6040234", - "lat":60.123458, - "lon":24.422153, - "name":"Ravalsinkuja", - "desc":"Överbyntie", - "code":"Ki0434", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA0MDIzNA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51000, - "realtimeDeparture":51000, - "serviceDay":1640646000, - "scheduledDeparture":51000, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxOQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56100, - "realtimeDeparture":56100, - "serviceDay":1640646000, - "scheduledDeparture":56100, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxOQ==" - } - } - ], - "gtfsId":"HSL:6050219", - "lat":60.12335, - "lon":24.410108, - "name":"Lindalintie", - "desc":"Överbyntie", - "code":"Ki0519", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDIxOQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51060, - "realtimeDeparture":51060, - "serviceDay":1640646000, - "scheduledDeparture":51060, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxNQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56160, - "realtimeDeparture":56160, - "serviceDay":1640646000, - "scheduledDeparture":56160, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxNQ==" - } - } - ], - "gtfsId":"HSL:6050215", - "lat":60.123956, - "lon":24.40427, - "name":"Karlbergintie", - "desc":"Överbyntie", - "code":"Ki0515", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDIxNQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51060, - "realtimeDeparture":51060, - "serviceDay":1640646000, - "scheduledDeparture":51060, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxNA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56160, - "realtimeDeparture":56160, - "serviceDay":1640646000, - "scheduledDeparture":56160, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxNA==" - } - } - ], - "gtfsId":"HSL:6050214", - "lat":60.123608, - "lon":24.39643, - "name":"Överby", - "desc":"Överbyntie", - "code":"Ki0514", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDIxNA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51120, - "realtimeDeparture":51120, - "serviceDay":1640646000, - "scheduledDeparture":51120, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxMg==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56220, - "realtimeDeparture":56220, - "serviceDay":1640646000, - "scheduledDeparture":56220, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxMg==" - } - } - ], - "gtfsId":"HSL:6050212", - "lat":60.12206, - "lon":24.385388, - "name":"Granbackantie", - "desc":"Överbyntie", - "code":"Ki0512", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDIxMg==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51180, - "realtimeDeparture":51180, - "serviceDay":1640646000, - "scheduledDeparture":51180, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxMA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56280, - "realtimeDeparture":56280, - "serviceDay":1640646000, - "scheduledDeparture":56280, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxMA==" - } - } - ], - "gtfsId":"HSL:6050210", - "lat":60.121138, - "lon":24.376124, - "name":"Bergträskinpolku", - "desc":"Överbyntie", - "code":"Ki0510", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDIxMA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51360, - "realtimeDeparture":51360, - "serviceDay":1640646000, - "scheduledDeparture":51360, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxNw==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56460, - "realtimeDeparture":56460, - "serviceDay":1640646000, - "scheduledDeparture":56460, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjA1MDIxNw==" - } - } - ], - "gtfsId":"HSL:6050217", - "lat":60.117976, - "lon":24.362341, - "name":"Itäinen kuninkaantie", - "desc":"Itäinen kuninkaantie", - "code":"Ki0517", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjA1MDIxNw==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51480, - "realtimeDeparture":51480, - "serviceDay":1640646000, - "scheduledDeparture":51480, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNjAwMQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56580, - "realtimeDeparture":56580, - "serviceDay":1640646000, - "scheduledDeparture":56580, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNjAwMQ==" - } - } - ], - "gtfsId":"HSL:6306001", - "lat":60.114423, - "lon":24.324623, - "name":"Böle", - "desc":"Itäinen Kuninkaantie", - "code":"So3122", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNjAwMQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51540, - "realtimeDeparture":51540, - "serviceDay":1640646000, - "scheduledDeparture":51540, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNjAwMg==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56640, - "realtimeDeparture":56640, - "serviceDay":1640646000, - "scheduledDeparture":56640, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNjAwMg==" - } - } - ], - "gtfsId":"HSL:6306002", - "lat":60.11389, - "lon":24.300788, - "name":"Kela", - "desc":"Itäinen Kuninkaantie", - "code":"So3123", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNjAwMg==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51660, - "realtimeDeparture":51660, - "serviceDay":1640646000, - "scheduledDeparture":51660, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNjAwNA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56760, - "realtimeDeparture":56760, - "serviceDay":1640646000, - "scheduledDeparture":56760, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNjAwNA==" - } - } - ], - "gtfsId":"HSL:6306004", - "lat":60.106052, - "lon":24.290729, - "name":"Tallbacka", - "desc":"Itäinen Kuninkaantie", - "code":"So3125", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNjAwNA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51780, - "realtimeDeparture":51780, - "serviceDay":1640646000, - "scheduledDeparture":51780, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNzAwNg==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56880, - "realtimeDeparture":56880, - "serviceDay":1640646000, - "scheduledDeparture":56880, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNzAwNg==" - } - } - ], - "gtfsId":"HSL:6307006", - "lat":60.09981, - "lon":24.299634, - "name":"Pikkalan kartano", - "desc":"Pikkalan kartano", - "code":"So3133", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNzAwNg==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51840, - "realtimeDeparture":51840, - "serviceDay":1640646000, - "scheduledDeparture":51840, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNzAwNQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":56940, - "realtimeDeparture":56940, - "serviceDay":1640646000, - "scheduledDeparture":56940, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNzAwNQ==" - } - } - ], - "gtfsId":"HSL:6307005", - "lat":60.099251, - "lon":24.3006, - "name":"Pikkala", - "desc":"Pikkalan kartano", - "code":"So3132", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNzAwNQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52200, - "realtimeDeparture":52200, - "serviceDay":1640646000, - "scheduledDeparture":52200, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwNA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57300, - "realtimeDeparture":57300, - "serviceDay":1640646000, - "scheduledDeparture":57300, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwNA==" - } - } - ], - "gtfsId":"HSL:6304004", - "lat":60.080806, - "lon":24.291003, - "name":"Sienitie", - "desc":"Störsvikintie", - "code":"So3115", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNDAwNA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52440, - "realtimeDeparture":52440, - "serviceDay":1640646000, - "scheduledDeparture":52440, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwNQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57540, - "realtimeDeparture":57540, - "serviceDay":1640646000, - "scheduledDeparture":57540, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwNQ==" - } - } - ], - "gtfsId":"HSL:6304005", - "lat":60.097218, - "lon":24.287899, - "name":"Störsvik th", - "desc":"Rannikkotie", - "code":"So3116", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNDAwNQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52560, - "realtimeDeparture":52560, - "serviceDay":1640646000, - "scheduledDeparture":52560, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwMw==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57660, - "realtimeDeparture":57660, - "serviceDay":1640646000, - "scheduledDeparture":57660, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwMw==" - } - } - ], - "gtfsId":"HSL:6304003", - "lat":60.096184, - "lon":24.258319, - "name":"Kalliotie", - "desc":"Rannikkotie", - "code":"So3114", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNDAwMw==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52620, - "realtimeDeparture":52620, - "serviceDay":1640646000, - "scheduledDeparture":52620, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwOQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57720, - "realtimeDeparture":57720, - "serviceDay":1640646000, - "scheduledDeparture":57720, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwOQ==" - } - } - ], - "gtfsId":"HSL:6304009", - "lat":60.096517, - "lon":24.251887, - "name":"Ruohosuontie", - "desc":"Siuntiontie", - "code":"So3120", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNDAwOQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52680, - "realtimeDeparture":52680, - "serviceDay":1640646000, - "scheduledDeparture":52680, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwOA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57780, - "realtimeDeparture":57780, - "serviceDay":1640646000, - "scheduledDeparture":57780, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwNDAwOA==" - } - } - ], - "gtfsId":"HSL:6304008", - "lat":60.103516, - "lon":24.248267, - "name":"Sunnanvik tiehaara", - "desc":"Siuntiontie", - "code":"So3119", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwNDAwOA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52800, - "realtimeDeparture":52800, - "serviceDay":1640646000, - "scheduledDeparture":52800, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAxOA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57900, - "realtimeDeparture":57900, - "serviceDay":1640646000, - "scheduledDeparture":57900, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAxOA==" - } - } - ], - "gtfsId":"HSL:6302018", - "lat":60.112345, - "lon":24.241337, - "name":"Sunnanvik", - "desc":"Siuntiontie", - "code":"So3100", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwMjAxOA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52860, - "realtimeDeparture":52860, - "serviceDay":1640646000, - "scheduledDeparture":52860, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAwNQ==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57960, - "realtimeDeparture":57960, - "serviceDay":1640646000, - "scheduledDeparture":57960, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAwNQ==" - } - } - ], - "gtfsId":"HSL:6302005", - "lat":60.117387, - "lon":24.241306, - "name":"Degerbyntie", - "desc":"Siuntiontie", - "code":"So3087", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwMjAwNQ==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52860, - "realtimeDeparture":52860, - "serviceDay":1640646000, - "scheduledDeparture":52860, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAwOA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":57960, - "realtimeDeparture":57960, - "serviceDay":1640646000, - "scheduledDeparture":57960, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAwOA==" - } - } - ], - "gtfsId":"HSL:6302008", - "lat":60.121106, - "lon":24.239152, - "name":"Nordanvik tiehaara", - "desc":"Framängintie", - "code":"So3090", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwMjAwOA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52980, - "realtimeDeparture":52980, - "serviceDay":1640646000, - "scheduledDeparture":52980, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAwMA==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":58080, - "realtimeDeparture":58080, - "serviceDay":1640646000, - "scheduledDeparture":58080, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAwMA==" - } - } - ], - "gtfsId":"HSL:6302000", - "lat":60.130476, - "lon":24.232493, - "name":"Billskogintie", - "desc":"Siuntiontie", - "code":"So3082", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwMjAwMA==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53040, - "realtimeDeparture":53040, - "serviceDay":1640646000, - "scheduledDeparture":53040, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAxNw==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":58140, - "realtimeDeparture":58140, - "serviceDay":1640646000, - "scheduledDeparture":58140, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAxNw==" - } - } - ], - "gtfsId":"HSL:6302017", - "lat":60.135228, - "lon":24.228995, - "name":"Sudenkaari", - "desc":"Siuntiontie", - "code":"So3099", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwMjAxNw==" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53100, - "realtimeDeparture":53100, - "serviceDay":1640646000, - "scheduledDeparture":53100, - "pickupType":"NONE", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAxMg==" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":58200, - "realtimeDeparture":58200, - "serviceDay":1640646000, - "scheduledDeparture":58200, - "pickupType":"NONE", - "stop":{ - "platformCode":null, - "id":"U3RvcDpIU0w6NjMwMjAxMg==" - } - } - ], - "gtfsId":"HSL:6302012", - "lat":60.138558, - "lon":24.22497, - "name":"Siuntio matkahuolto", - "desc":"Flemingintie", - "code":"So3094", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDpIU0w6NjMwMjAxMg==" - } - ], - "id":"UGF0dGVybjpIU0w6NjE4MTowOjAx" - }, - "route":{ - "gtfsId":"HSL:6181", - "color":null, - "shortName":"181", - "longName":"Kirkkonummi-Siuntio", - "mode":"BUS", - "type":701, - "agency":{ - "name":"Helsingin seudun liikenne", - "url":"http://www.hsl.fi/", - "fareUrl":"http://www.hsl.fi/liput", - "id":"QWdlbmN5OkhTTDpIU0w=", - "phone":"(09) 4766 4444" - }, - "patterns":[ - { - "code":"HSL:6181:1:01", - "directionId":1, - "headsign":"Kirkkonummi", - "stops":[ - { - "name":"Siuntio matkahuolto", - "id":"U3RvcDpIU0w6NjMwMjAxMg==", - "gtfsId":"HSL:6302012", - "code":"So3094", - "alerts":[ - - ] - }, - { - "name":"Sudenkaari", - "id":"U3RvcDpIU0w6NjMwMjAxNg==", - "gtfsId":"HSL:6302016", - "code":"So3098", - "alerts":[ - - ] - }, - { - "name":"Billskogintie", - "id":"U3RvcDpIU0w6NjMwMjAwMQ==", - "gtfsId":"HSL:6302001", - "code":"So3083", - "alerts":[ - - ] - }, - { - "name":"Nordanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwMjAwOQ==", - "gtfsId":"HSL:6302009", - "code":"So3091", - "alerts":[ - - ] - }, - { - "name":"Degerbyntie", - "id":"U3RvcDpIU0w6NjMwMjAwNA==", - "gtfsId":"HSL:6302004", - "code":"So3086", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik", - "id":"U3RvcDpIU0w6NjMwMjAxOQ==", - "gtfsId":"HSL:6302019", - "code":"So3101", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwNDAwNw==", - "gtfsId":"HSL:6304007", - "code":"So3118", - "alerts":[ - - ] - }, - { - "name":"Kalliotie", - "id":"U3RvcDpIU0w6NjMwNDAwMg==", - "gtfsId":"HSL:6304002", - "code":"So3113", - "alerts":[ - - ] - }, - { - "name":"Sienitie", - "id":"U3RvcDpIU0w6NjMwNDAwNA==", - "gtfsId":"HSL:6304004", - "code":"So3115", - "alerts":[ - - ] - }, - { - "name":"Störsvik th", - "id":"U3RvcDpIU0w6NjMwNDAwNg==", - "gtfsId":"HSL:6304006", - "code":"So3117", - "alerts":[ - - ] - }, - { - "name":"Tallbacka", - "id":"U3RvcDpIU0w6NjMwNjAwNQ==", - "gtfsId":"HSL:6306005", - "code":"So3126", - "alerts":[ - - ] - }, - { - "name":"Kela", - "id":"U3RvcDpIU0w6NjMwNjAwMw==", - "gtfsId":"HSL:6306003", - "code":"So3124", - "alerts":[ - - ] - }, - { - "name":"Böle", - "id":"U3RvcDpIU0w6NjMwNjAwMA==", - "gtfsId":"HSL:6306000", - "code":"So3121", - "alerts":[ - - ] - }, - { - "name":"Bergträskinpolku", - "id":"U3RvcDpIU0w6NjA1MDIwOQ==", - "gtfsId":"HSL:6050209", - "code":"Ki0509", - "alerts":[ - - ] - }, - { - "name":"Granbackantie", - "id":"U3RvcDpIU0w6NjA1MDIxMQ==", - "gtfsId":"HSL:6050211", - "code":"Ki0511", - "alerts":[ - - ] - }, - { - "name":"Överby", - "id":"U3RvcDpIU0w6NjA1MDIxMw==", - "gtfsId":"HSL:6050213", - "code":"Ki0513", - "alerts":[ - - ] - }, - { - "name":"Karlbergintie", - "id":"U3RvcDpIU0w6NjA0MDIzNQ==", - "gtfsId":"HSL:6040235", - "code":"Ki0435", - "alerts":[ - - ] - }, - { - "name":"Lindalintie", - "id":"U3RvcDpIU0w6NjA0MDIzMQ==", - "gtfsId":"HSL:6040231", - "code":"Ki0431", - "alerts":[ - - ] - }, - { - "name":"Ravalsinkuja", - "id":"U3RvcDpIU0w6NjA0MDIzMw==", - "gtfsId":"HSL:6040233", - "code":"Ki0433", - "alerts":[ - - ] - }, - { - "name":"Kuusala", - "id":"U3RvcDpIU0w6NjA0MDIzNg==", - "gtfsId":"HSL:6040236", - "code":"Ki0436", - "alerts":[ - - ] - }, - { - "name":"Rajapolku", - "id":"U3RvcDpIU0w6NjA0MDIzOQ==", - "gtfsId":"HSL:6040239", - "code":"Ki0439", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3NQ==", - "gtfsId":"HSL:6040275", - "code":"Ki0475", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3Nw==", - "gtfsId":"HSL:6040277", - "code":"Ki0477", - "alerts":[ - - ] - }, - { - "name":"Kirkkotallintie", - "id":"U3RvcDpIU0w6NjA1MDI1MQ==", - "gtfsId":"HSL:6050251", - "code":"Ki0551", - "alerts":[ - - ] - }, - { - "name":"Kirkkonummi mk", - "id":"U3RvcDpIU0w6NjA0MDI5MQ==", - "gtfsId":"HSL:6040291", - "code":"Ki0491", - "alerts":[ - - ] - } - ], - "activeDates":[ - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA4MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18yXzA3MTA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18yXzA4MDU=" - } - ], - "tripsForDate":[ - { - "stoptimes":[ - { - "scheduledDeparture":25800, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25920, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":25980, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26100, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26400, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26580, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26700, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26820, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":26940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27240, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27300, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27600, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27840, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":28080, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":28200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA3MTA=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":29100, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29220, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29280, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29340, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29400, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29460, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29700, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":29880, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30000, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30120, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30240, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30540, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30600, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":30900, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31140, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31380, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":31500, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA4MDU=" - } - ], - "id":"UGF0dGVybjpIU0w6NjE4MToxOjAx", - "trips":[ - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25800, - "scheduledDeparture":25800, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25860, - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25860, - "scheduledDeparture":25860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25920, - "scheduledDeparture":25920, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":25980, - "scheduledDeparture":25980, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26040, - "scheduledDeparture":26040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26100, - "scheduledDeparture":26100, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26160, - "scheduledDeparture":26160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26400, - "scheduledDeparture":26400, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26580, - "scheduledDeparture":26580, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26700, - "scheduledDeparture":26700, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26820, - "scheduledDeparture":26820, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":26940, - "scheduledDeparture":26940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27240, - "scheduledDeparture":27240, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27300, - "scheduledDeparture":27300, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27480, - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27480, - "scheduledDeparture":27480, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27600, - "scheduledDeparture":27600, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27720, - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27720, - "scheduledDeparture":27720, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27840, - "scheduledDeparture":27840, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27960, - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":27960, - "scheduledDeparture":27960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":28080, - "scheduledDeparture":28080, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":28200, - "scheduledDeparture":28200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA3MTA=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29100, - "scheduledDeparture":29100, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29160, - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29160, - "scheduledDeparture":29160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29220, - "scheduledDeparture":29220, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29280, - "scheduledDeparture":29280, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29340, - "scheduledDeparture":29340, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29400, - "scheduledDeparture":29400, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29460, - "scheduledDeparture":29460, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29700, - "scheduledDeparture":29700, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":29880, - "scheduledDeparture":29880, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30000, - "scheduledDeparture":30000, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30120, - "scheduledDeparture":30120, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30240, - "scheduledDeparture":30240, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30540, - "scheduledDeparture":30540, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30600, - "scheduledDeparture":30600, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30780, - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30780, - "scheduledDeparture":30780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":30900, - "scheduledDeparture":30900, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31020, - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31020, - "scheduledDeparture":31020, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31140, - "scheduledDeparture":31140, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31260, - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31260, - "scheduledDeparture":31260, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31380, - "scheduledDeparture":31380, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31500, - "scheduledDeparture":31500, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8yXzA4MDU=" - } - ] - }, - { - "code":"HSL:6181:0:01", - "directionId":0, - "headsign":"Siuntio", - "stops":[ - { - "name":"Kirkkonummi mk", - "id":"U3RvcDpIU0w6NjA0MDI5NQ==", - "gtfsId":"HSL:6040295", - "code":"Ki0495", - "alerts":[ - - ] - }, - { - "name":"Kirkkotallintie", - "id":"U3RvcDpIU0w6NjA1MDI1MA==", - "gtfsId":"HSL:6050250", - "code":"Ki0550", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3NQ==", - "gtfsId":"HSL:6040275", - "code":"Ki0475", - "alerts":[ - - ] - }, - { - "name":"Gesterbynkaari", - "id":"U3RvcDpIU0w6NjA0MDI3Nw==", - "gtfsId":"HSL:6040277", - "code":"Ki0477", - "alerts":[ - - ] - }, - { - "name":"Rajapolku", - "id":"U3RvcDpIU0w6NjA0MDIzOA==", - "gtfsId":"HSL:6040238", - "code":"Ki0438", - "alerts":[ - - ] - }, - { - "name":"Kuusala", - "id":"U3RvcDpIU0w6NjA0MDIzNw==", - "gtfsId":"HSL:6040237", - "code":"Ki0437", - "alerts":[ - - ] - }, - { - "name":"Ravalsinkuja", - "id":"U3RvcDpIU0w6NjA0MDIzNA==", - "gtfsId":"HSL:6040234", - "code":"Ki0434", - "alerts":[ - - ] - }, - { - "name":"Lindalintie", - "id":"U3RvcDpIU0w6NjA1MDIxOQ==", - "gtfsId":"HSL:6050219", - "code":"Ki0519", - "alerts":[ - - ] - }, - { - "name":"Karlbergintie", - "id":"U3RvcDpIU0w6NjA1MDIxNQ==", - "gtfsId":"HSL:6050215", - "code":"Ki0515", - "alerts":[ - - ] - }, - { - "name":"Överby", - "id":"U3RvcDpIU0w6NjA1MDIxNA==", - "gtfsId":"HSL:6050214", - "code":"Ki0514", - "alerts":[ - - ] - }, - { - "name":"Granbackantie", - "id":"U3RvcDpIU0w6NjA1MDIxMg==", - "gtfsId":"HSL:6050212", - "code":"Ki0512", - "alerts":[ - - ] - }, - { - "name":"Bergträskinpolku", - "id":"U3RvcDpIU0w6NjA1MDIxMA==", - "gtfsId":"HSL:6050210", - "code":"Ki0510", - "alerts":[ - - ] - }, - { - "name":"Itäinen kuninkaantie", - "id":"U3RvcDpIU0w6NjA1MDIxNw==", - "gtfsId":"HSL:6050217", - "code":"Ki0517", - "alerts":[ - - ] - }, - { - "name":"Böle", - "id":"U3RvcDpIU0w6NjMwNjAwMQ==", - "gtfsId":"HSL:6306001", - "code":"So3122", - "alerts":[ - - ] - }, - { - "name":"Kela", - "id":"U3RvcDpIU0w6NjMwNjAwMg==", - "gtfsId":"HSL:6306002", - "code":"So3123", - "alerts":[ - - ] - }, - { - "name":"Tallbacka", - "id":"U3RvcDpIU0w6NjMwNjAwNA==", - "gtfsId":"HSL:6306004", - "code":"So3125", - "alerts":[ - - ] - }, - { - "name":"Pikkalan kartano", - "id":"U3RvcDpIU0w6NjMwNzAwNg==", - "gtfsId":"HSL:6307006", - "code":"So3133", - "alerts":[ - - ] - }, - { - "name":"Pikkala", - "id":"U3RvcDpIU0w6NjMwNzAwNQ==", - "gtfsId":"HSL:6307005", - "code":"So3132", - "alerts":[ - - ] - }, - { - "name":"Sienitie", - "id":"U3RvcDpIU0w6NjMwNDAwNA==", - "gtfsId":"HSL:6304004", - "code":"So3115", - "alerts":[ - - ] - }, - { - "name":"Störsvik th", - "id":"U3RvcDpIU0w6NjMwNDAwNQ==", - "gtfsId":"HSL:6304005", - "code":"So3116", - "alerts":[ - - ] - }, - { - "name":"Kalliotie", - "id":"U3RvcDpIU0w6NjMwNDAwMw==", - "gtfsId":"HSL:6304003", - "code":"So3114", - "alerts":[ - - ] - }, - { - "name":"Ruohosuontie", - "id":"U3RvcDpIU0w6NjMwNDAwOQ==", - "gtfsId":"HSL:6304009", - "code":"So3120", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwNDAwOA==", - "gtfsId":"HSL:6304008", - "code":"So3119", - "alerts":[ - - ] - }, - { - "name":"Sunnanvik", - "id":"U3RvcDpIU0w6NjMwMjAxOA==", - "gtfsId":"HSL:6302018", - "code":"So3100", - "alerts":[ - - ] - }, - { - "name":"Degerbyntie", - "id":"U3RvcDpIU0w6NjMwMjAwNQ==", - "gtfsId":"HSL:6302005", - "code":"So3087", - "alerts":[ - - ] - }, - { - "name":"Nordanvik tiehaara", - "id":"U3RvcDpIU0w6NjMwMjAwOA==", - "gtfsId":"HSL:6302008", - "code":"So3090", - "alerts":[ - - ] - }, - { - "name":"Billskogintie", - "id":"U3RvcDpIU0w6NjMwMjAwMA==", - "gtfsId":"HSL:6302000", - "code":"So3082", - "alerts":[ - - ] - }, - { - "name":"Sudenkaari", - "id":"U3RvcDpIU0w6NjMwMjAxNw==", - "gtfsId":"HSL:6302017", - "code":"So3099", - "alerts":[ - - ] - }, - { - "name":"Siuntio matkahuolto", - "id":"U3RvcDpIU0w6NjMwMjAxMg==", - "gtfsId":"HSL:6302012", - "code":"So3094", - "alerts":[ - - ] - } - ], - "activeDates":[ - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_UA", - "day":[ - "20211231" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9VQV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ke", - "day":[ - "20220112", - "20220202", - "20220119", - "20220209", - "20220126" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9LZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_To", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9Ub18xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ma", - "day":[ - "20220103" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ti", - "day":[ - "20220104" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9UaV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ma", - "day":[ - "20220131", - "20220117", - "20220207", - "20220124", - "20220110" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9NYV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Pe", - "day":[ - "20220105", - "20220107" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9QZV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_To", - "day":[ - "20220113", - "20220203", - "20220120", - "20220210", - "20220127" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9Ub18xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Ti", - "day":[ - "20220201", - "20220118", - "20220208", - "20220125", - "20220111" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9UaV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20211231_20220109_Ke", - "day":[ - - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9LZV8xXzE0MDU=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8xXzE1MzA=" - }, - { - "serviceId":"HSL:6181_20220110_20220213_Pe", - "day":[ - "20220128", - "20220114", - "20220204", - "20220121", - "20220211" - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIyMDExMF9QZV8xXzE0MDU=" - } - ], - "tripsForDate":[ - { - "stoptimes":[ - { - "scheduledDeparture":50700, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50760, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50880, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51000, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51120, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51180, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51360, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51480, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51540, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51660, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":51840, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52200, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52440, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52560, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52620, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52680, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52800, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":52980, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":53040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":53100, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":55800, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55860, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":55980, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56100, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56220, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56280, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56460, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56580, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56640, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56760, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56880, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":56940, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57300, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57540, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57660, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57720, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57780, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57900, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":58080, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":58140, - "serviceDay":1640728800 - }, - { - "scheduledDeparture":58200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - } - ], - "id":"UGF0dGVybjpIU0w6NjE4MTowOjAx", - "trips":[ - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50700, - "scheduledDeparture":50700, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50760, - "scheduledDeparture":50760, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50820, - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50820, - "scheduledDeparture":50820, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50880, - "scheduledDeparture":50880, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50940, - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50940, - "scheduledDeparture":50940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51000, - "scheduledDeparture":51000, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51060, - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51060, - "scheduledDeparture":51060, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51120, - "scheduledDeparture":51120, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51180, - "scheduledDeparture":51180, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51360, - "scheduledDeparture":51360, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51480, - "scheduledDeparture":51480, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51540, - "scheduledDeparture":51540, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51660, - "scheduledDeparture":51660, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51780, - "scheduledDeparture":51780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51840, - "scheduledDeparture":51840, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52200, - "scheduledDeparture":52200, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52440, - "scheduledDeparture":52440, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52560, - "scheduledDeparture":52560, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52620, - "scheduledDeparture":52620, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52680, - "scheduledDeparture":52680, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52800, - "scheduledDeparture":52800, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52860, - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52860, - "scheduledDeparture":52860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52980, - "scheduledDeparture":52980, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53040, - "scheduledDeparture":53040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53100, - "scheduledDeparture":53100, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE0MDU=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55800, - "scheduledDeparture":55800, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55860, - "scheduledDeparture":55860, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55920, - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55920, - "scheduledDeparture":55920, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55980, - "scheduledDeparture":55980, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56040, - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56040, - "scheduledDeparture":56040, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56100, - "scheduledDeparture":56100, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56160, - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56160, - "scheduledDeparture":56160, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56220, - "scheduledDeparture":56220, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56280, - "scheduledDeparture":56280, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56460, - "scheduledDeparture":56460, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56580, - "scheduledDeparture":56580, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56640, - "scheduledDeparture":56640, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56760, - "scheduledDeparture":56760, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56880, - "scheduledDeparture":56880, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56940, - "scheduledDeparture":56940, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57300, - "scheduledDeparture":57300, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57540, - "scheduledDeparture":57540, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57660, - "scheduledDeparture":57660, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57720, - "scheduledDeparture":57720, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57780, - "scheduledDeparture":57780, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57900, - "scheduledDeparture":57900, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57960, - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57960, - "scheduledDeparture":57960, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":58080, - "scheduledDeparture":58080, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":58140, - "scheduledDeparture":58140, - "serviceDay":1640728800 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":58200, - "scheduledDeparture":58200, - "serviceDay":1640728800 - } - ], - "id":"VHJpcDpIU0w6NjE4MV8yMDIxMTIzMV9NYV8xXzE1MzA=" - } - ] - } - ], - "alerts":[ - - ], - "id":"Um91dGU6SFNMOjYxODE=" - } - } - }, - "id":"routeRoutes_PatternStopsContainer_Query" - } - ] \ No newline at end of file diff --git a/test/e2e/mock-data/RoutePageBatchTampereResponse.json b/test/e2e/mock-data/RoutePageBatchTampereResponse.json deleted file mode 100644 index 5638e91143..0000000000 --- a/test/e2e/mock-data/RoutePageBatchTampereResponse.json +++ /dev/null @@ -1,10560 +0,0 @@ -[ - { - "payload":{ - "data":{ - "route":{ - "gtfsId":"tampere:66A6957", - "shortName":"66A", - "color":null, - "mode":"BUS", - "type":3, - "id":"Um91dGU6dGFtcGVyZTo2NkE2OTU3" - } - } - }, - "id":"routeRoutes_RouteTitle_Query" - }, - { - "payload":{ - "data":{ - "route":{ - "shortName":"66A", - "longName":"Valkeakoski - Pispantalli - Metsäkansa - Rantoo", - "id":"Um91dGU6dGFtcGVyZTo2NkE2OTU3" - } - } - }, - "id":"routeRoutes_RoutePageMeta_Query" - }, - { - "payload":{ - "data":{ - "route":{ - "gtfsId":"tampere:66A6957", - "color":null, - "shortName":"66A", - "longName":"Valkeakoski - Pispantalli - Metsäkansa - Rantoo", - "mode":"BUS", - "type":3, - "agency":{ - "name":"Nysse/Vekka Group Oy", - "url":"http://joukkoliikenne.tampere.fi/", - "fareUrl":null, - "id":"QWdlbmN5OnRhbXBlcmU6Njk1Nw==", - "phone":"+358356564700" - }, - "patterns":[ - { - "code":"tampere:66A6957:0:01", - "directionId":0, - "headsign":"Metsäkansa", - "stops":[ - { - "name":"Valkeakosken linja-autoasema", - "id":"U3RvcDp0YW1wZXJlOjEwMDAw", - "gtfsId":"tampere:10000", - "code":"10000", - "alerts":[ - - ] - }, - { - "name":"Valkeakosken kauppatori", - "id":"U3RvcDp0YW1wZXJlOjg5NzU=", - "gtfsId":"tampere:8975", - "code":"8975", - "alerts":[ - - ] - }, - { - "name":"Valkeakosken aluesairaala", - "id":"U3RvcDp0YW1wZXJlOjg5NzM=", - "gtfsId":"tampere:8973", - "code":"8973", - "alerts":[ - - ] - }, - { - "name":"Alppikatu", - "id":"U3RvcDp0YW1wZXJlOjg5NzE=", - "gtfsId":"tampere:8971", - "code":"8971", - "alerts":[ - - ] - }, - { - "name":"Roopenkatu", - "id":"U3RvcDp0YW1wZXJlOjg5Njk=", - "gtfsId":"tampere:8969", - "code":"8969", - "alerts":[ - - ] - }, - { - "name":"Tallikatu", - "id":"U3RvcDp0YW1wZXJlOjg5Njc=", - "gtfsId":"tampere:8967", - "code":"8967", - "alerts":[ - - ] - }, - { - "name":"Kirjaskatu", - "id":"U3RvcDp0YW1wZXJlOjg5NjU=", - "gtfsId":"tampere:8965", - "code":"8965", - "alerts":[ - - ] - }, - { - "name":"Antinkulma", - "id":"U3RvcDp0YW1wZXJlOjg5NjM=", - "gtfsId":"tampere:8963", - "code":"8963", - "alerts":[ - - ] - }, - { - "name":"Kenraalintori P", - "id":"U3RvcDp0YW1wZXJlOjg5NjE=", - "gtfsId":"tampere:8961", - "code":"8961", - "alerts":[ - - ] - }, - { - "name":"Roukonmäki", - "id":"U3RvcDp0YW1wZXJlOjkwODM=", - "gtfsId":"tampere:9083", - "code":"9083", - "alerts":[ - - ] - }, - { - "name":"Roukontie 20", - "id":"U3RvcDp0YW1wZXJlOjkwODE=", - "gtfsId":"tampere:9081", - "code":"9081", - "alerts":[ - - ] - }, - { - "name":"Roukon koulu", - "id":"U3RvcDp0YW1wZXJlOjkwNzk=", - "gtfsId":"tampere:9079", - "code":"9079", - "alerts":[ - - ] - }, - { - "name":"Vääränkoivuntie", - "id":"U3RvcDp0YW1wZXJlOjg3MTY=", - "gtfsId":"tampere:8716", - "code":"8716", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 56", - "id":"U3RvcDp0YW1wZXJlOjg3MTg=", - "gtfsId":"tampere:8718", - "code":"8718", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 35", - "id":"U3RvcDp0YW1wZXJlOjg3MzY=", - "gtfsId":"tampere:8736", - "code":"8736", - "alerts":[ - - ] - }, - { - "name":"VAAO", - "id":"U3RvcDp0YW1wZXJlOjg5ODI=", - "gtfsId":"tampere:8982", - "code":"8982", - "alerts":[ - - ] - }, - { - "name":"Koulukampus", - "id":"U3RvcDp0YW1wZXJlOjk4MTU=", - "gtfsId":"tampere:9815", - "code":"9815", - "alerts":[ - - ] - }, - { - "name":"Juusonranta L", - "id":"U3RvcDp0YW1wZXJlOjk4MTc=", - "gtfsId":"tampere:9817", - "code":"9817", - "alerts":[ - - ] - }, - { - "name":"Pispantalli L", - "id":"U3RvcDp0YW1wZXJlOjk4MTk=", - "gtfsId":"tampere:9819", - "code":"9819", - "alerts":[ - - ] - }, - { - "name":"Savilahti L", - "id":"U3RvcDp0YW1wZXJlOjk4NjE=", - "gtfsId":"tampere:9861", - "code":"9861", - "alerts":[ - - ] - }, - { - "name":"Eläinsairaala L", - "id":"U3RvcDp0YW1wZXJlOjk4NjM=", - "gtfsId":"tampere:9863", - "code":"9863", - "alerts":[ - - ] - }, - { - "name":"Yli-Nissi L", - "id":"U3RvcDp0YW1wZXJlOjk4NjU=", - "gtfsId":"tampere:9865", - "code":"9865", - "alerts":[ - - ] - }, - { - "name":"Kärpäntie L", - "id":"U3RvcDp0YW1wZXJlOjk4Njc=", - "gtfsId":"tampere:9867", - "code":"9867", - "alerts":[ - - ] - }, - { - "name":"Kärjenniemen koulu", - "id":"U3RvcDp0YW1wZXJlOjk4Njk=", - "gtfsId":"tampere:9869", - "code":"9869", - "alerts":[ - - ] - }, - { - "name":"Pastintie L", - "id":"U3RvcDp0YW1wZXJlOjk4NzE=", - "gtfsId":"tampere:9871", - "code":"9871", - "alerts":[ - - ] - }, - { - "name":"Rantoon th P", - "id":"U3RvcDp0YW1wZXJlOjk4NzM=", - "gtfsId":"tampere:9873", - "code":"9873", - "alerts":[ - - ] - }, - { - "name":"Metsäkansantie 373", - "id":"U3RvcDp0YW1wZXJlOjk0MDk=", - "gtfsId":"tampere:9409", - "code":"9409", - "alerts":[ - - ] - }, - { - "name":"Metsäkansantie 177", - "id":"U3RvcDp0YW1wZXJlOjk0MTE=", - "gtfsId":"tampere:9411", - "code":"9411", - "alerts":[ - - ] - }, - { - "name":"Horkantie 2", - "id":"U3RvcDp0YW1wZXJlOjk0MTM=", - "gtfsId":"tampere:9413", - "code":"9413", - "alerts":[ - - ] - }, - { - "name":"Metsäkansa", - "id":"U3RvcDp0YW1wZXJlOjk0MTU=", - "gtfsId":"tampere:9415", - "code":"9415", - "alerts":[ - - ] - }, - { - "name":"Iola", - "id":"U3RvcDp0YW1wZXJlOjk0MTc=", - "gtfsId":"tampere:9417", - "code":"9417", - "alerts":[ - - ] - }, - { - "name":"Rantoo", - "id":"U3RvcDp0YW1wZXJlOjk0MTk=", - "gtfsId":"tampere:9419", - "code":"9419", - "alerts":[ - - ] - }, - { - "name":"Mustilahti", - "id":"U3RvcDp0YW1wZXJlOjk0MjE=", - "gtfsId":"tampere:9421", - "code":"9421", - "alerts":[ - - ] - }, - { - "name":"Vääränmäentie 27", - "id":"U3RvcDp0YW1wZXJlOjk0MjM=", - "gtfsId":"tampere:9423", - "code":"9423", - "alerts":[ - - ] - }, - { - "name":"Kärjenniemen koulu", - "id":"U3RvcDp0YW1wZXJlOjk4Njg=", - "gtfsId":"tampere:9868", - "code":"9868", - "alerts":[ - - ] - }, - { - "name":"Kärpäntie I", - "id":"U3RvcDp0YW1wZXJlOjk4NjY=", - "gtfsId":"tampere:9866", - "code":"9866", - "alerts":[ - - ] - }, - { - "name":"Yli-Nissi", - "id":"U3RvcDp0YW1wZXJlOjk4NjQ=", - "gtfsId":"tampere:9864", - "code":"9864", - "alerts":[ - - ] - }, - { - "name":"Eläinsairaala I", - "id":"U3RvcDp0YW1wZXJlOjk4NjI=", - "gtfsId":"tampere:9862", - "code":"9862", - "alerts":[ - - ] - }, - { - "name":"Savilahti I", - "id":"U3RvcDp0YW1wZXJlOjk4NjA=", - "gtfsId":"tampere:9860", - "code":"9860", - "alerts":[ - - ] - }, - { - "name":"Pispantalli I", - "id":"U3RvcDp0YW1wZXJlOjk4MjA=", - "gtfsId":"tampere:9820", - "code":"9820", - "alerts":[ - - ] - }, - { - "name":"Juusonranta I", - "id":"U3RvcDp0YW1wZXJlOjk4MTg=", - "gtfsId":"tampere:9818", - "code":"9818", - "alerts":[ - - ] - }, - { - "name":"Tietotie I", - "id":"U3RvcDp0YW1wZXJlOjk4MTY=", - "gtfsId":"tampere:9816", - "code":"9816", - "alerts":[ - - ] - }, - { - "name":"Koulukampus", - "id":"U3RvcDp0YW1wZXJlOjg5ODM=", - "gtfsId":"tampere:8983", - "code":"8983", - "alerts":[ - - ] - }, - { - "name":"Mäntyläntie", - "id":"U3RvcDp0YW1wZXJlOjg3Mzk=", - "gtfsId":"tampere:8739", - "code":"8739", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 34", - "id":"U3RvcDp0YW1wZXJlOjg3Mzc=", - "gtfsId":"tampere:8737", - "code":"8737", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 56", - "id":"U3RvcDp0YW1wZXJlOjg3MTk=", - "gtfsId":"tampere:8719", - "code":"8719", - "alerts":[ - - ] - }, - { - "name":"Vääränkoivuntie", - "id":"U3RvcDp0YW1wZXJlOjg3MTM=", - "gtfsId":"tampere:8713", - "code":"8713", - "alerts":[ - - ] - }, - { - "name":"Roukon koulu", - "id":"U3RvcDp0YW1wZXJlOjkwNzg=", - "gtfsId":"tampere:9078", - "code":"9078", - "alerts":[ - - ] - }, - { - "name":"Roukontie 25", - "id":"U3RvcDp0YW1wZXJlOjkwODA=", - "gtfsId":"tampere:9080", - "code":"9080", - "alerts":[ - - ] - }, - { - "name":"Roukonmäki", - "id":"U3RvcDp0YW1wZXJlOjkwODI=", - "gtfsId":"tampere:9082", - "code":"9082", - "alerts":[ - - ] - }, - { - "name":"Kenraalintori E", - "id":"U3RvcDp0YW1wZXJlOjg5NjI=", - "gtfsId":"tampere:8962", - "code":"8962", - "alerts":[ - - ] - }, - { - "name":"Antinkulma", - "id":"U3RvcDp0YW1wZXJlOjg5NjQ=", - "gtfsId":"tampere:8964", - "code":"8964", - "alerts":[ - - ] - }, - { - "name":"Kirjaskatu", - "id":"U3RvcDp0YW1wZXJlOjg5NjY=", - "gtfsId":"tampere:8966", - "code":"8966", - "alerts":[ - - ] - }, - { - "name":"Tallikatu", - "id":"U3RvcDp0YW1wZXJlOjg5Njg=", - "gtfsId":"tampere:8968", - "code":"8968", - "alerts":[ - - ] - }, - { - "name":"Roopenkatu", - "id":"U3RvcDp0YW1wZXJlOjg5NzA=", - "gtfsId":"tampere:8970", - "code":"8970", - "alerts":[ - - ] - }, - { - "name":"Aluesairaala", - "id":"U3RvcDp0YW1wZXJlOjg5NzQ=", - "gtfsId":"tampere:8974", - "code":"8974", - "alerts":[ - - ] - }, - { - "name":"Valkeakoski Kauppatori", - "id":"U3RvcDp0YW1wZXJlOjg5Nzg=", - "gtfsId":"tampere:8978", - "code":"8978", - "alerts":[ - - ] - }, - { - "name":"Valkeakosken linja-autoasema", - "id":"U3RvcDp0YW1wZXJlOjg5OTc=", - "gtfsId":"tampere:8997", - "code":"8997", - "alerts":[ - - ] - } - ], - "activeDates":[ - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU5MjM=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4OTA=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4OTA=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU5MjM=" - }, - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU5MjM=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4OTA=" - }, - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU5MjM=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4OTA=" - } - ], - "tripsForDate":[ - { - "stoptimes":[ - { - "scheduledDeparture":54600, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54660, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54810, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54840, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54870, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54900, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54930, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54960, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54990, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55020, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55035, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55050, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55080, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55110, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55140, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55215, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55275, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55305, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55335, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55365, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55395, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55425, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55455, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55515, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55545, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55605, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55785, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55800, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55845, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56025, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56100, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56445, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56685, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56745, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56775, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56805, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56835, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56865, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56895, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56955, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56985, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57015, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57075, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57105, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57135, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57165, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57195, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57225, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57285, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57345, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57375, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57435, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57495, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57555, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57720, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57840, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":47400, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47460, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47610, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47640, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47670, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47700, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47730, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47760, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47790, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47820, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47835, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47850, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47880, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47910, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47940, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48015, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48045, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48075, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48105, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48135, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48165, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48195, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48225, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48255, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48315, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48345, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48405, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48585, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48630, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48825, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48900, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49485, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49545, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49575, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49605, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49635, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49665, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49695, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49755, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49785, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49815, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49875, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49905, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49935, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49965, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49995, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50025, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50085, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50145, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50175, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50235, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50295, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50355, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50445, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50520, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50640, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":51000, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51060, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51210, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51240, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51270, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51300, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51330, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51360, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51390, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51420, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51435, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51450, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51480, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51510, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51540, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51615, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51675, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51705, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51735, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51765, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51795, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51825, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51855, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51915, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51945, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52005, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52185, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52200, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52425, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52500, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52845, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53085, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53145, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53175, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53205, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53235, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53265, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53295, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53355, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53385, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53415, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53475, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53505, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53535, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53565, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53595, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53625, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53685, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53745, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53775, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53835, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53895, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53955, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54045, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54120, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54240, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":31500, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31560, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31710, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31740, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31770, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31800, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31830, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31860, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31890, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31920, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31935, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31950, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31980, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32010, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32040, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32115, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32145, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32175, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32205, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32235, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32265, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32295, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32325, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32355, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32415, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32445, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32505, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32685, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32745, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33000, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33120, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33300, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33345, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33585, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33675, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33705, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33735, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33765, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33795, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33855, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33885, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33915, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33975, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34005, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34035, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34065, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34095, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34125, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34185, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34275, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34335, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34395, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34455, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34545, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34620, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34740, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - } - ], - "id":"UGF0dGVybjp0YW1wZXJlOjY2QTY5NTc6MDowMQ==", - "trips":[ - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54600, - "scheduledDeparture":54600, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54660, - "scheduledDeparture":54660, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54810, - "scheduledDeparture":54810, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54840, - "scheduledDeparture":54840, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54870, - "scheduledDeparture":54870, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54900, - "scheduledDeparture":54900, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54930, - "scheduledDeparture":54930, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54960, - "scheduledDeparture":54960, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54990, - "scheduledDeparture":54990, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55020, - "scheduledDeparture":55020, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55035, - "scheduledDeparture":55035, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55050, - "scheduledDeparture":55050, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55080, - "scheduledDeparture":55080, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55110, - "scheduledDeparture":55110, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55140, - "scheduledDeparture":55140, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55215, - "scheduledDeparture":55215, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55245, - "scheduledDeparture":55245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55275, - "scheduledDeparture":55275, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55305, - "scheduledDeparture":55305, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55335, - "scheduledDeparture":55335, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55365, - "scheduledDeparture":55365, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55395, - "scheduledDeparture":55395, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55425, - "scheduledDeparture":55425, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55455, - "scheduledDeparture":55455, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55515, - "scheduledDeparture":55515, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55545, - "scheduledDeparture":55545, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55605, - "scheduledDeparture":55605, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55785, - "scheduledDeparture":55785, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55800, - "scheduledDeparture":55800, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55845, - "scheduledDeparture":55845, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56025, - "scheduledDeparture":56025, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56100, - "scheduledDeparture":56100, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56445, - "scheduledDeparture":56445, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56685, - "scheduledDeparture":56685, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56745, - "scheduledDeparture":56745, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56775, - "scheduledDeparture":56775, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56805, - "scheduledDeparture":56805, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56835, - "scheduledDeparture":56835, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56865, - "scheduledDeparture":56865, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56895, - "scheduledDeparture":56895, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56955, - "scheduledDeparture":56955, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56985, - "scheduledDeparture":56985, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57015, - "scheduledDeparture":57015, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57075, - "scheduledDeparture":57075, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57105, - "scheduledDeparture":57105, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57135, - "scheduledDeparture":57135, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57165, - "scheduledDeparture":57165, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57195, - "scheduledDeparture":57195, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57225, - "scheduledDeparture":57225, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57285, - "scheduledDeparture":57285, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57345, - "scheduledDeparture":57345, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57375, - "scheduledDeparture":57375, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57435, - "scheduledDeparture":57435, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57495, - "scheduledDeparture":57495, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57555, - "scheduledDeparture":57555, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57645, - "scheduledDeparture":57645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57720, - "scheduledDeparture":57720, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57840, - "scheduledDeparture":57840, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47400, - "scheduledDeparture":47400, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47460, - "scheduledDeparture":47460, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47610, - "scheduledDeparture":47610, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47640, - "scheduledDeparture":47640, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47670, - "scheduledDeparture":47670, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47700, - "scheduledDeparture":47700, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47730, - "scheduledDeparture":47730, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47760, - "scheduledDeparture":47760, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47790, - "scheduledDeparture":47790, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47820, - "scheduledDeparture":47820, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47835, - "scheduledDeparture":47835, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47850, - "scheduledDeparture":47850, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47880, - "scheduledDeparture":47880, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47910, - "scheduledDeparture":47910, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47940, - "scheduledDeparture":47940, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48015, - "scheduledDeparture":48015, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48045, - "scheduledDeparture":48045, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48075, - "scheduledDeparture":48075, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48105, - "scheduledDeparture":48105, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48135, - "scheduledDeparture":48135, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48165, - "scheduledDeparture":48165, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48195, - "scheduledDeparture":48195, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48225, - "scheduledDeparture":48225, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48255, - "scheduledDeparture":48255, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48315, - "scheduledDeparture":48315, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48345, - "scheduledDeparture":48345, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48405, - "scheduledDeparture":48405, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48585, - "scheduledDeparture":48585, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48630, - "scheduledDeparture":48630, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48645, - "scheduledDeparture":48645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48825, - "scheduledDeparture":48825, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48900, - "scheduledDeparture":48900, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49245, - "scheduledDeparture":49245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49485, - "scheduledDeparture":49485, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49545, - "scheduledDeparture":49545, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49575, - "scheduledDeparture":49575, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49605, - "scheduledDeparture":49605, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49635, - "scheduledDeparture":49635, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49665, - "scheduledDeparture":49665, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49695, - "scheduledDeparture":49695, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49755, - "scheduledDeparture":49755, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49785, - "scheduledDeparture":49785, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49815, - "scheduledDeparture":49815, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49875, - "scheduledDeparture":49875, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49905, - "scheduledDeparture":49905, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49935, - "scheduledDeparture":49935, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49965, - "scheduledDeparture":49965, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49995, - "scheduledDeparture":49995, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50025, - "scheduledDeparture":50025, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50085, - "scheduledDeparture":50085, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50145, - "scheduledDeparture":50145, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50175, - "scheduledDeparture":50175, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50235, - "scheduledDeparture":50235, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50295, - "scheduledDeparture":50295, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50355, - "scheduledDeparture":50355, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50445, - "scheduledDeparture":50445, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50520, - "scheduledDeparture":50520, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50640, - "scheduledDeparture":50640, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51000, - "scheduledDeparture":51000, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51060, - "scheduledDeparture":51060, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51210, - "scheduledDeparture":51210, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51240, - "scheduledDeparture":51240, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51270, - "scheduledDeparture":51270, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51300, - "scheduledDeparture":51300, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51330, - "scheduledDeparture":51330, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51360, - "scheduledDeparture":51360, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51390, - "scheduledDeparture":51390, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51420, - "scheduledDeparture":51420, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51435, - "scheduledDeparture":51435, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51450, - "scheduledDeparture":51450, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51480, - "scheduledDeparture":51480, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51510, - "scheduledDeparture":51510, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51540, - "scheduledDeparture":51540, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51615, - "scheduledDeparture":51615, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51645, - "scheduledDeparture":51645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51675, - "scheduledDeparture":51675, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51705, - "scheduledDeparture":51705, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51735, - "scheduledDeparture":51735, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51765, - "scheduledDeparture":51765, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51795, - "scheduledDeparture":51795, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51825, - "scheduledDeparture":51825, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51855, - "scheduledDeparture":51855, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51915, - "scheduledDeparture":51915, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51945, - "scheduledDeparture":51945, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52005, - "scheduledDeparture":52005, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52185, - "scheduledDeparture":52185, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52200, - "scheduledDeparture":52200, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52245, - "scheduledDeparture":52245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52425, - "scheduledDeparture":52425, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52500, - "scheduledDeparture":52500, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52845, - "scheduledDeparture":52845, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53085, - "scheduledDeparture":53085, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53145, - "scheduledDeparture":53145, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53175, - "scheduledDeparture":53175, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53205, - "scheduledDeparture":53205, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53235, - "scheduledDeparture":53235, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53265, - "scheduledDeparture":53265, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53295, - "scheduledDeparture":53295, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53355, - "scheduledDeparture":53355, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53385, - "scheduledDeparture":53385, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53415, - "scheduledDeparture":53415, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53475, - "scheduledDeparture":53475, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53505, - "scheduledDeparture":53505, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53535, - "scheduledDeparture":53535, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53565, - "scheduledDeparture":53565, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53595, - "scheduledDeparture":53595, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53625, - "scheduledDeparture":53625, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53685, - "scheduledDeparture":53685, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53745, - "scheduledDeparture":53745, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53775, - "scheduledDeparture":53775, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53835, - "scheduledDeparture":53835, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53895, - "scheduledDeparture":53895, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53955, - "scheduledDeparture":53955, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54045, - "scheduledDeparture":54045, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54120, - "scheduledDeparture":54120, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54240, - "scheduledDeparture":54240, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31500, - "scheduledDeparture":31500, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31560, - "scheduledDeparture":31560, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31710, - "scheduledDeparture":31710, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31740, - "scheduledDeparture":31740, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31770, - "scheduledDeparture":31770, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31800, - "scheduledDeparture":31800, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31830, - "scheduledDeparture":31830, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31860, - "scheduledDeparture":31860, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31890, - "scheduledDeparture":31890, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31920, - "scheduledDeparture":31920, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31935, - "scheduledDeparture":31935, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31950, - "scheduledDeparture":31950, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31980, - "scheduledDeparture":31980, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32010, - "scheduledDeparture":32010, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32040, - "scheduledDeparture":32040, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32115, - "scheduledDeparture":32115, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32145, - "scheduledDeparture":32145, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32175, - "scheduledDeparture":32175, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32205, - "scheduledDeparture":32205, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32235, - "scheduledDeparture":32235, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32265, - "scheduledDeparture":32265, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32295, - "scheduledDeparture":32295, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32325, - "scheduledDeparture":32325, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32355, - "scheduledDeparture":32355, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32415, - "scheduledDeparture":32415, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32445, - "scheduledDeparture":32445, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32505, - "scheduledDeparture":32505, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32685, - "scheduledDeparture":32685, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32745, - "scheduledDeparture":32745, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33000, - "scheduledDeparture":33000, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33120, - "scheduledDeparture":33120, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33300, - "scheduledDeparture":33300, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33345, - "scheduledDeparture":33345, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33585, - "scheduledDeparture":33585, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33645, - "scheduledDeparture":33645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33675, - "scheduledDeparture":33675, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33705, - "scheduledDeparture":33705, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33735, - "scheduledDeparture":33735, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33765, - "scheduledDeparture":33765, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33795, - "scheduledDeparture":33795, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33855, - "scheduledDeparture":33855, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33885, - "scheduledDeparture":33885, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33915, - "scheduledDeparture":33915, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33975, - "scheduledDeparture":33975, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34005, - "scheduledDeparture":34005, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34035, - "scheduledDeparture":34035, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34065, - "scheduledDeparture":34065, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34095, - "scheduledDeparture":34095, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34125, - "scheduledDeparture":34125, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34185, - "scheduledDeparture":34185, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34245, - "scheduledDeparture":34245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34275, - "scheduledDeparture":34275, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34335, - "scheduledDeparture":34335, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34395, - "scheduledDeparture":34395, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34455, - "scheduledDeparture":34455, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34545, - "scheduledDeparture":34545, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34620, - "scheduledDeparture":34620, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34740, - "scheduledDeparture":34740, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - } - ] - } - ], - "alerts":[ - - ], - "id":"Um91dGU6dGFtcGVyZTo2NkE2OTU3" - } - } - }, - "id":"routeRoutes_RoutePage_Query" - }, - { - "payload":{ - "data":{ - "pattern":{ - "code":"tampere:66A6957:0:01", - "directionId":0, - "headsign":"Metsäkansa", - "geometry":[ - { - "lat":61.26373, - "lon":24.03426 - }, - { - "lat":61.26763, - "lon":24.031 - }, - { - "lat":61.27072, - "lon":24.02918 - }, - { - "lat":61.27171, - "lon":24.02851 - }, - { - "lat":61.27143, - "lon":24.02329 - }, - { - "lat":61.27156, - "lon":24.0217 - }, - { - "lat":61.27378, - "lon":24.0199 - }, - { - "lat":61.27636, - "lon":24.01792 - }, - { - "lat":61.27774, - "lon":24.01691 - }, - { - "lat":61.27999, - "lon":24.01582 - }, - { - "lat":61.28182, - "lon":24.01451 - }, - { - "lat":61.28368, - "lon":24.01318 - }, - { - "lat":61.28491, - "lon":24.01032 - }, - { - "lat":61.28498, - "lon":24.00609 - }, - { - "lat":61.28397, - "lon":24.00098 - }, - { - "lat":61.28113, - "lon":23.99429 - }, - { - "lat":61.27998, - "lon":23.99101 - }, - { - "lat":61.27794, - "lon":23.98531 - }, - { - "lat":61.27441, - "lon":23.97542 - }, - { - "lat":61.27152, - "lon":23.96893 - }, - { - "lat":61.26652, - "lon":23.95605 - }, - { - "lat":61.26407, - "lon":23.9487 - }, - { - "lat":61.26185, - "lon":23.94067 - }, - { - "lat":61.26024, - "lon":23.93499 - }, - { - "lat":61.25897, - "lon":23.92637 - }, - { - "lat":61.25592, - "lon":23.92361 - }, - { - "lat":61.26045, - "lon":23.89711 - }, - { - "lat":61.24611, - "lon":23.88634 - }, - { - "lat":61.24385, - "lon":23.88246 - }, - { - "lat":61.23271, - "lon":23.87919 - }, - { - "lat":61.22967, - "lon":23.87766 - }, - { - "lat":61.2214, - "lon":23.9561 - }, - { - "lat":61.23625, - "lon":23.94609 - }, - { - "lat":61.25741, - "lon":23.92852 - }, - { - "lat":61.26068, - "lon":23.93663 - }, - { - "lat":61.26214, - "lon":23.94238 - }, - { - "lat":61.26372, - "lon":23.94812 - }, - { - "lat":61.26581, - "lon":23.95467 - }, - { - "lat":61.27026, - "lon":23.96711 - }, - { - "lat":61.27479, - "lon":23.97689 - }, - { - "lat":61.27853, - "lon":23.98762 - }, - { - "lat":61.27987, - "lon":23.99118 - }, - { - "lat":61.28064, - "lon":23.99374 - }, - { - "lat":61.28322, - "lon":23.9999 - }, - { - "lat":61.28395, - "lon":24.0016 - }, - { - "lat":61.28489, - "lon":24.00623 - }, - { - "lat":61.28486, - "lon":24.00976 - }, - { - "lat":61.28348, - "lon":24.01321 - }, - { - "lat":61.28194, - "lon":24.01429 - }, - { - "lat":61.2799, - "lon":24.01572 - }, - { - "lat":61.27776, - "lon":24.01639 - }, - { - "lat":61.27577, - "lon":24.01783 - }, - { - "lat":61.27358, - "lon":24.01979 - }, - { - "lat":61.27192, - "lon":24.02094 - }, - { - "lat":61.27136, - "lon":24.02349 - }, - { - "lat":61.27018, - "lon":24.02933 - }, - { - "lat":61.2667, - "lon":24.03132 - }, - { - "lat":61.26416, - "lon":24.03355 - } - ], - "stops":[ - { - "lat":61.26373, - "lon":24.03426, - "name":"Valkeakosken linja-autoasema", - "gtfsId":"tampere:10000", - "code":"10000", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjEwMDAw", - "platformCode":null - }, - { - "lat":61.26763, - "lon":24.031, - "name":"Valkeakosken kauppatori", - "gtfsId":"tampere:8975", - "code":"8975", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NzU=", - "platformCode":null - }, - { - "lat":61.27072, - "lon":24.02918, - "name":"Valkeakosken aluesairaala", - "gtfsId":"tampere:8973", - "code":"8973", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NzM=", - "platformCode":null - }, - { - "lat":61.27171, - "lon":24.02851, - "name":"Alppikatu", - "gtfsId":"tampere:8971", - "code":"8971", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NzE=", - "platformCode":null - }, - { - "lat":61.27143, - "lon":24.02329, - "name":"Roopenkatu", - "gtfsId":"tampere:8969", - "code":"8969", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5Njk=", - "platformCode":null - }, - { - "lat":61.27156, - "lon":24.0217, - "name":"Tallikatu", - "gtfsId":"tampere:8967", - "code":"8967", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5Njc=", - "platformCode":null - }, - { - "lat":61.27378, - "lon":24.0199, - "name":"Kirjaskatu", - "gtfsId":"tampere:8965", - "code":"8965", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NjU=", - "platformCode":null - }, - { - "lat":61.27636, - "lon":24.01792, - "name":"Antinkulma", - "gtfsId":"tampere:8963", - "code":"8963", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NjM=", - "platformCode":null - }, - { - "lat":61.27774, - "lon":24.01691, - "name":"Kenraalintori P", - "gtfsId":"tampere:8961", - "code":"8961", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NjE=", - "platformCode":null - }, - { - "lat":61.27999, - "lon":24.01582, - "name":"Roukonmäki", - "gtfsId":"tampere:9083", - "code":"9083", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjkwODM=", - "platformCode":null - }, - { - "lat":61.28182, - "lon":24.01451, - "name":"Roukontie 20", - "gtfsId":"tampere:9081", - "code":"9081", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjkwODE=", - "platformCode":null - }, - { - "lat":61.28368, - "lon":24.01318, - "name":"Roukon koulu", - "gtfsId":"tampere:9079", - "code":"9079", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjkwNzk=", - "platformCode":null - }, - { - "lat":61.28491, - "lon":24.01032, - "name":"Vääränkoivuntie", - "gtfsId":"tampere:8716", - "code":"8716", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3MTY=", - "platformCode":null - }, - { - "lat":61.28498, - "lon":24.00609, - "name":"Kaakonojantie 56", - "gtfsId":"tampere:8718", - "code":"8718", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3MTg=", - "platformCode":null - }, - { - "lat":61.28397, - "lon":24.00098, - "name":"Kaakonojantie 35", - "gtfsId":"tampere:8736", - "code":"8736", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3MzY=", - "platformCode":null - }, - { - "lat":61.28113, - "lon":23.99429, - "name":"VAAO", - "gtfsId":"tampere:8982", - "code":"8982", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5ODI=", - "platformCode":null - }, - { - "lat":61.27998, - "lon":23.99101, - "name":"Koulukampus", - "gtfsId":"tampere:9815", - "code":"9815", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4MTU=", - "platformCode":null - }, - { - "lat":61.27794, - "lon":23.98531, - "name":"Juusonranta L", - "gtfsId":"tampere:9817", - "code":"9817", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4MTc=", - "platformCode":null - }, - { - "lat":61.27441, - "lon":23.97542, - "name":"Pispantalli L", - "gtfsId":"tampere:9819", - "code":"9819", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4MTk=", - "platformCode":null - }, - { - "lat":61.27152, - "lon":23.96893, - "name":"Savilahti L", - "gtfsId":"tampere:9861", - "code":"9861", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjE=", - "platformCode":null - }, - { - "lat":61.26652, - "lon":23.95605, - "name":"Eläinsairaala L", - "gtfsId":"tampere:9863", - "code":"9863", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjM=", - "platformCode":null - }, - { - "lat":61.26407, - "lon":23.9487, - "name":"Yli-Nissi L", - "gtfsId":"tampere:9865", - "code":"9865", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjU=", - "platformCode":null - }, - { - "lat":61.26185, - "lon":23.94067, - "name":"Kärpäntie L", - "gtfsId":"tampere:9867", - "code":"9867", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4Njc=", - "platformCode":null - }, - { - "lat":61.26024, - "lon":23.93499, - "name":"Kärjenniemen koulu", - "gtfsId":"tampere:9869", - "code":"9869", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4Njk=", - "platformCode":null - }, - { - "lat":61.25897, - "lon":23.92637, - "name":"Pastintie L", - "gtfsId":"tampere:9871", - "code":"9871", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NzE=", - "platformCode":null - }, - { - "lat":61.25592, - "lon":23.92361, - "name":"Rantoon th P", - "gtfsId":"tampere:9873", - "code":"9873", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NzM=", - "platformCode":null - }, - { - "lat":61.26045, - "lon":23.89711, - "name":"Metsäkansantie 373", - "gtfsId":"tampere:9409", - "code":"9409", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MDk=", - "platformCode":null - }, - { - "lat":61.24611, - "lon":23.88634, - "name":"Metsäkansantie 177", - "gtfsId":"tampere:9411", - "code":"9411", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MTE=", - "platformCode":null - }, - { - "lat":61.24385, - "lon":23.88246, - "name":"Horkantie 2", - "gtfsId":"tampere:9413", - "code":"9413", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MTM=", - "platformCode":null - }, - { - "lat":61.23271, - "lon":23.87919, - "name":"Metsäkansa", - "gtfsId":"tampere:9415", - "code":"9415", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MTU=", - "platformCode":null - }, - { - "lat":61.22967, - "lon":23.87766, - "name":"Iola", - "gtfsId":"tampere:9417", - "code":"9417", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MTc=", - "platformCode":null - }, - { - "lat":61.2214, - "lon":23.9561, - "name":"Rantoo", - "gtfsId":"tampere:9419", - "code":"9419", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MTk=", - "platformCode":null - }, - { - "lat":61.23625, - "lon":23.94609, - "name":"Mustilahti", - "gtfsId":"tampere:9421", - "code":"9421", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MjE=", - "platformCode":null - }, - { - "lat":61.25741, - "lon":23.92852, - "name":"Vääränmäentie 27", - "gtfsId":"tampere:9423", - "code":"9423", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk0MjM=", - "platformCode":null - }, - { - "lat":61.26068, - "lon":23.93663, - "name":"Kärjenniemen koulu", - "gtfsId":"tampere:9868", - "code":"9868", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4Njg=", - "platformCode":null - }, - { - "lat":61.26214, - "lon":23.94238, - "name":"Kärpäntie I", - "gtfsId":"tampere:9866", - "code":"9866", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjY=", - "platformCode":null - }, - { - "lat":61.26372, - "lon":23.94812, - "name":"Yli-Nissi", - "gtfsId":"tampere:9864", - "code":"9864", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjQ=", - "platformCode":null - }, - { - "lat":61.26581, - "lon":23.95467, - "name":"Eläinsairaala I", - "gtfsId":"tampere:9862", - "code":"9862", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjI=", - "platformCode":null - }, - { - "lat":61.27026, - "lon":23.96711, - "name":"Savilahti I", - "gtfsId":"tampere:9860", - "code":"9860", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4NjA=", - "platformCode":null - }, - { - "lat":61.27479, - "lon":23.97689, - "name":"Pispantalli I", - "gtfsId":"tampere:9820", - "code":"9820", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4MjA=", - "platformCode":null - }, - { - "lat":61.27853, - "lon":23.98762, - "name":"Juusonranta I", - "gtfsId":"tampere:9818", - "code":"9818", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4MTg=", - "platformCode":null - }, - { - "lat":61.27987, - "lon":23.99118, - "name":"Tietotie I", - "gtfsId":"tampere:9816", - "code":"9816", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjk4MTY=", - "platformCode":null - }, - { - "lat":61.28064, - "lon":23.99374, - "name":"Koulukampus", - "gtfsId":"tampere:8983", - "code":"8983", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5ODM=", - "platformCode":null - }, - { - "lat":61.28322, - "lon":23.9999, - "name":"Mäntyläntie", - "gtfsId":"tampere:8739", - "code":"8739", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3Mzk=", - "platformCode":null - }, - { - "lat":61.28395, - "lon":24.0016, - "name":"Kaakonojantie 34", - "gtfsId":"tampere:8737", - "code":"8737", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3Mzc=", - "platformCode":null - }, - { - "lat":61.28489, - "lon":24.00623, - "name":"Kaakonojantie 56", - "gtfsId":"tampere:8719", - "code":"8719", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3MTk=", - "platformCode":null - }, - { - "lat":61.28486, - "lon":24.00976, - "name":"Vääränkoivuntie", - "gtfsId":"tampere:8713", - "code":"8713", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg3MTM=", - "platformCode":null - }, - { - "lat":61.28348, - "lon":24.01321, - "name":"Roukon koulu", - "gtfsId":"tampere:9078", - "code":"9078", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjkwNzg=", - "platformCode":null - }, - { - "lat":61.28194, - "lon":24.01429, - "name":"Roukontie 25", - "gtfsId":"tampere:9080", - "code":"9080", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjkwODA=", - "platformCode":null - }, - { - "lat":61.2799, - "lon":24.01572, - "name":"Roukonmäki", - "gtfsId":"tampere:9082", - "code":"9082", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjkwODI=", - "platformCode":null - }, - { - "lat":61.27776, - "lon":24.01639, - "name":"Kenraalintori E", - "gtfsId":"tampere:8962", - "code":"8962", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NjI=", - "platformCode":null - }, - { - "lat":61.27577, - "lon":24.01783, - "name":"Antinkulma", - "gtfsId":"tampere:8964", - "code":"8964", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NjQ=", - "platformCode":null - }, - { - "lat":61.27358, - "lon":24.01979, - "name":"Kirjaskatu", - "gtfsId":"tampere:8966", - "code":"8966", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NjY=", - "platformCode":null - }, - { - "lat":61.27192, - "lon":24.02094, - "name":"Tallikatu", - "gtfsId":"tampere:8968", - "code":"8968", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5Njg=", - "platformCode":null - }, - { - "lat":61.27136, - "lon":24.02349, - "name":"Roopenkatu", - "gtfsId":"tampere:8970", - "code":"8970", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NzA=", - "platformCode":null - }, - { - "lat":61.27018, - "lon":24.02933, - "name":"Aluesairaala", - "gtfsId":"tampere:8974", - "code":"8974", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5NzQ=", - "platformCode":null - }, - { - "lat":61.2667, - "lon":24.03132, - "name":"Valkeakoski Kauppatori", - "gtfsId":"tampere:8978", - "code":"8978", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5Nzg=", - "platformCode":null - }, - { - "lat":61.26416, - "lon":24.03355, - "name":"Valkeakosken linja-autoasema", - "gtfsId":"tampere:8997", - "code":"8997", - "desc":null, - "zoneId":"D", - "alerts":[ - - ], - "stops":[ - - ], - "id":"U3RvcDp0YW1wZXJlOjg5OTc=", - "platformCode":null - } - ], - "activeDates":[ - { - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU5MjI=" - }, - { - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU5MjM=" - }, - { - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4OTA=" - }, - { - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4OTA=" - }, - { - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU5MjI=" - }, - { - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU5MjM=" - }, - { - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU5MjI=" - }, - { - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU5MjM=" - }, - { - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4OTA=" - }, - { - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU5MjI=" - }, - { - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU5MjM=" - }, - { - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - }, - { - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4OTA=" - } - ], - "route":{ - "mode":"BUS", - "color":null, - "id":"Um91dGU6dGFtcGVyZTo2NkE2OTU3" - }, - "id":"UGF0dGVybjp0YW1wZXJlOjY2QTY5NTc6MDowMQ==" - } - } - }, - "id":"routeRoutes_RoutePageMap_Query" - }, - { - "payload":{ - "data":{ - "pattern":{ - "code":"tampere:66A6957:0:01", - "directionId":0, - "route":{ - "mode":"BUS", - "color":null, - "shortName":"66A", - "id":"Um91dGU6dGFtcGVyZTo2NkE2OTU3" - }, - "stops":[ - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":true, - "realtimeState":"UPDATED", - "realtimeArrival":47400, - "realtimeDeparture":47400, - "serviceDay":1640649120, - "scheduledDeparture":47400, - "pickupType":"UPDATED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjEwMDAw" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51000, - "realtimeDeparture":51000, - "serviceDay":1640649120, - "scheduledDeparture":51000, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjEwMDAw" - } - } - ], - "gtfsId":"tampere:10000", - "lat":61.26373, - "lon":24.03426, - "name":"Valkeakosken linja-autoasema", - "desc":null, - "code":"10000", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjEwMDAw" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47460, - "realtimeDeparture":47460, - "serviceDay":1640649120, - "scheduledDeparture":47460, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzU=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51060, - "realtimeDeparture":51060, - "serviceDay":1640649120, - "scheduledDeparture":51060, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzU=" - } - } - ], - "gtfsId":"tampere:8975", - "lat":61.26763, - "lon":24.031, - "name":"Valkeakosken kauppatori", - "desc":null, - "code":"8975", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NzU=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47610, - "realtimeDeparture":47610, - "serviceDay":1640649120, - "scheduledDeparture":47610, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51210, - "realtimeDeparture":51210, - "serviceDay":1640649120, - "scheduledDeparture":51210, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzM=" - } - } - ], - "gtfsId":"tampere:8973", - "lat":61.27072, - "lon":24.02918, - "name":"Valkeakosken aluesairaala", - "desc":null, - "code":"8973", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NzM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47640, - "realtimeDeparture":47640, - "serviceDay":1640649120, - "scheduledDeparture":47640, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51240, - "realtimeDeparture":51240, - "serviceDay":1640649120, - "scheduledDeparture":51240, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzE=" - } - } - ], - "gtfsId":"tampere:8971", - "lat":61.27171, - "lon":24.02851, - "name":"Alppikatu", - "desc":null, - "code":"8971", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NzE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47670, - "realtimeDeparture":47670, - "serviceDay":1640649120, - "scheduledDeparture":47670, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Njk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51270, - "realtimeDeparture":51270, - "serviceDay":1640649120, - "scheduledDeparture":51270, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Njk=" - } - } - ], - "gtfsId":"tampere:8969", - "lat":61.27143, - "lon":24.02329, - "name":"Roopenkatu", - "desc":null, - "code":"8969", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5Njk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47700, - "realtimeDeparture":47700, - "serviceDay":1640649120, - "scheduledDeparture":47700, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Njc=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51300, - "realtimeDeparture":51300, - "serviceDay":1640649120, - "scheduledDeparture":51300, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Njc=" - } - } - ], - "gtfsId":"tampere:8967", - "lat":61.27156, - "lon":24.0217, - "name":"Tallikatu", - "desc":null, - "code":"8967", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5Njc=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47730, - "realtimeDeparture":47730, - "serviceDay":1640649120, - "scheduledDeparture":47730, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjU=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51330, - "realtimeDeparture":51330, - "serviceDay":1640649120, - "scheduledDeparture":51330, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjU=" - } - } - ], - "gtfsId":"tampere:8965", - "lat":61.27378, - "lon":24.0199, - "name":"Kirjaskatu", - "desc":null, - "code":"8965", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NjU=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47760, - "realtimeDeparture":47760, - "serviceDay":1640649120, - "scheduledDeparture":47760, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51360, - "realtimeDeparture":51360, - "serviceDay":1640649120, - "scheduledDeparture":51360, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjM=" - } - } - ], - "gtfsId":"tampere:8963", - "lat":61.27636, - "lon":24.01792, - "name":"Antinkulma", - "desc":null, - "code":"8963", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NjM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47790, - "realtimeDeparture":47790, - "serviceDay":1640649120, - "scheduledDeparture":47790, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51390, - "realtimeDeparture":51390, - "serviceDay":1640649120, - "scheduledDeparture":51390, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjE=" - } - } - ], - "gtfsId":"tampere:8961", - "lat":61.27774, - "lon":24.01691, - "name":"Kenraalintori P", - "desc":null, - "code":"8961", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NjE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47820, - "realtimeDeparture":47820, - "serviceDay":1640649120, - "scheduledDeparture":47820, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51420, - "realtimeDeparture":51420, - "serviceDay":1640649120, - "scheduledDeparture":51420, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODM=" - } - } - ], - "gtfsId":"tampere:9083", - "lat":61.27999, - "lon":24.01582, - "name":"Roukonmäki", - "desc":null, - "code":"9083", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjkwODM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47835, - "realtimeDeparture":47835, - "serviceDay":1640649120, - "scheduledDeparture":47835, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51435, - "realtimeDeparture":51435, - "serviceDay":1640649120, - "scheduledDeparture":51435, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODE=" - } - } - ], - "gtfsId":"tampere:9081", - "lat":61.28182, - "lon":24.01451, - "name":"Roukontie 20", - "desc":null, - "code":"9081", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjkwODE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47850, - "realtimeDeparture":47850, - "serviceDay":1640649120, - "scheduledDeparture":47850, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwNzk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51450, - "realtimeDeparture":51450, - "serviceDay":1640649120, - "scheduledDeparture":51450, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwNzk=" - } - } - ], - "gtfsId":"tampere:9079", - "lat":61.28368, - "lon":24.01318, - "name":"Roukon koulu", - "desc":null, - "code":"9079", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjkwNzk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47880, - "realtimeDeparture":47880, - "serviceDay":1640649120, - "scheduledDeparture":47880, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTY=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51480, - "realtimeDeparture":51480, - "serviceDay":1640649120, - "scheduledDeparture":51480, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTY=" - } - } - ], - "gtfsId":"tampere:8716", - "lat":61.28491, - "lon":24.01032, - "name":"Vääränkoivuntie", - "desc":null, - "code":"8716", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3MTY=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47910, - "realtimeDeparture":47910, - "serviceDay":1640649120, - "scheduledDeparture":47910, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTg=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51510, - "realtimeDeparture":51510, - "serviceDay":1640649120, - "scheduledDeparture":51510, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTg=" - } - } - ], - "gtfsId":"tampere:8718", - "lat":61.28498, - "lon":24.00609, - "name":"Kaakonojantie 56", - "desc":null, - "code":"8718", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3MTg=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":47940, - "realtimeDeparture":47940, - "serviceDay":1640649120, - "scheduledDeparture":47940, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MzY=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51540, - "realtimeDeparture":51540, - "serviceDay":1640649120, - "scheduledDeparture":51540, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MzY=" - } - } - ], - "gtfsId":"tampere:8736", - "lat":61.28397, - "lon":24.00098, - "name":"Kaakonojantie 35", - "desc":null, - "code":"8736", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3MzY=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48015, - "realtimeDeparture":48015, - "serviceDay":1640649120, - "scheduledDeparture":48015, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5ODI=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51615, - "realtimeDeparture":51615, - "serviceDay":1640649120, - "scheduledDeparture":51615, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5ODI=" - } - } - ], - "gtfsId":"tampere:8982", - "lat":61.28113, - "lon":23.99429, - "name":"VAAO", - "desc":null, - "code":"8982", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5ODI=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48045, - "realtimeDeparture":48045, - "serviceDay":1640649120, - "scheduledDeparture":48045, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTU=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51645, - "realtimeDeparture":51645, - "serviceDay":1640649120, - "scheduledDeparture":51645, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTU=" - } - } - ], - "gtfsId":"tampere:9815", - "lat":61.27998, - "lon":23.99101, - "name":"Koulukampus", - "desc":null, - "code":"9815", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4MTU=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48075, - "realtimeDeparture":48075, - "serviceDay":1640649120, - "scheduledDeparture":48075, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTc=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51675, - "realtimeDeparture":51675, - "serviceDay":1640649120, - "scheduledDeparture":51675, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTc=" - } - } - ], - "gtfsId":"tampere:9817", - "lat":61.27794, - "lon":23.98531, - "name":"Juusonranta L", - "desc":null, - "code":"9817", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4MTc=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48105, - "realtimeDeparture":48105, - "serviceDay":1640649120, - "scheduledDeparture":48105, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51705, - "realtimeDeparture":51705, - "serviceDay":1640649120, - "scheduledDeparture":51705, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTk=" - } - } - ], - "gtfsId":"tampere:9819", - "lat":61.27441, - "lon":23.97542, - "name":"Pispantalli L", - "desc":null, - "code":"9819", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4MTk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48135, - "realtimeDeparture":48135, - "serviceDay":1640649120, - "scheduledDeparture":48135, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51735, - "realtimeDeparture":51735, - "serviceDay":1640649120, - "scheduledDeparture":51735, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjE=" - } - } - ], - "gtfsId":"tampere:9861", - "lat":61.27152, - "lon":23.96893, - "name":"Savilahti L", - "desc":null, - "code":"9861", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48165, - "realtimeDeparture":48165, - "serviceDay":1640649120, - "scheduledDeparture":48165, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51765, - "realtimeDeparture":51765, - "serviceDay":1640649120, - "scheduledDeparture":51765, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjM=" - } - } - ], - "gtfsId":"tampere:9863", - "lat":61.26652, - "lon":23.95605, - "name":"Eläinsairaala L", - "desc":null, - "code":"9863", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48195, - "realtimeDeparture":48195, - "serviceDay":1640649120, - "scheduledDeparture":48195, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjU=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51795, - "realtimeDeparture":51795, - "serviceDay":1640649120, - "scheduledDeparture":51795, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjU=" - } - } - ], - "gtfsId":"tampere:9865", - "lat":61.26407, - "lon":23.9487, - "name":"Yli-Nissi L", - "desc":null, - "code":"9865", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjU=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48225, - "realtimeDeparture":48225, - "serviceDay":1640649120, - "scheduledDeparture":48225, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4Njc=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51825, - "realtimeDeparture":51825, - "serviceDay":1640649120, - "scheduledDeparture":51825, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4Njc=" - } - } - ], - "gtfsId":"tampere:9867", - "lat":61.26185, - "lon":23.94067, - "name":"Kärpäntie L", - "desc":null, - "code":"9867", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4Njc=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48255, - "realtimeDeparture":48255, - "serviceDay":1640649120, - "scheduledDeparture":48255, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4Njk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51855, - "realtimeDeparture":51855, - "serviceDay":1640649120, - "scheduledDeparture":51855, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4Njk=" - } - } - ], - "gtfsId":"tampere:9869", - "lat":61.26024, - "lon":23.93499, - "name":"Kärjenniemen koulu", - "desc":null, - "code":"9869", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4Njk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48315, - "realtimeDeparture":48315, - "serviceDay":1640649120, - "scheduledDeparture":48315, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NzE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51915, - "realtimeDeparture":51915, - "serviceDay":1640649120, - "scheduledDeparture":51915, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NzE=" - } - } - ], - "gtfsId":"tampere:9871", - "lat":61.25897, - "lon":23.92637, - "name":"Pastintie L", - "desc":null, - "code":"9871", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NzE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48345, - "realtimeDeparture":48345, - "serviceDay":1640649120, - "scheduledDeparture":48345, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NzM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":51945, - "realtimeDeparture":51945, - "serviceDay":1640649120, - "scheduledDeparture":51945, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NzM=" - } - } - ], - "gtfsId":"tampere:9873", - "lat":61.25592, - "lon":23.92361, - "name":"Rantoon th P", - "desc":null, - "code":"9873", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NzM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48405, - "realtimeDeparture":48405, - "serviceDay":1640649120, - "scheduledDeparture":48405, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MDk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52005, - "realtimeDeparture":52005, - "serviceDay":1640649120, - "scheduledDeparture":52005, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MDk=" - } - } - ], - "gtfsId":"tampere:9409", - "lat":61.26045, - "lon":23.89711, - "name":"Metsäkansantie 373", - "desc":null, - "code":"9409", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MDk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48585, - "realtimeDeparture":48585, - "serviceDay":1640649120, - "scheduledDeparture":48585, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52185, - "realtimeDeparture":52185, - "serviceDay":1640649120, - "scheduledDeparture":52185, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTE=" - } - } - ], - "gtfsId":"tampere:9411", - "lat":61.24611, - "lon":23.88634, - "name":"Metsäkansantie 177", - "desc":null, - "code":"9411", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MTE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48630, - "realtimeDeparture":48630, - "serviceDay":1640649120, - "scheduledDeparture":48630, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52200, - "realtimeDeparture":52200, - "serviceDay":1640649120, - "scheduledDeparture":52200, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTM=" - } - } - ], - "gtfsId":"tampere:9413", - "lat":61.24385, - "lon":23.88246, - "name":"Horkantie 2", - "desc":null, - "code":"9413", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MTM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48645, - "realtimeDeparture":48645, - "serviceDay":1640649120, - "scheduledDeparture":48645, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTU=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52245, - "realtimeDeparture":52245, - "serviceDay":1640649120, - "scheduledDeparture":52245, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTU=" - } - } - ], - "gtfsId":"tampere:9415", - "lat":61.23271, - "lon":23.87919, - "name":"Metsäkansa", - "desc":null, - "code":"9415", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MTU=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48825, - "realtimeDeparture":48825, - "serviceDay":1640649120, - "scheduledDeparture":48825, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTc=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52425, - "realtimeDeparture":52425, - "serviceDay":1640649120, - "scheduledDeparture":52425, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTc=" - } - } - ], - "gtfsId":"tampere:9417", - "lat":61.22967, - "lon":23.87766, - "name":"Iola", - "desc":null, - "code":"9417", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MTc=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":48900, - "realtimeDeparture":48900, - "serviceDay":1640649120, - "scheduledDeparture":48900, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52500, - "realtimeDeparture":52500, - "serviceDay":1640649120, - "scheduledDeparture":52500, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MTk=" - } - } - ], - "gtfsId":"tampere:9419", - "lat":61.2214, - "lon":23.9561, - "name":"Rantoo", - "desc":null, - "code":"9419", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MTk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49245, - "realtimeDeparture":49245, - "serviceDay":1640649120, - "scheduledDeparture":49245, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MjE=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":52845, - "realtimeDeparture":52845, - "serviceDay":1640649120, - "scheduledDeparture":52845, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MjE=" - } - } - ], - "gtfsId":"tampere:9421", - "lat":61.23625, - "lon":23.94609, - "name":"Mustilahti", - "desc":null, - "code":"9421", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MjE=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49485, - "realtimeDeparture":49485, - "serviceDay":1640649120, - "scheduledDeparture":49485, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MjM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53085, - "realtimeDeparture":53085, - "serviceDay":1640649120, - "scheduledDeparture":53085, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk0MjM=" - } - } - ], - "gtfsId":"tampere:9423", - "lat":61.25741, - "lon":23.92852, - "name":"Vääränmäentie 27", - "desc":null, - "code":"9423", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk0MjM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49545, - "realtimeDeparture":49545, - "serviceDay":1640649120, - "scheduledDeparture":49545, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4Njg=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53145, - "realtimeDeparture":53145, - "serviceDay":1640649120, - "scheduledDeparture":53145, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4Njg=" - } - } - ], - "gtfsId":"tampere:9868", - "lat":61.26068, - "lon":23.93663, - "name":"Kärjenniemen koulu", - "desc":null, - "code":"9868", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4Njg=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49575, - "realtimeDeparture":49575, - "serviceDay":1640649120, - "scheduledDeparture":49575, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjY=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53175, - "realtimeDeparture":53175, - "serviceDay":1640649120, - "scheduledDeparture":53175, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjY=" - } - } - ], - "gtfsId":"tampere:9866", - "lat":61.26214, - "lon":23.94238, - "name":"Kärpäntie I", - "desc":null, - "code":"9866", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjY=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49605, - "realtimeDeparture":49605, - "serviceDay":1640649120, - "scheduledDeparture":49605, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjQ=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53205, - "realtimeDeparture":53205, - "serviceDay":1640649120, - "scheduledDeparture":53205, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjQ=" - } - } - ], - "gtfsId":"tampere:9864", - "lat":61.26372, - "lon":23.94812, - "name":"Yli-Nissi", - "desc":null, - "code":"9864", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjQ=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49635, - "realtimeDeparture":49635, - "serviceDay":1640649120, - "scheduledDeparture":49635, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjI=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53235, - "realtimeDeparture":53235, - "serviceDay":1640649120, - "scheduledDeparture":53235, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjI=" - } - } - ], - "gtfsId":"tampere:9862", - "lat":61.26581, - "lon":23.95467, - "name":"Eläinsairaala I", - "desc":null, - "code":"9862", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjI=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49665, - "realtimeDeparture":49665, - "serviceDay":1640649120, - "scheduledDeparture":49665, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjA=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53265, - "realtimeDeparture":53265, - "serviceDay":1640649120, - "scheduledDeparture":53265, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4NjA=" - } - } - ], - "gtfsId":"tampere:9860", - "lat":61.27026, - "lon":23.96711, - "name":"Savilahti I", - "desc":null, - "code":"9860", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4NjA=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49695, - "realtimeDeparture":49695, - "serviceDay":1640649120, - "scheduledDeparture":49695, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MjA=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53295, - "realtimeDeparture":53295, - "serviceDay":1640649120, - "scheduledDeparture":53295, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MjA=" - } - } - ], - "gtfsId":"tampere:9820", - "lat":61.27479, - "lon":23.97689, - "name":"Pispantalli I", - "desc":null, - "code":"9820", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4MjA=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49755, - "realtimeDeparture":49755, - "serviceDay":1640649120, - "scheduledDeparture":49755, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTg=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53355, - "realtimeDeparture":53355, - "serviceDay":1640649120, - "scheduledDeparture":53355, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTg=" - } - } - ], - "gtfsId":"tampere:9818", - "lat":61.27853, - "lon":23.98762, - "name":"Juusonranta I", - "desc":null, - "code":"9818", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4MTg=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49785, - "realtimeDeparture":49785, - "serviceDay":1640649120, - "scheduledDeparture":49785, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTY=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53385, - "realtimeDeparture":53385, - "serviceDay":1640649120, - "scheduledDeparture":53385, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjk4MTY=" - } - } - ], - "gtfsId":"tampere:9816", - "lat":61.27987, - "lon":23.99118, - "name":"Tietotie I", - "desc":null, - "code":"9816", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjk4MTY=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49815, - "realtimeDeparture":49815, - "serviceDay":1640649120, - "scheduledDeparture":49815, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5ODM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53415, - "realtimeDeparture":53415, - "serviceDay":1640649120, - "scheduledDeparture":53415, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5ODM=" - } - } - ], - "gtfsId":"tampere:8983", - "lat":61.28064, - "lon":23.99374, - "name":"Koulukampus", - "desc":null, - "code":"8983", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5ODM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49875, - "realtimeDeparture":49875, - "serviceDay":1640649120, - "scheduledDeparture":49875, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3Mzk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53475, - "realtimeDeparture":53475, - "serviceDay":1640649120, - "scheduledDeparture":53475, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3Mzk=" - } - } - ], - "gtfsId":"tampere:8739", - "lat":61.28322, - "lon":23.9999, - "name":"Mäntyläntie", - "desc":null, - "code":"8739", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3Mzk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49905, - "realtimeDeparture":49905, - "serviceDay":1640649120, - "scheduledDeparture":49905, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3Mzc=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53505, - "realtimeDeparture":53505, - "serviceDay":1640649120, - "scheduledDeparture":53505, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3Mzc=" - } - } - ], - "gtfsId":"tampere:8737", - "lat":61.28395, - "lon":24.0016, - "name":"Kaakonojantie 34", - "desc":null, - "code":"8737", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3Mzc=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49935, - "realtimeDeparture":49935, - "serviceDay":1640649120, - "scheduledDeparture":49935, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTk=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53535, - "realtimeDeparture":53535, - "serviceDay":1640649120, - "scheduledDeparture":53535, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTk=" - } - } - ], - "gtfsId":"tampere:8719", - "lat":61.28489, - "lon":24.00623, - "name":"Kaakonojantie 56", - "desc":null, - "code":"8719", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3MTk=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49965, - "realtimeDeparture":49965, - "serviceDay":1640649120, - "scheduledDeparture":49965, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTM=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53565, - "realtimeDeparture":53565, - "serviceDay":1640649120, - "scheduledDeparture":53565, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg3MTM=" - } - } - ], - "gtfsId":"tampere:8713", - "lat":61.28486, - "lon":24.00976, - "name":"Vääränkoivuntie", - "desc":null, - "code":"8713", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg3MTM=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":49995, - "realtimeDeparture":49995, - "serviceDay":1640649120, - "scheduledDeparture":49995, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwNzg=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53595, - "realtimeDeparture":53595, - "serviceDay":1640649120, - "scheduledDeparture":53595, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwNzg=" - } - } - ], - "gtfsId":"tampere:9078", - "lat":61.28348, - "lon":24.01321, - "name":"Roukon koulu", - "desc":null, - "code":"9078", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjkwNzg=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50025, - "realtimeDeparture":50025, - "serviceDay":1640649120, - "scheduledDeparture":50025, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODA=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53625, - "realtimeDeparture":53625, - "serviceDay":1640649120, - "scheduledDeparture":53625, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODA=" - } - } - ], - "gtfsId":"tampere:9080", - "lat":61.28194, - "lon":24.01429, - "name":"Roukontie 25", - "desc":null, - "code":"9080", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjkwODA=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50085, - "realtimeDeparture":50085, - "serviceDay":1640649120, - "scheduledDeparture":50085, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODI=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53685, - "realtimeDeparture":53685, - "serviceDay":1640649120, - "scheduledDeparture":53685, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjkwODI=" - } - } - ], - "gtfsId":"tampere:9082", - "lat":61.2799, - "lon":24.01572, - "name":"Roukonmäki", - "desc":null, - "code":"9082", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjkwODI=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50145, - "realtimeDeparture":50145, - "serviceDay":1640649120, - "scheduledDeparture":50145, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjI=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53745, - "realtimeDeparture":53745, - "serviceDay":1640649120, - "scheduledDeparture":53745, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjI=" - } - } - ], - "gtfsId":"tampere:8962", - "lat":61.27776, - "lon":24.01639, - "name":"Kenraalintori E", - "desc":null, - "code":"8962", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NjI=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50175, - "realtimeDeparture":50175, - "serviceDay":1640649120, - "scheduledDeparture":50175, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjQ=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53775, - "realtimeDeparture":53775, - "serviceDay":1640649120, - "scheduledDeparture":53775, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjQ=" - } - } - ], - "gtfsId":"tampere:8964", - "lat":61.27577, - "lon":24.01783, - "name":"Antinkulma", - "desc":null, - "code":"8964", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NjQ=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50235, - "realtimeDeparture":50235, - "serviceDay":1640649120, - "scheduledDeparture":50235, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjY=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53835, - "realtimeDeparture":53835, - "serviceDay":1640649120, - "scheduledDeparture":53835, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NjY=" - } - } - ], - "gtfsId":"tampere:8966", - "lat":61.27358, - "lon":24.01979, - "name":"Kirjaskatu", - "desc":null, - "code":"8966", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NjY=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50295, - "realtimeDeparture":50295, - "serviceDay":1640649120, - "scheduledDeparture":50295, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Njg=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53895, - "realtimeDeparture":53895, - "serviceDay":1640649120, - "scheduledDeparture":53895, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Njg=" - } - } - ], - "gtfsId":"tampere:8968", - "lat":61.27192, - "lon":24.02094, - "name":"Tallikatu", - "desc":null, - "code":"8968", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5Njg=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50355, - "realtimeDeparture":50355, - "serviceDay":1640649120, - "scheduledDeparture":50355, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzA=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":53955, - "realtimeDeparture":53955, - "serviceDay":1640649120, - "scheduledDeparture":53955, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzA=" - } - } - ], - "gtfsId":"tampere:8970", - "lat":61.27136, - "lon":24.02349, - "name":"Roopenkatu", - "desc":null, - "code":"8970", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NzA=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50445, - "realtimeDeparture":50445, - "serviceDay":1640649120, - "scheduledDeparture":50445, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzQ=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":54045, - "realtimeDeparture":54045, - "serviceDay":1640649120, - "scheduledDeparture":54045, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5NzQ=" - } - } - ], - "gtfsId":"tampere:8974", - "lat":61.27018, - "lon":24.02933, - "name":"Aluesairaala", - "desc":null, - "code":"8974", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5NzQ=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50520, - "realtimeDeparture":50520, - "serviceDay":1640649120, - "scheduledDeparture":50520, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Nzg=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":54120, - "realtimeDeparture":54120, - "serviceDay":1640649120, - "scheduledDeparture":54120, - "pickupType":"SCHEDULED", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5Nzg=" - } - } - ], - "gtfsId":"tampere:8978", - "lat":61.2667, - "lon":24.03132, - "name":"Valkeakoski Kauppatori", - "desc":null, - "code":"8978", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5Nzg=" - }, - { - "alerts":[ - - ], - "stopTimesForPattern":[ - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":50640, - "realtimeDeparture":50640, - "serviceDay":1640649120, - "scheduledDeparture":50640, - "pickupType":"NONE", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5OTc=" - } - }, - { - "realtime":false, - "realtimeState":"SCHEDULED", - "realtimeArrival":54240, - "realtimeDeparture":54240, - "serviceDay":1640649120, - "scheduledDeparture":54240, - "pickupType":"NONE", - "stop":{ - "platformCode":null, - "id":"U3RvcDp0YW1wZXJlOjg5OTc=" - } - } - ], - "gtfsId":"tampere:8997", - "lat":61.26416, - "lon":24.03355, - "name":"Valkeakosken linja-autoasema", - "desc":null, - "code":"8997", - "platformCode":null, - "zoneId":"D", - "id":"U3RvcDp0YW1wZXJlOjg5OTc=" - } - ], - "id":"UGF0dGVybjp0YW1wZXJlOjY2QTY5NTc6MDowMQ==" - }, - "route":{ - "gtfsId":"tampere:66A6957", - "color":null, - "shortName":"66A", - "longName":"Valkeakoski - Pispantalli - Metsäkansa - Rantoo", - "mode":"BUS", - "type":3, - "agency":{ - "name":"Nysse/Vekka Group Oy", - "url":"http://joukkoliikenne.tampere.fi/", - "fareUrl":null, - "id":"QWdlbmN5OnRhbXBlcmU6Njk1Nw==", - "phone":"+358356564700" - }, - "patterns":[ - { - "code":"tampere:66A6957:0:01", - "directionId":0, - "headsign":"Metsäkansa", - "stops":[ - { - "name":"Valkeakosken linja-autoasema", - "id":"U3RvcDp0YW1wZXJlOjEwMDAw", - "gtfsId":"tampere:10000", - "code":"10000", - "alerts":[ - - ] - }, - { - "name":"Valkeakosken kauppatori", - "id":"U3RvcDp0YW1wZXJlOjg5NzU=", - "gtfsId":"tampere:8975", - "code":"8975", - "alerts":[ - - ] - }, - { - "name":"Valkeakosken aluesairaala", - "id":"U3RvcDp0YW1wZXJlOjg5NzM=", - "gtfsId":"tampere:8973", - "code":"8973", - "alerts":[ - - ] - }, - { - "name":"Alppikatu", - "id":"U3RvcDp0YW1wZXJlOjg5NzE=", - "gtfsId":"tampere:8971", - "code":"8971", - "alerts":[ - - ] - }, - { - "name":"Roopenkatu", - "id":"U3RvcDp0YW1wZXJlOjg5Njk=", - "gtfsId":"tampere:8969", - "code":"8969", - "alerts":[ - - ] - }, - { - "name":"Tallikatu", - "id":"U3RvcDp0YW1wZXJlOjg5Njc=", - "gtfsId":"tampere:8967", - "code":"8967", - "alerts":[ - - ] - }, - { - "name":"Kirjaskatu", - "id":"U3RvcDp0YW1wZXJlOjg5NjU=", - "gtfsId":"tampere:8965", - "code":"8965", - "alerts":[ - - ] - }, - { - "name":"Antinkulma", - "id":"U3RvcDp0YW1wZXJlOjg5NjM=", - "gtfsId":"tampere:8963", - "code":"8963", - "alerts":[ - - ] - }, - { - "name":"Kenraalintori P", - "id":"U3RvcDp0YW1wZXJlOjg5NjE=", - "gtfsId":"tampere:8961", - "code":"8961", - "alerts":[ - - ] - }, - { - "name":"Roukonmäki", - "id":"U3RvcDp0YW1wZXJlOjkwODM=", - "gtfsId":"tampere:9083", - "code":"9083", - "alerts":[ - - ] - }, - { - "name":"Roukontie 20", - "id":"U3RvcDp0YW1wZXJlOjkwODE=", - "gtfsId":"tampere:9081", - "code":"9081", - "alerts":[ - - ] - }, - { - "name":"Roukon koulu", - "id":"U3RvcDp0YW1wZXJlOjkwNzk=", - "gtfsId":"tampere:9079", - "code":"9079", - "alerts":[ - - ] - }, - { - "name":"Vääränkoivuntie", - "id":"U3RvcDp0YW1wZXJlOjg3MTY=", - "gtfsId":"tampere:8716", - "code":"8716", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 56", - "id":"U3RvcDp0YW1wZXJlOjg3MTg=", - "gtfsId":"tampere:8718", - "code":"8718", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 35", - "id":"U3RvcDp0YW1wZXJlOjg3MzY=", - "gtfsId":"tampere:8736", - "code":"8736", - "alerts":[ - - ] - }, - { - "name":"VAAO", - "id":"U3RvcDp0YW1wZXJlOjg5ODI=", - "gtfsId":"tampere:8982", - "code":"8982", - "alerts":[ - - ] - }, - { - "name":"Koulukampus", - "id":"U3RvcDp0YW1wZXJlOjk4MTU=", - "gtfsId":"tampere:9815", - "code":"9815", - "alerts":[ - - ] - }, - { - "name":"Juusonranta L", - "id":"U3RvcDp0YW1wZXJlOjk4MTc=", - "gtfsId":"tampere:9817", - "code":"9817", - "alerts":[ - - ] - }, - { - "name":"Pispantalli L", - "id":"U3RvcDp0YW1wZXJlOjk4MTk=", - "gtfsId":"tampere:9819", - "code":"9819", - "alerts":[ - - ] - }, - { - "name":"Savilahti L", - "id":"U3RvcDp0YW1wZXJlOjk4NjE=", - "gtfsId":"tampere:9861", - "code":"9861", - "alerts":[ - - ] - }, - { - "name":"Eläinsairaala L", - "id":"U3RvcDp0YW1wZXJlOjk4NjM=", - "gtfsId":"tampere:9863", - "code":"9863", - "alerts":[ - - ] - }, - { - "name":"Yli-Nissi L", - "id":"U3RvcDp0YW1wZXJlOjk4NjU=", - "gtfsId":"tampere:9865", - "code":"9865", - "alerts":[ - - ] - }, - { - "name":"Kärpäntie L", - "id":"U3RvcDp0YW1wZXJlOjk4Njc=", - "gtfsId":"tampere:9867", - "code":"9867", - "alerts":[ - - ] - }, - { - "name":"Kärjenniemen koulu", - "id":"U3RvcDp0YW1wZXJlOjk4Njk=", - "gtfsId":"tampere:9869", - "code":"9869", - "alerts":[ - - ] - }, - { - "name":"Pastintie L", - "id":"U3RvcDp0YW1wZXJlOjk4NzE=", - "gtfsId":"tampere:9871", - "code":"9871", - "alerts":[ - - ] - }, - { - "name":"Rantoon th P", - "id":"U3RvcDp0YW1wZXJlOjk4NzM=", - "gtfsId":"tampere:9873", - "code":"9873", - "alerts":[ - - ] - }, - { - "name":"Metsäkansantie 373", - "id":"U3RvcDp0YW1wZXJlOjk0MDk=", - "gtfsId":"tampere:9409", - "code":"9409", - "alerts":[ - - ] - }, - { - "name":"Metsäkansantie 177", - "id":"U3RvcDp0YW1wZXJlOjk0MTE=", - "gtfsId":"tampere:9411", - "code":"9411", - "alerts":[ - - ] - }, - { - "name":"Horkantie 2", - "id":"U3RvcDp0YW1wZXJlOjk0MTM=", - "gtfsId":"tampere:9413", - "code":"9413", - "alerts":[ - - ] - }, - { - "name":"Metsäkansa", - "id":"U3RvcDp0YW1wZXJlOjk0MTU=", - "gtfsId":"tampere:9415", - "code":"9415", - "alerts":[ - - ] - }, - { - "name":"Iola", - "id":"U3RvcDp0YW1wZXJlOjk0MTc=", - "gtfsId":"tampere:9417", - "code":"9417", - "alerts":[ - - ] - }, - { - "name":"Rantoo", - "id":"U3RvcDp0YW1wZXJlOjk0MTk=", - "gtfsId":"tampere:9419", - "code":"9419", - "alerts":[ - - ] - }, - { - "name":"Mustilahti", - "id":"U3RvcDp0YW1wZXJlOjk0MjE=", - "gtfsId":"tampere:9421", - "code":"9421", - "alerts":[ - - ] - }, - { - "name":"Vääränmäentie 27", - "id":"U3RvcDp0YW1wZXJlOjk0MjM=", - "gtfsId":"tampere:9423", - "code":"9423", - "alerts":[ - - ] - }, - { - "name":"Kärjenniemen koulu", - "id":"U3RvcDp0YW1wZXJlOjk4Njg=", - "gtfsId":"tampere:9868", - "code":"9868", - "alerts":[ - - ] - }, - { - "name":"Kärpäntie I", - "id":"U3RvcDp0YW1wZXJlOjk4NjY=", - "gtfsId":"tampere:9866", - "code":"9866", - "alerts":[ - - ] - }, - { - "name":"Yli-Nissi", - "id":"U3RvcDp0YW1wZXJlOjk4NjQ=", - "gtfsId":"tampere:9864", - "code":"9864", - "alerts":[ - - ] - }, - { - "name":"Eläinsairaala I", - "id":"U3RvcDp0YW1wZXJlOjk4NjI=", - "gtfsId":"tampere:9862", - "code":"9862", - "alerts":[ - - ] - }, - { - "name":"Savilahti I", - "id":"U3RvcDp0YW1wZXJlOjk4NjA=", - "gtfsId":"tampere:9860", - "code":"9860", - "alerts":[ - - ] - }, - { - "name":"Pispantalli I", - "id":"U3RvcDp0YW1wZXJlOjk4MjA=", - "gtfsId":"tampere:9820", - "code":"9820", - "alerts":[ - - ] - }, - { - "name":"Juusonranta I", - "id":"U3RvcDp0YW1wZXJlOjk4MTg=", - "gtfsId":"tampere:9818", - "code":"9818", - "alerts":[ - - ] - }, - { - "name":"Tietotie I", - "id":"U3RvcDp0YW1wZXJlOjk4MTY=", - "gtfsId":"tampere:9816", - "code":"9816", - "alerts":[ - - ] - }, - { - "name":"Koulukampus", - "id":"U3RvcDp0YW1wZXJlOjg5ODM=", - "gtfsId":"tampere:8983", - "code":"8983", - "alerts":[ - - ] - }, - { - "name":"Mäntyläntie", - "id":"U3RvcDp0YW1wZXJlOjg3Mzk=", - "gtfsId":"tampere:8739", - "code":"8739", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 34", - "id":"U3RvcDp0YW1wZXJlOjg3Mzc=", - "gtfsId":"tampere:8737", - "code":"8737", - "alerts":[ - - ] - }, - { - "name":"Kaakonojantie 56", - "id":"U3RvcDp0YW1wZXJlOjg3MTk=", - "gtfsId":"tampere:8719", - "code":"8719", - "alerts":[ - - ] - }, - { - "name":"Vääränkoivuntie", - "id":"U3RvcDp0YW1wZXJlOjg3MTM=", - "gtfsId":"tampere:8713", - "code":"8713", - "alerts":[ - - ] - }, - { - "name":"Roukon koulu", - "id":"U3RvcDp0YW1wZXJlOjkwNzg=", - "gtfsId":"tampere:9078", - "code":"9078", - "alerts":[ - - ] - }, - { - "name":"Roukontie 25", - "id":"U3RvcDp0YW1wZXJlOjkwODA=", - "gtfsId":"tampere:9080", - "code":"9080", - "alerts":[ - - ] - }, - { - "name":"Roukonmäki", - "id":"U3RvcDp0YW1wZXJlOjkwODI=", - "gtfsId":"tampere:9082", - "code":"9082", - "alerts":[ - - ] - }, - { - "name":"Kenraalintori E", - "id":"U3RvcDp0YW1wZXJlOjg5NjI=", - "gtfsId":"tampere:8962", - "code":"8962", - "alerts":[ - - ] - }, - { - "name":"Antinkulma", - "id":"U3RvcDp0YW1wZXJlOjg5NjQ=", - "gtfsId":"tampere:8964", - "code":"8964", - "alerts":[ - - ] - }, - { - "name":"Kirjaskatu", - "id":"U3RvcDp0YW1wZXJlOjg5NjY=", - "gtfsId":"tampere:8966", - "code":"8966", - "alerts":[ - - ] - }, - { - "name":"Tallikatu", - "id":"U3RvcDp0YW1wZXJlOjg5Njg=", - "gtfsId":"tampere:8968", - "code":"8968", - "alerts":[ - - ] - }, - { - "name":"Roopenkatu", - "id":"U3RvcDp0YW1wZXJlOjg5NzA=", - "gtfsId":"tampere:8970", - "code":"8970", - "alerts":[ - - ] - }, - { - "name":"Aluesairaala", - "id":"U3RvcDp0YW1wZXJlOjg5NzQ=", - "gtfsId":"tampere:8974", - "code":"8974", - "alerts":[ - - ] - }, - { - "name":"Valkeakoski Kauppatori", - "id":"U3RvcDp0YW1wZXJlOjg5Nzg=", - "gtfsId":"tampere:8978", - "code":"8978", - "alerts":[ - - ] - }, - { - "name":"Valkeakosken linja-autoasema", - "id":"U3RvcDp0YW1wZXJlOjg5OTc=", - "gtfsId":"tampere:8997", - "code":"8997", - "alerts":[ - - ] - } - ], - "activeDates":[ - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU5MjM=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4OTA=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4OTA=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU5MjM=" - }, - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU5MjM=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4OTA=" - }, - { - "serviceId":"tampere:TAL_MATO_K66_2022", - "day":[ - "20220301", - "20220302", - "20220228" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU5MjI=" - }, - { - "serviceId":"tampere:TAL_PE_K66_2022", - "day":[ - "20220304", - "20220107" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU5MjM=" - }, - { - "serviceId":"tampere:TAL_KPMATO_K66_2022", - "day":[ - "20220330", - "20220331", - "20220131", - "20220201", - "20220202", - "20220203", - "20220207", - "20220208", - "20220209", - "20220210", - "20220214", - "20220215", - "20220216", - "20220217", - "20220221", - "20220222", - "20220223", - "20220224", - "20220303", - "20220307", - "20220308", - "20220309", - "20220310", - "20220110", - "20220111", - "20220112", - "20220314", - "20220113", - "20220315", - "20220316", - "20220317", - "20220117", - "20220118", - "20220119", - "20220321", - "20220120", - "20220322", - "20220323", - "20220324", - "20220124", - "20220125", - "20220126", - "20220328", - "20220127", - "20220329" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - }, - { - "serviceId":"tampere:TAL_KPPE_K66_2022", - "day":[ - "20220128", - "20220114", - "20220318", - "20220218", - "20220204", - "20220121", - "20220325", - "20220225", - "20220311", - "20220211" - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4OTA=" - } - ], - "tripsForDate":[ - { - "stoptimes":[ - { - "scheduledDeparture":54600, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54660, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54810, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54840, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54870, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54900, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54930, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54960, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54990, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55020, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55035, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55050, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55080, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55110, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55140, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55215, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55275, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55305, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55335, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55365, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55395, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55425, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55455, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55515, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55545, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55605, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55785, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55800, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":55845, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56025, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56100, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56445, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56685, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56745, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56775, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56805, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56835, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56865, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56895, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56955, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":56985, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57015, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57075, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57105, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57135, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57165, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57195, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57225, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57285, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57345, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57375, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57435, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57495, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57555, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57720, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":57840, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":47400, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47460, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47610, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47640, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47670, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47700, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47730, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47760, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47790, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47820, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47835, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47850, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47880, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47910, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":47940, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48015, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48045, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48075, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48105, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48135, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48165, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48195, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48225, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48255, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48315, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48345, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48405, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48585, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48630, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48825, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":48900, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49485, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49545, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49575, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49605, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49635, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49665, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49695, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49755, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49785, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49815, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49875, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49905, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49935, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49965, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":49995, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50025, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50085, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50145, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50175, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50235, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50295, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50355, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50445, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50520, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":50640, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":51000, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51060, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51210, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51240, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51270, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51300, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51330, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51360, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51390, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51420, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51435, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51450, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51480, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51510, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51540, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51615, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51675, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51705, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51735, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51765, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51795, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51825, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51855, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51915, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":51945, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52005, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52185, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52200, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52425, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52500, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":52845, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53085, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53145, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53175, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53205, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53235, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53265, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53295, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53355, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53385, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53415, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53475, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53505, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53535, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53565, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53595, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53625, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53685, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53745, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53775, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53835, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53895, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":53955, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54045, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54120, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":54240, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "stoptimes":[ - { - "scheduledDeparture":31500, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31560, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31710, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31740, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31770, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31800, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31830, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31860, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31890, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31920, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31935, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31950, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":31980, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32010, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32040, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32115, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32145, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32175, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32205, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32235, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32265, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32295, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32325, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32355, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32415, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32445, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32505, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32685, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":32745, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33000, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33120, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33300, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33345, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33585, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33645, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33675, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33705, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33735, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33765, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33795, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33855, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33885, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33915, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":33975, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34005, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34035, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34065, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34095, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34125, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34185, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34245, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34275, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34335, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34395, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34455, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34545, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34620, - "serviceDay":1641852000 - }, - { - "scheduledDeparture":34740, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - } - ], - "id":"UGF0dGVybjp0YW1wZXJlOjY2QTY5NTc6MDowMQ==", - "trips":[ - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54600, - "scheduledDeparture":54600, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54660, - "scheduledDeparture":54660, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54810, - "scheduledDeparture":54810, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54840, - "scheduledDeparture":54840, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54870, - "scheduledDeparture":54870, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54900, - "scheduledDeparture":54900, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54930, - "scheduledDeparture":54930, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54960, - "scheduledDeparture":54960, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54990, - "scheduledDeparture":54990, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55020, - "scheduledDeparture":55020, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55035, - "scheduledDeparture":55035, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55050, - "scheduledDeparture":55050, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55080, - "scheduledDeparture":55080, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55110, - "scheduledDeparture":55110, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55140, - "scheduledDeparture":55140, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55215, - "scheduledDeparture":55215, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55245, - "scheduledDeparture":55245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55275, - "scheduledDeparture":55275, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55305, - "scheduledDeparture":55305, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55335, - "scheduledDeparture":55335, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55365, - "scheduledDeparture":55365, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55395, - "scheduledDeparture":55395, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55425, - "scheduledDeparture":55425, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55455, - "scheduledDeparture":55455, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55515, - "scheduledDeparture":55515, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55545, - "scheduledDeparture":55545, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55605, - "scheduledDeparture":55605, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55785, - "scheduledDeparture":55785, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55800, - "scheduledDeparture":55800, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":55845, - "scheduledDeparture":55845, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56025, - "scheduledDeparture":56025, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56100, - "scheduledDeparture":56100, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56445, - "scheduledDeparture":56445, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56685, - "scheduledDeparture":56685, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56745, - "scheduledDeparture":56745, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56775, - "scheduledDeparture":56775, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56805, - "scheduledDeparture":56805, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56835, - "scheduledDeparture":56835, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56865, - "scheduledDeparture":56865, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56895, - "scheduledDeparture":56895, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56955, - "scheduledDeparture":56955, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":56985, - "scheduledDeparture":56985, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57015, - "scheduledDeparture":57015, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57075, - "scheduledDeparture":57075, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57105, - "scheduledDeparture":57105, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57135, - "scheduledDeparture":57135, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57165, - "scheduledDeparture":57165, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57195, - "scheduledDeparture":57195, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57225, - "scheduledDeparture":57225, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57285, - "scheduledDeparture":57285, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57345, - "scheduledDeparture":57345, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57375, - "scheduledDeparture":57375, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57435, - "scheduledDeparture":57435, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57495, - "scheduledDeparture":57495, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57555, - "scheduledDeparture":57555, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57645, - "scheduledDeparture":57645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57720, - "scheduledDeparture":57720, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":57840, - "scheduledDeparture":57840, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMTU4ODk=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47400, - "scheduledDeparture":47400, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47460, - "scheduledDeparture":47460, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47610, - "scheduledDeparture":47610, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47640, - "scheduledDeparture":47640, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47670, - "scheduledDeparture":47670, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47700, - "scheduledDeparture":47700, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47730, - "scheduledDeparture":47730, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47760, - "scheduledDeparture":47760, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47790, - "scheduledDeparture":47790, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47820, - "scheduledDeparture":47820, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47835, - "scheduledDeparture":47835, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47850, - "scheduledDeparture":47850, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47880, - "scheduledDeparture":47880, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47910, - "scheduledDeparture":47910, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":47940, - "scheduledDeparture":47940, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48015, - "scheduledDeparture":48015, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48045, - "scheduledDeparture":48045, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48075, - "scheduledDeparture":48075, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48105, - "scheduledDeparture":48105, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48135, - "scheduledDeparture":48135, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48165, - "scheduledDeparture":48165, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48195, - "scheduledDeparture":48195, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48225, - "scheduledDeparture":48225, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48255, - "scheduledDeparture":48255, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48315, - "scheduledDeparture":48315, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48345, - "scheduledDeparture":48345, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48405, - "scheduledDeparture":48405, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48585, - "scheduledDeparture":48585, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48630, - "scheduledDeparture":48630, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48645, - "scheduledDeparture":48645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48825, - "scheduledDeparture":48825, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":48900, - "scheduledDeparture":48900, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49245, - "scheduledDeparture":49245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49485, - "scheduledDeparture":49485, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49545, - "scheduledDeparture":49545, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49575, - "scheduledDeparture":49575, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49605, - "scheduledDeparture":49605, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49635, - "scheduledDeparture":49635, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49665, - "scheduledDeparture":49665, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49695, - "scheduledDeparture":49695, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49755, - "scheduledDeparture":49755, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49785, - "scheduledDeparture":49785, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49815, - "scheduledDeparture":49815, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49875, - "scheduledDeparture":49875, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49905, - "scheduledDeparture":49905, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49935, - "scheduledDeparture":49935, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49965, - "scheduledDeparture":49965, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":49995, - "scheduledDeparture":49995, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50025, - "scheduledDeparture":50025, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50085, - "scheduledDeparture":50085, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50145, - "scheduledDeparture":50145, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50175, - "scheduledDeparture":50175, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50235, - "scheduledDeparture":50235, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50295, - "scheduledDeparture":50295, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50355, - "scheduledDeparture":50355, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50445, - "scheduledDeparture":50445, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50520, - "scheduledDeparture":50520, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":50640, - "scheduledDeparture":50640, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwOTU4ODk=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51000, - "scheduledDeparture":51000, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51060, - "scheduledDeparture":51060, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51210, - "scheduledDeparture":51210, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51240, - "scheduledDeparture":51240, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51270, - "scheduledDeparture":51270, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51300, - "scheduledDeparture":51300, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51330, - "scheduledDeparture":51330, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51360, - "scheduledDeparture":51360, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51390, - "scheduledDeparture":51390, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51420, - "scheduledDeparture":51420, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51435, - "scheduledDeparture":51435, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51450, - "scheduledDeparture":51450, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51480, - "scheduledDeparture":51480, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51510, - "scheduledDeparture":51510, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51540, - "scheduledDeparture":51540, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51615, - "scheduledDeparture":51615, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51645, - "scheduledDeparture":51645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51675, - "scheduledDeparture":51675, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51705, - "scheduledDeparture":51705, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51735, - "scheduledDeparture":51735, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51765, - "scheduledDeparture":51765, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51795, - "scheduledDeparture":51795, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51825, - "scheduledDeparture":51825, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51855, - "scheduledDeparture":51855, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51915, - "scheduledDeparture":51915, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":51945, - "scheduledDeparture":51945, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52005, - "scheduledDeparture":52005, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52185, - "scheduledDeparture":52185, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52200, - "scheduledDeparture":52200, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52245, - "scheduledDeparture":52245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52425, - "scheduledDeparture":52425, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52500, - "scheduledDeparture":52500, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":52845, - "scheduledDeparture":52845, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53085, - "scheduledDeparture":53085, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53145, - "scheduledDeparture":53145, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53175, - "scheduledDeparture":53175, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53205, - "scheduledDeparture":53205, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53235, - "scheduledDeparture":53235, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53265, - "scheduledDeparture":53265, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53295, - "scheduledDeparture":53295, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53355, - "scheduledDeparture":53355, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53385, - "scheduledDeparture":53385, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53415, - "scheduledDeparture":53415, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53475, - "scheduledDeparture":53475, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53505, - "scheduledDeparture":53505, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53535, - "scheduledDeparture":53535, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53565, - "scheduledDeparture":53565, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53595, - "scheduledDeparture":53595, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53625, - "scheduledDeparture":53625, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53685, - "scheduledDeparture":53685, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53745, - "scheduledDeparture":53745, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53775, - "scheduledDeparture":53775, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53835, - "scheduledDeparture":53835, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53895, - "scheduledDeparture":53895, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":53955, - "scheduledDeparture":53955, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54045, - "scheduledDeparture":54045, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54120, - "scheduledDeparture":54120, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":54240, - "scheduledDeparture":54240, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAxMDU4ODk=" - }, - { - "stoptimes":[ - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31500, - "scheduledDeparture":31500, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31560, - "scheduledDeparture":31560, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31710, - "scheduledDeparture":31710, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31740, - "scheduledDeparture":31740, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31770, - "scheduledDeparture":31770, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31800, - "scheduledDeparture":31800, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31830, - "scheduledDeparture":31830, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31860, - "scheduledDeparture":31860, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31890, - "scheduledDeparture":31890, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31920, - "scheduledDeparture":31920, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31935, - "scheduledDeparture":31935, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31950, - "scheduledDeparture":31950, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":31980, - "scheduledDeparture":31980, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32010, - "scheduledDeparture":32010, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32040, - "scheduledDeparture":32040, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32115, - "scheduledDeparture":32115, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32145, - "scheduledDeparture":32145, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32175, - "scheduledDeparture":32175, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32205, - "scheduledDeparture":32205, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32235, - "scheduledDeparture":32235, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32265, - "scheduledDeparture":32265, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32295, - "scheduledDeparture":32295, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32325, - "scheduledDeparture":32325, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32355, - "scheduledDeparture":32355, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32415, - "scheduledDeparture":32415, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32445, - "scheduledDeparture":32445, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32505, - "scheduledDeparture":32505, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32685, - "scheduledDeparture":32685, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":32745, - "scheduledDeparture":32745, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33000, - "scheduledDeparture":33000, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33120, - "scheduledDeparture":33120, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33300, - "scheduledDeparture":33300, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33345, - "scheduledDeparture":33345, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33585, - "scheduledDeparture":33585, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33645, - "scheduledDeparture":33645, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33675, - "scheduledDeparture":33675, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33705, - "scheduledDeparture":33705, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33735, - "scheduledDeparture":33735, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33765, - "scheduledDeparture":33765, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33795, - "scheduledDeparture":33795, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33855, - "scheduledDeparture":33855, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33885, - "scheduledDeparture":33885, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33915, - "scheduledDeparture":33915, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":33975, - "scheduledDeparture":33975, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34005, - "scheduledDeparture":34005, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34035, - "scheduledDeparture":34035, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34065, - "scheduledDeparture":34065, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34095, - "scheduledDeparture":34095, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34125, - "scheduledDeparture":34125, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34185, - "scheduledDeparture":34185, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34245, - "scheduledDeparture":34245, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34275, - "scheduledDeparture":34275, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34335, - "scheduledDeparture":34335, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34395, - "scheduledDeparture":34395, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34455, - "scheduledDeparture":34455, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34545, - "scheduledDeparture":34545, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34620, - "scheduledDeparture":34620, - "serviceDay":1641852000 - }, - { - "realtimeState":"SCHEDULED", - "scheduledArrival":34740, - "scheduledDeparture":34740, - "serviceDay":1641852000 - } - ], - "id":"VHJpcDp0YW1wZXJlOjc0NDAwODU4ODk=" - } - ] - } - ], - "alerts":[ - - ], - "id":"Um91dGU6dGFtcGVyZTo2NkE2OTU3" - } - } - }, - "id":"routeRoutes_PatternStopsContainer_Query" - } -] \ No newline at end of file diff --git a/test/e2e/mock-data/StopPageBatchQueryResponse.json b/test/e2e/mock-data/StopPageBatchQueryResponse.json deleted file mode 100644 index 0be04e4690..0000000000 --- a/test/e2e/mock-data/StopPageBatchQueryResponse.json +++ /dev/null @@ -1,19608 +0,0 @@ -[ - { - "payload": { - "data": { - "stop": { - "gtfsId": "HSL:2434202", - "name": "Oxfot", - "code": "E4936", - "desc": "Nöykkiönkatu", - "zoneId": "C", - "alerts": [], - "lat": 60.16658, - "lon": 24.66045, - "stops": [], - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - } - } - }, - "id": "stopRoutes_StopPageHeaderContainer_Query" - }, - { - "payload": { - "data": { - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "gtfsId": "HSL:2434202", - "code": "E4936", - "stops": [], - "alerts": [], - "vehicleMode": "BUS", - "stoptimes": [ - { - "realtimeState": "SCHEDULED", - "trip": { - "pattern": { - "code": "HSL:2159:1:01", - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "color": null, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEwMDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "trip": { - "pattern": { - "code": "HSL:2157:1:01", - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "color": null, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEwMDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "trip": { - "pattern": { - "code": "HSL:2158:1:01", - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "color": null, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEwMDc=" - } - } - ], - "routes": [ - { - "gtfsId": "HSL:2158K", - "shortName": "158K", - "longName": "Matinkylä (M)-Nöykkiö-Latokaski", - "mode": "BUS", - "color": null, - "alerts": [], - "patterns": [ - { - "code": "HSL:2158K:1:01", - "id": "UGF0dGVybjpIU0w6MjE1OEs6MTowMQ==" - }, - { - "code": "HSL:2158K:0:01", - "id": "UGF0dGVybjpIU0w6MjE1OEs6MDowMQ==" - } - ], - "id": "Um91dGU6SFNMOjIxNThL" - }, - { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "color": null, - "alerts": [], - "patterns": [ - { - "code": "HSL:2158:0:01", - "id": "UGF0dGVybjpIU0w6MjE1ODowOjAx" - }, - { - "code": "HSL:2158:1:01", - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - } - ], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "color": null, - "alerts": [], - "patterns": [ - { - "code": "HSL:2157:0:01", - "id": "UGF0dGVybjpIU0w6MjE1NzowOjAx" - }, - { - "code": "HSL:2157:1:01", - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - } - ], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - { - "gtfsId": "HSL:2125N", - "shortName": "125N", - "longName": "Kamppi-Tapiola (M)-Niittykumpu (M)-Olari- Latokaski", - "mode": "BUS", - "color": null, - "alerts": [], - "patterns": [ - { - "code": "HSL:2125N:0:01", - "id": "UGF0dGVybjpIU0w6MjEyNU46MDowMQ==" - }, - { - "code": "HSL:2125N:1:01", - "id": "UGF0dGVybjpIU0w6MjEyNU46MTowMQ==" - } - ], - "id": "Um91dGU6SFNMOjIxMjVO" - }, - { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "color": null, - "alerts": [], - "patterns": [ - { - "code": "HSL:2159:0:01", - "id": "UGF0dGVybjpIU0w6MjE1OTowOjAx" - }, - { - "code": "HSL:2159:1:01", - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - } - ], - "id": "Um91dGU6SFNMOjIxNTk=" - } - ] - } - } - }, - "id": "stopRoutes_StopPageTab_Query" - }, - { - "payload": { - "data": { - "stop": { - "url": "http://aikataulut.hsl.fi/pysakit/fi/2434202.html", - "stoptimes": [ - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 36300, - "scheduledDeparture": 36300, - "realtimeArrival": 36300, - "scheduledArrival": 36300, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1001", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEwMDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 36540, - "scheduledDeparture": 36540, - "realtimeArrival": 36540, - "scheduledArrival": 36540, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1005", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEwMDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 36720, - "scheduledDeparture": 36720, - "realtimeArrival": 36720, - "scheduledArrival": 36720, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1007", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEwMDc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 37200, - "scheduledDeparture": 37200, - "realtimeArrival": 37200, - "scheduledArrival": 37200, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1016", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEwMTY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 37440, - "scheduledDeparture": 37440, - "realtimeArrival": 37440, - "scheduledArrival": 37440, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1020", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEwMjA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 37620, - "scheduledDeparture": 37620, - "realtimeArrival": 37620, - "scheduledArrival": 37620, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1022", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEwMjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 38100, - "scheduledDeparture": 38100, - "realtimeArrival": 38100, - "scheduledArrival": 38100, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1031", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEwMzE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 38340, - "scheduledDeparture": 38340, - "realtimeArrival": 38340, - "scheduledArrival": 38340, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1035", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEwMzU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 38520, - "scheduledDeparture": 38520, - "realtimeArrival": 38520, - "scheduledArrival": 38520, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1037", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEwMzc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 39000, - "scheduledDeparture": 39000, - "realtimeArrival": 39000, - "scheduledArrival": 39000, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1046", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEwNDY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 39240, - "scheduledDeparture": 39240, - "realtimeArrival": 39240, - "scheduledArrival": 39240, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1050", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEwNTA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 39420, - "scheduledDeparture": 39420, - "realtimeArrival": 39420, - "scheduledArrival": 39420, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1052", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEwNTI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 39900, - "scheduledDeparture": 39900, - "realtimeArrival": 39900, - "scheduledArrival": 39900, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1101", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzExMDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 40140, - "scheduledDeparture": 40140, - "realtimeArrival": 40140, - "scheduledArrival": 40140, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1105", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzExMDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 40320, - "scheduledDeparture": 40320, - "realtimeArrival": 40320, - "scheduledArrival": 40320, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1107", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzExMDc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 40800, - "scheduledDeparture": 40800, - "realtimeArrival": 40800, - "scheduledArrival": 40800, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1116", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzExMTY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 41040, - "scheduledDeparture": 41040, - "realtimeArrival": 41040, - "scheduledArrival": 41040, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1120", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzExMjA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 41220, - "scheduledDeparture": 41220, - "realtimeArrival": 41220, - "scheduledArrival": 41220, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1122", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzExMjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 41700, - "scheduledDeparture": 41700, - "realtimeArrival": 41700, - "scheduledArrival": 41700, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1131", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzExMzE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 41940, - "scheduledDeparture": 41940, - "realtimeArrival": 41940, - "scheduledArrival": 41940, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1135", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzExMzU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 42120, - "scheduledDeparture": 42120, - "realtimeArrival": 42120, - "scheduledArrival": 42120, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1137", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzExMzc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 42600, - "scheduledDeparture": 42600, - "realtimeArrival": 42600, - "scheduledArrival": 42600, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1146", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzExNDY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 42840, - "scheduledDeparture": 42840, - "realtimeArrival": 42840, - "scheduledArrival": 42840, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1150", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzExNTA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 43020, - "scheduledDeparture": 43020, - "realtimeArrival": 43020, - "scheduledArrival": 43020, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1152", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzExNTI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 43500, - "scheduledDeparture": 43500, - "realtimeArrival": 43500, - "scheduledArrival": 43500, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1201", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEyMDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 43740, - "scheduledDeparture": 43740, - "realtimeArrival": 43740, - "scheduledArrival": 43740, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1205", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEyMDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 43920, - "scheduledDeparture": 43920, - "realtimeArrival": 43920, - "scheduledArrival": 43920, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1207", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEyMDc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 44400, - "scheduledDeparture": 44400, - "realtimeArrival": 44400, - "scheduledArrival": 44400, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1216", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEyMTY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 44640, - "scheduledDeparture": 44640, - "realtimeArrival": 44640, - "scheduledArrival": 44640, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1220", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEyMjA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 44820, - "scheduledDeparture": 44820, - "realtimeArrival": 44820, - "scheduledArrival": 44820, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1222", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEyMjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 45300, - "scheduledDeparture": 45300, - "realtimeArrival": 45300, - "scheduledArrival": 45300, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1231", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEyMzE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 45540, - "scheduledDeparture": 45540, - "realtimeArrival": 45540, - "scheduledArrival": 45540, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1235", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEyMzU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 45660, - "scheduledDeparture": 45660, - "realtimeArrival": 45660, - "scheduledArrival": 45660, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158K_20220603_Ma_2_1237", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158K", - "shortName": "158K", - "longName": "Matinkylä (M)-Nöykkiö-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNThL" - }, - "code": "HSL:2158K:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OEs6MTowMQ==" - }, - "id": "VHJpcDpIU0w6MjE1OEtfMjAyMjA2MDNfTWFfMl8xMjM3" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 46200, - "scheduledDeparture": 46200, - "realtimeArrival": 46200, - "scheduledArrival": 46200, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1246", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEyNDY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 46440, - "scheduledDeparture": 46440, - "realtimeArrival": 46440, - "scheduledArrival": 46440, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1250", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEyNTA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 46620, - "scheduledDeparture": 46620, - "realtimeArrival": 46620, - "scheduledArrival": 46620, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1252", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEyNTI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 47100, - "scheduledDeparture": 47100, - "realtimeArrival": 47100, - "scheduledArrival": 47100, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1301", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEzMDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 47340, - "scheduledDeparture": 47340, - "realtimeArrival": 47340, - "scheduledArrival": 47340, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1305", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEzMDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 47520, - "scheduledDeparture": 47520, - "realtimeArrival": 47520, - "scheduledArrival": 47520, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1307", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEzMDc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 48000, - "scheduledDeparture": 48000, - "realtimeArrival": 48000, - "scheduledArrival": 48000, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1316", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEzMTY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 48240, - "scheduledDeparture": 48240, - "realtimeArrival": 48240, - "scheduledArrival": 48240, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1320", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEzMjA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 48420, - "scheduledDeparture": 48420, - "realtimeArrival": 48420, - "scheduledArrival": 48420, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1322", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEzMjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 48900, - "scheduledDeparture": 48900, - "realtimeArrival": 48900, - "scheduledArrival": 48900, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1331", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEzMzE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 49140, - "scheduledDeparture": 49140, - "realtimeArrival": 49140, - "scheduledArrival": 49140, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1335", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEzMzU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 49200, - "scheduledDeparture": 49200, - "realtimeArrival": 49200, - "scheduledArrival": 49200, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158K_20220603_Ma_2_1336", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158K", - "shortName": "158K", - "longName": "Matinkylä (M)-Nöykkiö-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNThL" - }, - "code": "HSL:2158K:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OEs6MTowMQ==" - }, - "id": "VHJpcDpIU0w6MjE1OEtfMjAyMjA2MDNfTWFfMl8xMzM2" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 49800, - "scheduledDeparture": 49800, - "realtimeArrival": 49800, - "scheduledArrival": 49800, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1346", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzEzNDY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 50040, - "scheduledDeparture": 50040, - "realtimeArrival": 50040, - "scheduledArrival": 50040, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1350", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzEzNTA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 50220, - "scheduledDeparture": 50220, - "realtimeArrival": 50220, - "scheduledArrival": 50220, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1352", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzEzNTI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 50700, - "scheduledDeparture": 50700, - "realtimeArrival": 50700, - "scheduledArrival": 50700, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1401", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE0MDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 50940, - "scheduledDeparture": 50940, - "realtimeArrival": 50940, - "scheduledArrival": 50940, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1405", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE0MDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 51120, - "scheduledDeparture": 51120, - "realtimeArrival": 51120, - "scheduledArrival": 51120, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1407", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE0MDc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 51660, - "scheduledDeparture": 51660, - "realtimeArrival": 51660, - "scheduledArrival": 51660, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1416", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE0MTY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 51840, - "scheduledDeparture": 51840, - "realtimeArrival": 51840, - "scheduledArrival": 51840, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1420", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE0MjA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 52020, - "scheduledDeparture": 52020, - "realtimeArrival": 52020, - "scheduledArrival": 52020, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1422", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE0MjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 52620, - "scheduledDeparture": 52620, - "realtimeArrival": 52620, - "scheduledArrival": 52620, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1433", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE0MzM=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 52860, - "scheduledDeparture": 52860, - "realtimeArrival": 52860, - "scheduledArrival": 52860, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1436", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE0MzY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 53040, - "scheduledDeparture": 53040, - "realtimeArrival": 53040, - "scheduledArrival": 53040, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1439", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE0Mzk=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 53640, - "scheduledDeparture": 53640, - "realtimeArrival": 53640, - "scheduledArrival": 53640, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1450", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE0NTA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 53760, - "scheduledDeparture": 53760, - "realtimeArrival": 53760, - "scheduledArrival": 53760, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1451", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE0NTE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 53820, - "scheduledDeparture": 53820, - "realtimeArrival": 53820, - "scheduledArrival": 53820, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1452", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE0NTI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54360, - "scheduledDeparture": 54360, - "realtimeArrival": 54360, - "scheduledArrival": 54360, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1502", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE1MDI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54780, - "scheduledDeparture": 54780, - "realtimeArrival": 54780, - "scheduledArrival": 54780, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1508", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE1MDg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 54960, - "scheduledDeparture": 54960, - "realtimeArrival": 54960, - "scheduledArrival": 54960, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1511", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE1MTE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55380, - "scheduledDeparture": 55380, - "realtimeArrival": 55380, - "scheduledArrival": 55380, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1519", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE1MTk=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55620, - "scheduledDeparture": 55620, - "realtimeArrival": 55620, - "scheduledArrival": 55620, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1522", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE1MjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 55740, - "scheduledDeparture": 55740, - "realtimeArrival": 55740, - "scheduledArrival": 55740, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1524", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE1MjQ=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56160, - "scheduledDeparture": 56160, - "realtimeArrival": 56160, - "scheduledArrival": 56160, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1532", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE1MzI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56580, - "scheduledDeparture": 56580, - "realtimeArrival": 56580, - "scheduledArrival": 56580, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1538", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE1Mzg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 56760, - "scheduledDeparture": 56760, - "realtimeArrival": 56760, - "scheduledArrival": 56760, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1541", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE1NDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57120, - "scheduledDeparture": 57120, - "realtimeArrival": 57120, - "scheduledArrival": 57120, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1548", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE1NDg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57300, - "scheduledDeparture": 57300, - "realtimeArrival": 57300, - "scheduledArrival": 57300, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158K_20220603_Ma_2_1550", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158K", - "shortName": "158K", - "longName": "Matinkylä (M)-Nöykkiö-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNThL" - }, - "code": "HSL:2158K:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OEs6MTowMQ==" - }, - "id": "VHJpcDpIU0w6MjE1OEtfMjAyMjA2MDNfTWFfMl8xNTUw" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57540, - "scheduledDeparture": 57540, - "realtimeArrival": 57540, - "scheduledArrival": 57540, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1554", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE1NTQ=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 57900, - "scheduledDeparture": 57900, - "realtimeArrival": 57900, - "scheduledArrival": 57900, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1601", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE2MDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58380, - "scheduledDeparture": 58380, - "realtimeArrival": 58380, - "scheduledArrival": 58380, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1608", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE2MDg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58560, - "scheduledDeparture": 58560, - "realtimeArrival": 58560, - "scheduledArrival": 58560, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1611", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE2MTE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 58920, - "scheduledDeparture": 58920, - "realtimeArrival": 58920, - "scheduledArrival": 58920, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1618", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE2MTg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59220, - "scheduledDeparture": 59220, - "realtimeArrival": 59220, - "scheduledArrival": 59220, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1622", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE2MjI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59340, - "scheduledDeparture": 59340, - "realtimeArrival": 59340, - "scheduledArrival": 59340, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1624", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE2MjQ=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 59760, - "scheduledDeparture": 59760, - "realtimeArrival": 59760, - "scheduledArrival": 59760, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1632", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE2MzI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60180, - "scheduledDeparture": 60180, - "realtimeArrival": 60180, - "scheduledArrival": 60180, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1638", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE2Mzg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60360, - "scheduledDeparture": 60360, - "realtimeArrival": 60360, - "scheduledArrival": 60360, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1641", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE2NDE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 60780, - "scheduledDeparture": 60780, - "realtimeArrival": 60780, - "scheduledArrival": 60780, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1649", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE2NDk=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61020, - "scheduledDeparture": 61020, - "realtimeArrival": 61020, - "scheduledArrival": 61020, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1652", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE2NTI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61140, - "scheduledDeparture": 61140, - "realtimeArrival": 61140, - "scheduledArrival": 61140, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1654", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE2NTQ=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61620, - "scheduledDeparture": 61620, - "realtimeArrival": 61620, - "scheduledArrival": 61620, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1703", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE3MDM=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 61980, - "scheduledDeparture": 61980, - "realtimeArrival": 61980, - "scheduledArrival": 61980, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1708", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE3MDg=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62160, - "scheduledDeparture": 62160, - "realtimeArrival": 62160, - "scheduledArrival": 62160, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1711", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE3MTE=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62640, - "scheduledDeparture": 62640, - "realtimeArrival": 62640, - "scheduledArrival": 62640, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1720", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE3MjA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 62940, - "scheduledDeparture": 62940, - "realtimeArrival": 62940, - "scheduledArrival": 62940, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1724", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE3MjQ=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 63060, - "scheduledDeparture": 63060, - "realtimeArrival": 63060, - "scheduledArrival": 63060, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1726", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE3MjY=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 63420, - "scheduledDeparture": 63420, - "realtimeArrival": 63420, - "scheduledArrival": 63420, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1733", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE3MzM=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 63720, - "scheduledDeparture": 63720, - "realtimeArrival": 63720, - "scheduledArrival": 63720, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1737", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE3Mzc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 63960, - "scheduledDeparture": 63960, - "realtimeArrival": 63960, - "scheduledArrival": 63960, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1742", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE3NDI=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 64440, - "scheduledDeparture": 64440, - "realtimeArrival": 64440, - "scheduledArrival": 64440, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1750", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE3NTA=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 64740, - "scheduledDeparture": 64740, - "realtimeArrival": 64740, - "scheduledArrival": 64740, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1754", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE3NTQ=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 64860, - "scheduledDeparture": 64860, - "realtimeArrival": 64860, - "scheduledArrival": 64860, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1757", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE3NTc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 65340, - "scheduledDeparture": 65340, - "realtimeArrival": 65340, - "scheduledArrival": 65340, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1805", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE4MDU=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 65520, - "scheduledDeparture": 65520, - "realtimeArrival": 65520, - "scheduledArrival": 65520, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2158_20220603_Ma_2_1807", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2158", - "shortName": "158", - "longName": "Matinkylä (M)-Nöykkiö-Kattilalaakso-Kiviruukki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTg=" - }, - "code": "HSL:2158:1:01", - "stops": [ - { - "gtfsId": "HSL:2421227", - "code": "E4218", - "id": "U3RvcDpIU0w6MjQyMTIyNw==" - }, - { - "gtfsId": "HSL:2421225", - "code": "E4216", - "id": "U3RvcDpIU0w6MjQyMTIyNQ==" - }, - { - "gtfsId": "HSL:2421223", - "code": "E4214", - "id": "U3RvcDpIU0w6MjQyMTIyMw==" - }, - { - "gtfsId": "HSL:2421211", - "code": "E4203", - "id": "U3RvcDpIU0w6MjQyMTIxMQ==" - }, - { - "gtfsId": "HSL:2421219", - "code": "E4211", - "id": "U3RvcDpIU0w6MjQyMTIxOQ==" - }, - { - "gtfsId": "HSL:2421213", - "code": "E4205", - "id": "U3RvcDpIU0w6MjQyMTIxMw==" - }, - { - "gtfsId": "HSL:2434211", - "code": "E4960", - "id": "U3RvcDpIU0w6MjQzNDIxMQ==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434205", - "code": "E4939", - "id": "U3RvcDpIU0w6MjQzNDIwNQ==" - }, - { - "gtfsId": "HSL:2434207", - "code": "E4941", - "id": "U3RvcDpIU0w6MjQzNDIwNw==" - }, - { - "gtfsId": "HSL:2434209", - "code": "E4943", - "id": "U3RvcDpIU0w6MjQzNDIwOQ==" - }, - { - "gtfsId": "HSL:2434244", - "code": "E4954", - "id": "U3RvcDpIU0w6MjQzNDI0NA==" - }, - { - "gtfsId": "HSL:2434246", - "code": "E4956", - "id": "U3RvcDpIU0w6MjQzNDI0Ng==" - }, - { - "gtfsId": "HSL:2432210", - "code": "E4910", - "id": "U3RvcDpIU0w6MjQzMjIxMA==" - }, - { - "gtfsId": "HSL:2432227", - "code": "E4927", - "id": "U3RvcDpIU0w6MjQzMjIyNw==" - }, - { - "gtfsId": "HSL:2432228", - "code": "E4928", - "id": "U3RvcDpIU0w6MjQzMjIyOA==" - }, - { - "gtfsId": "HSL:2434302", - "code": "E4959", - "id": "U3RvcDpIU0w6MjQzNDMwMg==" - }, - { - "gtfsId": "HSL:2433246", - "code": "E4329", - "id": "U3RvcDpIU0w6MjQzMzI0Ng==" - }, - { - "gtfsId": "HSL:2432234", - "code": "E4971", - "id": "U3RvcDpIU0w6MjQzMjIzNA==" - }, - { - "gtfsId": "HSL:2432205", - "code": "E4905", - "id": "U3RvcDpIU0w6MjQzMjIwNQ==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1ODoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OF8yMDIyMDYwM19NYV8yXzE4MDc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 66060, - "scheduledDeparture": 66060, - "realtimeArrival": 66060, - "scheduledArrival": 66060, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2159_20220603_Ma_2_1817", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2159", - "shortName": "159", - "longName": "Matinkylä (M)-Latokaski", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTk=" - }, - "code": "HSL:2159:1:01", - "stops": [ - { - "gtfsId": "HSL:2431240", - "code": "E4310", - "id": "U3RvcDpIU0w6MjQzMTI0MA==" - }, - { - "gtfsId": "HSL:2431238", - "code": "E4308", - "id": "U3RvcDpIU0w6MjQzMTIzOA==" - }, - { - "gtfsId": "HSL:2431252", - "code": "E4314", - "id": "U3RvcDpIU0w6MjQzMTI1Mg==" - }, - { - "gtfsId": "HSL:2431254", - "code": "E4316", - "id": "U3RvcDpIU0w6MjQzMTI1NA==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2442201", - "code": "E4417", - "id": "U3RvcDpIU0w6MjQ0MjIwMQ==" - }, - { - "gtfsId": "HSL:2314207", - "code": "E3157", - "id": "U3RvcDpIU0w6MjMxNDIwNw==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1OToxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1OV8yMDIyMDYwM19NYV8yXzE4MTc=" - } - }, - { - "realtimeState": "SCHEDULED", - "realtimeDeparture": 66240, - "scheduledDeparture": 66240, - "realtimeArrival": 66240, - "scheduledArrival": 66240, - "realtime": false, - "serviceDay": 1654462800, - "pickupType": "SCHEDULED", - "dropoffType": "SCHEDULED", - "headsign": "Matinkylä (M)", - "stop": { - "id": "U3RvcDpIU0w6MjQzNDIwMg==", - "code": "E4936", - "platformCode": null - }, - "trip": { - "gtfsId": "HSL:2157_20220603_Ma_2_1820", - "directionId": "1", - "tripHeadsign": "Matinkylä (M)", - "stops": [ - { - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "pattern": { - "route": { - "gtfsId": "HSL:2157", - "shortName": "157", - "longName": "Matinkylä (M)-Suomenoja-Tillinmäki", - "mode": "BUS", - "type": 701, - "color": null, - "agency": { - "name": "Helsingin seudun liikenne", - "id": "QWdlbmN5OkhTTDpIU0w=" - }, - "alerts": [], - "id": "Um91dGU6SFNMOjIxNTc=" - }, - "code": "HSL:2157:1:01", - "stops": [ - { - "gtfsId": "HSL:2421201", - "code": "E4207", - "id": "U3RvcDpIU0w6MjQyMTIwMQ==" - }, - { - "gtfsId": "HSL:2421203", - "code": "E4252", - "id": "U3RvcDpIU0w6MjQyMTIwMw==" - }, - { - "gtfsId": "HSL:2421205", - "code": "E4254", - "id": "U3RvcDpIU0w6MjQyMTIwNQ==" - }, - { - "gtfsId": "HSL:2421207", - "code": "E4255", - "id": "U3RvcDpIU0w6MjQyMTIwNw==" - }, - { - "gtfsId": "HSL:2434213", - "code": "E4962", - "id": "U3RvcDpIU0w6MjQzNDIxMw==" - }, - { - "gtfsId": "HSL:2434202", - "code": "E4936", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - }, - { - "gtfsId": "HSL:2434204", - "code": "E4938", - "id": "U3RvcDpIU0w6MjQzNDIwNA==" - }, - { - "gtfsId": "HSL:2421206", - "code": "E4258", - "id": "U3RvcDpIU0w6MjQyMTIwNg==" - }, - { - "gtfsId": "HSL:2432231", - "code": "E4931", - "id": "U3RvcDpIU0w6MjQzMjIzMQ==" - }, - { - "gtfsId": "HSL:2434229", - "code": "E4949", - "id": "U3RvcDpIU0w6MjQzNDIyOQ==" - }, - { - "gtfsId": "HSL:2434227", - "code": "E4947", - "id": "U3RvcDpIU0w6MjQzNDIyNw==" - }, - { - "gtfsId": "HSL:2432226", - "code": "E4926", - "id": "U3RvcDpIU0w6MjQzMjIyNg==" - }, - { - "gtfsId": "HSL:2432224", - "code": "E4924", - "id": "U3RvcDpIU0w6MjQzMjIyNA==" - }, - { - "gtfsId": "HSL:2432222", - "code": "E4922", - "id": "U3RvcDpIU0w6MjQzMjIyMg==" - }, - { - "gtfsId": "HSL:2432219", - "code": "E4919", - "id": "U3RvcDpIU0w6MjQzMjIxOQ==" - }, - { - "gtfsId": "HSL:2432217", - "code": "E4917", - "id": "U3RvcDpIU0w6MjQzMjIxNw==" - }, - { - "gtfsId": "HSL:2321227", - "code": "E3216", - "id": "U3RvcDpIU0w6MjMyMTIyNw==" - }, - { - "gtfsId": "HSL:2314223", - "code": "E3139", - "id": "U3RvcDpIU0w6MjMxNDIyMw==" - }, - { - "gtfsId": "HSL:2314226", - "code": "E3142", - "id": "U3RvcDpIU0w6MjMxNDIyNg==" - }, - { - "gtfsId": "HSL:2314200", - "code": "E3145", - "id": "U3RvcDpIU0w6MjMxNDIwMA==" - } - ], - "id": "UGF0dGVybjpIU0w6MjE1NzoxOjAx" - }, - "id": "VHJpcDpIU0w6MjE1N18yMDIyMDYwM19NYV8yXzE4MjA=" - } - } - ], - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - } - } - }, - "id": "stopRoutes_StopPageContent_Query" - }, - { - "payload": { - "data": { - "stop": { - "lat": 60.16658, - "lon": 24.66045, - "platformCode": null, - "name": "Oxfot", - "code": "E4936", - "desc": "Nöykkiönkatu", - "vehicleMode": "BUS", - "locationType": "STOP", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - } - } - }, - "id": "stopRoutes_StopPageMapContainer_Query" - }, - { - "payload": { - "data": { - "stop": { - "name": "Oxfot", - "code": "E4936", - "desc": "Nöykkiönkatu", - "id": "U3RvcDpIU0w6MjQzNDIwMg==" - } - } - }, - "id": "stopRoutes_StopPageMeta_Query" - } -] \ No newline at end of file diff --git a/test/unit/OldSearchesStore.test.js b/test/unit/OldSearchesStore.test.js index f730fe9ca0..b3e9ee7a8d 100644 --- a/test/unit/OldSearchesStore.test.js +++ b/test/unit/OldSearchesStore.test.js @@ -80,26 +80,6 @@ const mockData = { }, type: 'endpoint', }, - currentLocation: { - item: { - type: 'CurrentLocation', - address: 'Mannerheimintie 1, Helsinki', - lat: 60.17020147545328, - lon: 24.937821437201357, - properties: { - labelId: 'Käytä nykyistä sijaintia', - layer: 'currentPosition', - address: 'Mannerheimintie 1, Helsinki', - lat: 60.17020147545328, - lon: 24.937821437201357, - }, - geometry: { - type: 'Point', - coordinates: [24.937821437201357, 60.17020147545328], - }, - }, - type: 'endpoint', - }, }; describe('OldSearchesStore', () => { @@ -161,18 +141,11 @@ describe('OldSearchesStore', () => { setOldSearchesStorage({ version: STORE_VERSION, items: [ - { - type: 'endpoint', - }, - { - type: 'route', - }, - { - type: 'endpoint', - }, + { item: {}, type: 'endpoint' }, + { item: {}, type: 'route' }, + { item: {}, type: 'endpoint' }, ], }); - const store = new OldSearchesStore(); const oldSearches = store.getOldSearches('endpoint'); expect(oldSearches).to.not.be.empty; @@ -228,7 +201,7 @@ describe('OldSearchesStore', () => { MockDate.set(timestamp); setOldSearchesStorage({ version: STORE_VERSION, - items: [{}], + items: [{ item: {} }], }); const store = new OldSearchesStore(); @@ -236,25 +209,6 @@ describe('OldSearchesStore', () => { expect(oldSearches).to.not.be.empty; expect(oldSearches.length).to.equal(1); }); - - it('should ignore items of type "CurrentLocation" if they are found from the store', () => { - const timeStamp = moment('2019-06-19'); - MockDate.set(timeStamp); - setOldSearchesStorage({ - version: STORE_VERSION, - items: [ - { - ...mockData.currentLocation, - count: 1, - lastUpdated: timeStamp.unix(), - }, - ], - }); - - const store = new OldSearchesStore(); - const searches = store.getOldSearches(); - expect(searches).to.have.lengthOf(0); - }); }); describe('saveSearch(destination)', () => { @@ -345,11 +299,5 @@ describe('OldSearchesStore', () => { const result = store.getOldSearches()[0]; expect(result).to.deep.equal(newData.item); }); - - it('should not save items of type "CurrentLocation"', () => { - const store = new OldSearchesStore(); - store.saveSearch({ ...mockData.currentLocation }); - expect(getOldSearchesStorage().items).to.deep.equal([]); - }); }); }); diff --git a/test/unit/component/CustomizeSearchNew.test.js b/test/unit/component/CustomizeSearchNew.test.js deleted file mode 100644 index 62520ac269..0000000000 --- a/test/unit/component/CustomizeSearchNew.test.js +++ /dev/null @@ -1,89 +0,0 @@ -/* import { expect } from 'chai'; -import fetchMock from 'fetch-mock'; -import { after, before, describe, it } from 'mocha'; -import React from 'react'; - -import CustomizeSearch from '../../../app/component/CustomizeSearchNew'; -import VehicleRentalStationNetworkSelector from '../../../app/component/VehicleRentalStationNetworkSelector'; - -import { mockContext, mockChildContextTypes } from '../helpers/mock-context'; -import { mountWithIntl } from '../helpers/mock-intl-enzyme'; -import defaultConfig from '../../../app/configurations/config.default'; -import hslConfig from '../../../app/configurations/config.hsl'; - -const mergedConfig = { - ...defaultConfig, - ...hslConfig, -}; - -describe('', () => { - before(() => { - fetchMock.post('/graphql', { - data: { - route: { - id: 'Um91dGU6SFNMOjI1NTA=', - shortName: '550', - longName: 'Itäkeskus-Westendinasema', - mode: 'BUS', - }, - }, - }); - }); - - after(() => { - fetchMock.restore(); - }); - - it.skip('should show citybike network selector when many networks are available', () => { - const wrapper = mountWithIntl( - {}} />, - { - context: { - ...mockContext, - config: { - ...mergedConfig, - transportModes: { - ...mergedConfig.transportModes, - citybike: { - availableForSelection: true, - }, - }, - }, - location: { - ...mockContext.location, - }, - router: createMemoryMockRouter(), - }, - childContextTypes: { - ...mockChildContextTypes, - }, - }, - ); - expect(wrapper.find(VehicleRentalStationNetworkSelector)).to.have.lengthOf(1); - }); - - it.skip('should hide citybike network selector when citybike routing is disabled', () => { - const wrapper = mountWithIntl( - {}} />, - { - context: { - ...mockContext, - config: { - ...mergedConfig, - transportModes: { - ...mergedConfig.transportModes, - citybike: { - availableForSelection: false, - }, - }, - }, - }, - childContextTypes: { - ...mockChildContextTypes, - }, - }, - ); - expect(wrapper.find(VehicleRentalStationNetworkSelector)).to.have.lengthOf(0); - }); -}); -*/ diff --git a/test/unit/component/Timetable.test.js b/test/unit/component/Timetable.test.js index 38266b887f..45290d2128 100644 --- a/test/unit/component/Timetable.test.js +++ b/test/unit/component/Timetable.test.js @@ -12,11 +12,8 @@ import * as timetables from '../../../app/configurations/timetableConfigUtils'; const stopIdNumber = '1140199'; const props = { - propsForDateSelect: { - startDate: '20190110', - selectedDate: '20190110', - onDateChange: () => {}, - }, + startDate: '20190110', + onDateChange: () => {}, stop: { gtfsId: `HSL:${stopIdNumber}`, locationType: 'STOP', diff --git a/test/unit/component/map/tile-layer/Stops.test.js b/test/unit/component/map/tile-layer/Stops.test.js index cb9cf60d8f..ed5b18b6d7 100644 --- a/test/unit/component/map/tile-layer/Stops.test.js +++ b/test/unit/component/map/tile-layer/Stops.test.js @@ -2,6 +2,8 @@ import fetchMock from 'fetch-mock'; import Stops from '../../../../../app/component/map/tile-layer/Stops'; describe('Stops', () => { + before(() => fetchMock.mockGlobal()); + after(() => fetchMock.unmockGlobal()); const config = { URL: { STOP_MAP: { default: 'https://localhost/stopmap/' }, @@ -18,24 +20,28 @@ describe('Stops', () => { }; describe('fetchStatusAndDrawStop', () => { - afterEach(() => { - fetchMock.reset(); - }); - it('should make a get to the correct url', () => { - const mock = fetchMock.get(`${config.URL.STOP_MAP.default}3/1/2.pbf`, { - status: 404, - }); + fetchMock.get( + 'end:3/1/2.pbf', + { + status: 200, + }, + { repeat: 1 }, + ); new Stops(tile, config, []).getPromise(); // eslint-disable-line no-new - expect(mock.called()).to.equal(true); + expect(fetchMock.callHistory.called('end:/3/1/2.pbf')).to.equal(true); }); it('should add zoom offset to the z coordinate', () => { - const mock = fetchMock.get(`${config.URL.STOP_MAP.default}4/1/2.pbf`, { - status: 404, - }); + fetchMock.get( + 'end:/4/1/2.pbf', + { + status: 200, + }, + { repeat: 1 }, + ); new Stops({ ...tile, props: { zoomOffset: 1 } }, config, []).getPromise(); // eslint-disable-line no-new - expect(mock.called()).to.equal(true); + expect(fetchMock.callHistory.called('end:/4/1/2.pbf')).to.equal(true); }); }); }); diff --git a/test/unit/store/GeoJsonStore.test.js b/test/unit/store/GeoJsonStore.test.js index 96dec09485..9053f3ed26 100644 --- a/test/unit/store/GeoJsonStore.test.js +++ b/test/unit/store/GeoJsonStore.test.js @@ -9,15 +9,19 @@ import GeoJsonStore, { describe('GeoJsonStore', () => { let store; const dispatcher = () => {}; + before(() => fetchMock.mockGlobal()); beforeEach(() => { store = new GeoJsonStore(dispatcher); }); afterEach(() => { - fetchMock.reset(); + fetchMock.removeRoutes(); + fetchMock.clearHistory(); }); + after(() => fetchMock.unmockGlobal()); + describe('getGeoJsonConfig', () => { it('should return undefined if the url is falsey', async () => { expect(await store.getGeoJsonConfig(undefined)).to.equal(undefined); @@ -48,7 +52,7 @@ describe('GeoJsonStore', () => { const result1 = await store.getGeoJsonConfig(url); const result2 = await store.getGeoJsonConfig(url); - expect(fetchMock.calls().length).to.equal(1); + expect(fetchMock.callHistory.calls().length).to.equal(1); expect(result1).to.equal(result2); }); @@ -79,7 +83,7 @@ describe('GeoJsonStore', () => { const result1 = await store.getGeoJsonData(url, undefined, undefined); const result2 = await store.getGeoJsonData(url, undefined, undefined); - expect(fetchMock.calls().length).to.equal(1); + expect(fetchMock.callHistory.calls().length).to.equal(1); expect(result1).to.deep.equal(result2); }); diff --git a/test/unit/store/MessageStore.test.js b/test/unit/store/MessageStore.test.js index 9d7e1c5f26..c828df1fae 100644 --- a/test/unit/store/MessageStore.test.js +++ b/test/unit/store/MessageStore.test.js @@ -9,9 +9,18 @@ import MessageStore, { describe('MessageStore', () => { describe('getMessages', () => { + before(() => fetchMock.mockGlobal()); + + afterEach(() => { + fetchMock.removeRoutes(); + fetchMock.clearHistory(); + }); + + after(() => fetchMock.unmockGlobal()); + it('should show higher priority first', async () => { const staticMessagesUrl = '/staticMessages'; - const mock = fetchMock.sandbox().mock(staticMessagesUrl, { + fetchMock.get(staticMessagesUrl, { staticMessages: [ { id: '2', @@ -26,7 +35,6 @@ describe('MessageStore', () => { }, ], }); - global.fetch = mock; const store = new MessageStore(); const config = { staticMessages: [ @@ -47,7 +55,7 @@ describe('MessageStore', () => { }; await store.addConfigMessages(config); - expect(mock.called(staticMessagesUrl)).to.equal(true); + expect(fetchMock.callHistory.called(staticMessagesUrl)).to.equal(true); expect(store.getMessages()).to.deep.equal([ { content: { diff --git a/test/unit/util/analyticsUtils.test.js b/test/unit/util/analyticsUtils.test.js index db759b7054..e4c0baabf5 100644 --- a/test/unit/util/analyticsUtils.test.js +++ b/test/unit/util/analyticsUtils.test.js @@ -29,13 +29,23 @@ describe('analytics utils', () => { }); describe('getAnalyticsInitCode', () => { it('should return a nonempty string when GTMid is given', () => { - const res = getAnalyticsInitCode(1); + const res = getAnalyticsInitCode({ GTMid: 1 }); expect(res.length > 0).to.equal(true); }); - it('should return an empty string when null GTMid is given', () => { - const res = getAnalyticsInitCode(null); + it('should return an empty string when null GTMid and no analyticsScript is given', () => { + const res = getAnalyticsInitCode( + { GTMid: null, analyticsScript: '' }, + 'hostname', + ); expect(res.length).to.equal(0); }); + it('should return a nonempty string when analyticsScript and hostname are given', () => { + const res = getAnalyticsInitCode( + { analyticsScript: () => 'test' }, + 'hostname', + ); + expect(res.length > 0).to.equal(true); + }); }); describe('initAnalyticsClientSide', () => { it('should initialize window.dataLayer to an array', () => { diff --git a/test/unit/util/fetchUtil.test.js b/test/unit/util/fetchUtil.test.js index 78bc0b9334..2a762de93a 100644 --- a/test/unit/util/fetchUtil.test.js +++ b/test/unit/util/fetchUtil.test.js @@ -1,6 +1,6 @@ -import { expect, assert } from 'chai'; -import { describe, it } from 'mocha'; +import { assert, expect } from 'chai'; import fetchMock from 'fetch-mock'; +import { describe, it } from 'mocha'; import { retryFetch } from '../../../app/util/fetchUtils'; // retryFetch retries fetch requests (url, options, retry count, delay) where total number or calls is initial request + retry count @@ -11,106 +11,85 @@ const testUrl = const testJSONResponse = '{"test": 3}'; describe('retryFetch', () => { - /* eslint-disable no-unused-vars */ - it('fetching something that does not exist with 5 retries should give Not Found error and 6 requests in total should be made ', done => { - fetchMock.mock(testUrl, 404); - retryFetch(testUrl, 5, 10) - .then(res => res.json()) - .then( - result => { - assert.fail('Error should have been thrown'); - }, - err => { - expect(err).to.equal(`${testUrl}: Not Found`); - // calls has array of requests made to given URL - const calls = fetchMock.calls( - 'https://dev-api.digitransit.fi/timetables/v1/hsl/routes/routes.json', - ); - expect(calls.length).to.equal(6); - fetchMock.restore(); - done(); - }, - ); + before(() => fetchMock.mockGlobal()); + + afterEach(() => { + fetchMock.removeRoutes(); + fetchMock.clearHistory(); }); - it('fetch with larger fetch timeout should take longer', done => { - let firstEnd; - let firstDuration; - const firstStart = performance.now(); - fetchMock.mock(testUrl, 404); - retryFetch(testUrl, 2, 20) - .then(res => res.json()) - .then( - result => { - assert.fail('Error should have been thrown'); - }, - err => { - firstEnd = performance.now(); - firstDuration = firstEnd - firstStart; - expect(firstDuration).to.be.above(40); - // because test system can be slow, requests should take between 40-200ms (because system can be slow) when retry delay is 20ms and 2 retries - expect(firstDuration).to.be.below(200); - fetchMock.restore(); - }, - ) - .then(() => { - const secondStart = performance.now(); - fetchMock.mock(testUrl, 404); - retryFetch(testUrl, 2, 100) - .then(res => res.json()) - .then( - result => { - assert.fail('Error should have been thrown'); - }, - err => { - const secondEnd = performance.now(); - const secondDuration = secondEnd - secondStart; - expect(secondDuration).to.be.above(200); - // because test system can be slow, requests should take between 200-360ms when retry delay is 100ms and 2 retries - expect(firstDuration).to.be.below(360); - // because of longer delay between requests, the difference between 2 retries with 20ms delay - // and 2 retries with 100ms delay should be 160ms but because performance slightly varies, there is a 60ms threshold for test failure - expect(secondDuration - firstDuration).to.be.above(100); - fetchMock.restore(); - done(); - }, - ); - }); + after(() => fetchMock.unmockGlobal()); + + it('fetching something that does not exist with 5 retries should give Not Found error and 6 requests in total should be made ', async () => { + fetchMock.get(testUrl, 404); + + try { + await retryFetch(testUrl, 5, 10); + } catch (err) { + expect(err).to.equal(`${testUrl}: Not Found`); + } + + const calls = fetchMock.callHistory.calls( + 'https://dev-api.digitransit.fi/timetables/v1/hsl/routes/routes.json', + ); + expect(calls.length).to.equal(6); }); - it('fetch that gives 200 should not be retried', done => { + it('fetch with larger fetch timeout should take longer', async () => { + async function measureFetchDuration(retries, delay) { + const start = performance.now(); + try { + await retryFetch(testUrl, retries, delay); + } catch (err) { + // Expected error due to 404 + } + return performance.now() - start; + } + // because test system can be slow, requests should take between 40-200ms when retry delay is 20ms and 2 retries + const firstDuration = await measureFetchDuration(2, 20); + expect(firstDuration).to.be.above(40); + expect(firstDuration).to.be.below(200); + + // because test system can be slow, requests should take between 200-360ms when retry delay is 100ms and 2 retries + const secondDuration = await measureFetchDuration(2, 100); + expect(secondDuration).to.be.above(200); + expect(secondDuration).to.be.below(360); + + // because of longer delay between requests, the difference between 2 retries with 20ms delay + // and 2 retries with 100ms delay should be 160ms but because performance slightly varies, there is a 100ms threshold for test failure + const expectedDifference = 100; + const allowedVariance = 100; + const durationDifference = secondDuration - firstDuration; + + expect(durationDifference).to.be.within( + expectedDifference - allowedVariance, + expectedDifference + allowedVariance, + ); + }); + + it('fetch that gives 200 should not be retried', async () => { fetchMock.get(testUrl, testJSONResponse); - retryFetch(testUrl, 5, 10) - .then(res => res.json()) - .then( - result => { - // calls has array of requests made to given URL - const calls = fetchMock.calls( - 'https://dev-api.digitransit.fi/timetables/v1/hsl/routes/routes.json', - ); - expect(calls.length).to.equal(1); - fetchMock.restore(); - done(); - }, - err => { - assert.fail('No error should have been thrown'); - }, - ); + try { + await retryFetch(testUrl, 5, 10); + } catch (err) { + assert.fail('No error should have been thrown'); + } + const calls = fetchMock.callHistory.calls( + 'https://dev-api.digitransit.fi/timetables/v1/hsl/routes/routes.json', + ); + expect(calls.length).to.equal(1); }); - it('fetch that gives 200 should have correct result data', done => { + it('fetch that gives 200 should have correct result data', async () => { fetchMock.get(testUrl, testJSONResponse); - retryFetch(testUrl, 5, 10) - .then(res => res.json()) - .then( - result => { - expect(result.test).to.equal(3); - fetchMock.restore(); - done(); - }, - err => { - assert.fail('No error should have been thrown'); - }, - ); + + try { + const res = await retryFetch(testUrl, 5, 10); + const data = await res.json(); + + expect(data).to.have.property('test', 3); + } catch (err) { + assert.fail(`Request failed unexpectedly: ${err.message}`); + } }); }); diff --git a/test/unit/component/Itinerary.test.js b/test/unit/views/ItineraryPage/component/Itinerary.test.js similarity index 97% rename from test/unit/component/Itinerary.test.js rename to test/unit/views/ItineraryPage/component/Itinerary.test.js index 3894419812..eac5a2d45f 100644 --- a/test/unit/component/Itinerary.test.js +++ b/test/unit/views/ItineraryPage/component/Itinerary.test.js @@ -2,17 +2,23 @@ import { expect } from 'chai'; import { describe, it } from 'mocha'; import React from 'react'; -import { mockContext, mockChildContextTypes } from '../helpers/mock-context'; -import { mountWithIntl, shallowWithIntl } from '../helpers/mock-intl-enzyme'; import { component as Itinerary, ModeLeg, - ViaLeg, RouteLeg, -} from '../../../app/component/itinerary/Itinerary'; -import { AlertSeverityLevelType } from '../../../app/constants'; -import RouteNumberContainer from '../../../app/component/RouteNumberContainer'; -import dcw12 from '../test-data/dcw12'; + ViaLeg, +} from '../../../../../app/component/itinerary/Itinerary'; +import RouteNumberContainer from '../../../../../app/component/RouteNumberContainer'; +import { AlertSeverityLevelType } from '../../../../../app/constants'; +import { + mockChildContextTypes, + mockContext, +} from '../../../helpers/mock-context'; +import { + mountWithIntl, + shallowWithIntl, +} from '../../../helpers/mock-intl-enzyme'; +import dcw12 from '../../../test-data/dcw12'; const defaultProps = { breakpoint: 'large', diff --git a/test/unit/component/ItineraryList.test.js b/test/unit/views/ItineraryPage/component/ItineraryList.test.js similarity index 86% rename from test/unit/component/ItineraryList.test.js rename to test/unit/views/ItineraryPage/component/ItineraryList.test.js index b797a64255..0e20fca31b 100644 --- a/test/unit/component/ItineraryList.test.js +++ b/test/unit/views/ItineraryPage/component/ItineraryList.test.js @@ -1,8 +1,11 @@ import React from 'react'; -import { mockContext, mockChildContextTypes } from '../helpers/mock-context'; -import { mountWithIntl } from '../helpers/mock-intl-enzyme'; -import { Component as ItineraryList } from '../../../app/component/itinerary/ItineraryList'; +import { Component as ItineraryList } from '../../../../../app/component/itinerary/ItineraryList'; +import { + mockChildContextTypes, + mockContext, +} from '../../../helpers/mock-context'; +import { mountWithIntl } from '../../../helpers/mock-intl-enzyme'; const noop = () => {}; diff --git a/test/unit/views/ItineraryPage/component/NavigatorIntro.test.js b/test/unit/views/ItineraryPage/component/NavigatorIntro.test.js new file mode 100644 index 0000000000..f6b68b2209 --- /dev/null +++ b/test/unit/views/ItineraryPage/component/NavigatorIntro.test.js @@ -0,0 +1,88 @@ +import { assert } from 'chai'; +import { describe, it } from 'mocha'; +import React from 'react'; + +import NavigatorIntro from '../../../../../app/component/itinerary/NavigatorIntro/NavigatorIntro'; +import { + mockChildContextTypes, + mockContext, +} from '../../../helpers/mock-context'; +import { mountWithIntl } from '../../../helpers/mock-intl-enzyme'; + +const defaultProps = { + onClose: () => {}, +}; + +describe('', () => { + it('should render logo if prop is present', () => { + const wrapper = mountWithIntl( + , + { + context: { + ...mockContext, + }, + childContextTypes: { ...mockChildContextTypes }, + }, + ); + + expect( + wrapper.find('div.navigator-intro-modal-content img'), + ).to.have.lengthOf(1); + }); + + it('should not render logo if prop is missing', () => { + const wrapper = mountWithIntl(, { + context: { + ...mockContext, + }, + childContextTypes: { ...mockChildContextTypes }, + }); + + assert(wrapper.find('div.navigator-intro-modal-content img'), undefined); + }); + + it('should render login tip if login is allowed and user is not logged in', () => { + const wrapper = mountWithIntl( + , + { + context: { + ...mockContext, + config: { CONFIG: 'default', allowLogin: true }, + }, + childContextTypes: { ...mockChildContextTypes }, + }, + ); + + expect(wrapper.find('div.login-tip')).to.have.lengthOf(1); + }); + + it('should not render login tip if login is not allowed and user is not logged in', () => { + const wrapper = mountWithIntl( + , + { + context: { + ...mockContext, + config: { CONFIG: 'default', allowLogin: true }, + }, + childContextTypes: { ...mockChildContextTypes }, + }, + ); + + assert(wrapper.find('div.login-tip'), undefined); + }); + + it('should not render login tip if login is allowed and user logged in', () => { + const wrapper = mountWithIntl( + , + { + context: { + ...mockContext, + config: { CONFIG: 'default', allowLogin: true }, + }, + childContextTypes: { ...mockChildContextTypes }, + }, + ); + + assert(wrapper.find('div.login-tip'), undefined); + }); +}); diff --git a/yarn.lock b/yarn.lock index 1b00cb003e..d8c2d7e8d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -283,7 +283,7 @@ __metadata: languageName: node linkType: hard -"@babel/core@npm:7.23.9, @babel/core@npm:^7.0.0, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.7.5": +"@babel/core@npm:7.23.9, @babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.7.5": version: 7.23.9 resolution: "@babel/core@npm:7.23.9" dependencies: @@ -1968,11 +1968,11 @@ __metadata: languageName: unknown linkType: soft -"@digitransit-component/digitransit-component-autosuggest-panel@^3.0.8, @digitransit-component/digitransit-component-autosuggest-panel@workspace:digitransit-component/packages/digitransit-component-autosuggest-panel": +"@digitransit-component/digitransit-component-autosuggest-panel@^4.0.1, @digitransit-component/digitransit-component-autosuggest-panel@workspace:digitransit-component/packages/digitransit-component-autosuggest-panel": version: 0.0.0-use.local resolution: "@digitransit-component/digitransit-component-autosuggest-panel@workspace:digitransit-component/packages/digitransit-component-autosuggest-panel" peerDependencies: - "@digitransit-component/digitransit-component-autosuggest": ^2.0.8 + "@digitransit-component/digitransit-component-autosuggest": ^3.0.1 "@digitransit-component/digitransit-component-icon": ^1.0.1 "@hsl-fi/sass": ^0.2.0 classnames: 2.2.6 @@ -1988,11 +1988,11 @@ __metadata: languageName: unknown linkType: soft -"@digitransit-component/digitransit-component-autosuggest@^2.0.8, @digitransit-component/digitransit-component-autosuggest@workspace:digitransit-component/packages/digitransit-component-autosuggest": +"@digitransit-component/digitransit-component-autosuggest@^3.0.1, @digitransit-component/digitransit-component-autosuggest@workspace:digitransit-component/packages/digitransit-component-autosuggest": version: 0.0.0-use.local resolution: "@digitransit-component/digitransit-component-autosuggest@workspace:digitransit-component/packages/digitransit-component-autosuggest" dependencies: - "@digitransit-search-util/digitransit-search-util-execute-search-immidiate": ^2.0.3 + "@digitransit-search-util/digitransit-search-util-execute-search-immidiate": ^3.0.1 "@digitransit-search-util/digitransit-search-util-get-label": ^1.0.0 "@digitransit-search-util/digitransit-search-util-uniq-by-label": ^2.0.0 "@hsl-fi/hooks": ^1.2.4 @@ -2166,8 +2166,8 @@ __metadata: version: 0.0.0-use.local resolution: "@digitransit-component/digitransit-component@workspace:digitransit-component/packages/digitransit-component" dependencies: - "@digitransit-component/digitransit-component-autosuggest": ^2.0.8 - "@digitransit-component/digitransit-component-autosuggest-panel": ^3.0.8 + "@digitransit-component/digitransit-component-autosuggest": ^3.0.1 + "@digitransit-component/digitransit-component-autosuggest-panel": ^4.0.1 "@digitransit-component/digitransit-component-control-panel": ^2.0.0 "@digitransit-component/digitransit-component-favourite-bar": 2.0.5 "@digitransit-component/digitransit-component-favourite-editing-modal": ^2.0.2 @@ -2203,7 +2203,7 @@ __metadata: languageName: unknown linkType: soft -"@digitransit-search-util/digitransit-search-util-execute-search-immidiate@^2.0.3, @digitransit-search-util/digitransit-search-util-execute-search-immidiate@workspace:digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate": +"@digitransit-search-util/digitransit-search-util-execute-search-immidiate@^3.0.1, @digitransit-search-util/digitransit-search-util-execute-search-immidiate@workspace:digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate": version: 0.0.0-use.local resolution: "@digitransit-search-util/digitransit-search-util-execute-search-immidiate@workspace:digitransit-search-util/packages/digitransit-search-util-execute-search-immidiate" dependencies: @@ -2236,7 +2236,7 @@ __metadata: resolution: "@digitransit-search-util/digitransit-search-util-get-json@workspace:digitransit-search-util/packages/digitransit-search-util-get-json" dependencies: "@digitransit-search-util/digitransit-search-util-serialize": 0.0.2 - axios: 1.6.7 + axios: 1.7.7 languageName: unknown linkType: soft @@ -5453,62 +5453,6 @@ __metadata: languageName: node linkType: hard -"@redis/bloom@npm:1.2.0": - version: 1.2.0 - resolution: "@redis/bloom@npm:1.2.0" - peerDependencies: - "@redis/client": ^1.0.0 - checksum: 8c214227287d6b278109098bca00afc601cf84f7da9c6c24f4fa7d3854b946170e5893aa86ed607ba017a4198231d570541c79931b98b6d50b262971022d1d6c - languageName: node - linkType: hard - -"@redis/client@npm:1.5.14": - version: 1.5.14 - resolution: "@redis/client@npm:1.5.14" - dependencies: - cluster-key-slot: 1.1.2 - generic-pool: 3.9.0 - yallist: 4.0.0 - checksum: f401997c6df92055c1a59385ed2fed7ee9295860f39935821107ea2570f76168dd1b25b71a3b37b9bbfaba26a9d18080d6bcd101a4bfc3852f72cc20576c6e7d - languageName: node - linkType: hard - -"@redis/graph@npm:1.1.1": - version: 1.1.1 - resolution: "@redis/graph@npm:1.1.1" - peerDependencies: - "@redis/client": ^1.0.0 - checksum: caf9b9a3ff82a08ae543c356a3fed548399ae79aba5ed08ce6cf1b522b955eb5cee4406b0ed0c6899345f8fbc06dfd6cd51304ae8422c3ebbc468f53294dc509 - languageName: node - linkType: hard - -"@redis/json@npm:1.0.6": - version: 1.0.6 - resolution: "@redis/json@npm:1.0.6" - peerDependencies: - "@redis/client": ^1.0.0 - checksum: 9fda29abc339c72593f34a23f8023b715c1f8f3d73f7c59889af02f25589bac2ad57073ad08d0b8da42cd8c258665a7b38d39e761e92945cc27aca651c8a93a5 - languageName: node - linkType: hard - -"@redis/search@npm:1.1.6": - version: 1.1.6 - resolution: "@redis/search@npm:1.1.6" - peerDependencies: - "@redis/client": ^1.0.0 - checksum: 0d87e6a9e40e62e46064ccfccca9a5ba7ce608890740415008acb1e83a02690edf37ac1ee878bcc0702d30a2eeba7776e7b467b71f87d8e7b278f38637161e16 - languageName: node - linkType: hard - -"@redis/time-series@npm:1.0.5": - version: 1.0.5 - resolution: "@redis/time-series@npm:1.0.5" - peerDependencies: - "@redis/client": ^1.0.0 - checksum: 6bbdb0b793dcbd13518aa60a09a980f953554e4c745bfacc1611baa8098f360e0378e8ee6b7faf600a67f1de83f4b68bbec6f95a0740faee6164c14be3a30752 - languageName: node - linkType: hard - "@repeaterjs/repeater@npm:3.0.4": version: 3.0.4 resolution: "@repeaterjs/repeater@npm:3.0.4" @@ -5856,6 +5800,13 @@ __metadata: languageName: node linkType: hard +"@types/glob-to-regexp@npm:^0.4.4": + version: 0.4.4 + resolution: "@types/glob-to-regexp@npm:0.4.4" + checksum: be9c924d664592a16129c825aa392365335ce455c34e1c9d3f6dd8b45371088bb5d4a45bbb576559f2b63d4f8bcf464cbd5baafb08cdf89b71d3b6a79356b747 + languageName: node + linkType: hard + "@types/glob@npm:^7.1.1": version: 7.2.0 resolution: "@types/glob@npm:7.2.0" @@ -6690,7 +6641,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.7, accepts@npm:~1.3.8": +"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -7622,14 +7573,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:1.6.7, axios@npm:^1.6.1": - version: 1.6.7 - resolution: "axios@npm:1.6.7" +"axios@npm:1.7.7, axios@npm:^1.6.1": + version: 1.7.7 + resolution: "axios@npm:1.7.7" dependencies: - follow-redirects: ^1.15.4 + follow-redirects: ^1.15.6 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: 87d4d429927d09942771f3b3a6c13580c183e31d7be0ee12f09be6d5655304996bb033d85e54be81606f4e89684df43be7bf52d14becb73a12727bf33298a082 + checksum: 882d4fe0ec694a07c7f5c1f68205eb6dc5a62aecdb632cc7a4a3d0985188ce3030e0b277e1a8260ac3f194d314ae342117660a151fabffdc5081ca0b5a8b47fe languageName: node linkType: hard @@ -8050,24 +8001,6 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.19.0": - version: 1.19.0 - resolution: "body-parser@npm:1.19.0" - dependencies: - bytes: 3.1.0 - content-type: ~1.0.4 - debug: 2.6.9 - depd: ~1.1.2 - http-errors: 1.7.2 - iconv-lite: 0.4.24 - on-finished: ~2.3.0 - qs: 6.7.0 - raw-body: 2.4.0 - type-is: ~1.6.17 - checksum: 490231b4c89bbd43112762f7ba8e5342c174a6c9f64284a3b0fcabf63277e332f8316765596f1e5b15e4f3a6cf0422e005f4bb3149ed3a224bb025b7a36b9ac1 - languageName: node - linkType: hard - "body-parser@npm:1.20.1": version: 1.20.1 resolution: "body-parser@npm:1.20.1" @@ -8088,6 +8021,26 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: 2.5.2 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 1a35c59a6be8d852b00946330141c4f142c6af0f970faa87f10ad74f1ee7118078056706a05ae3093c54dabca9cd3770fa62a170a85801da1a4324f04381167d + languageName: node + linkType: hard + "body@npm:^5.1.0": version: 5.1.0 resolution: "body@npm:5.1.0" @@ -8456,13 +8409,6 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.0": - version: 3.1.0 - resolution: "bytes@npm:3.1.0" - checksum: 7c3b21c5d9d44ed455460d5d36a31abc6fa2ce3807964ba60a4b03fd44454c8cf07bb0585af83bfde1c5cc2ea4bbe5897bc3d18cd15e0acf25a3615a35aba2df - languageName: node - linkType: hard - "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" @@ -8629,6 +8575,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + languageName: node + linkType: hard + "call-me-maybe@npm:^1.0.1": version: 1.0.2 resolution: "call-me-maybe@npm:1.0.2" @@ -9272,13 +9231,6 @@ __metadata: languageName: node linkType: hard -"cluster-key-slot@npm:1.1.2": - version: 1.1.2 - resolution: "cluster-key-slot@npm:1.1.2" - checksum: be0ad2d262502adc998597e83f9ded1b80f827f0452127c5a37b22dfca36bab8edf393f7b25bb626006fb9fb2436106939ede6d2d6ecf4229b96a47f27edd681 - languageName: node - linkType: hard - "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -9688,12 +9640,10 @@ __metadata: languageName: node linkType: hard -"connect-redis@npm:7.1.1": - version: 7.1.1 - resolution: "connect-redis@npm:7.1.1" - peerDependencies: - express-session: ">=1" - checksum: ac91ee818d0f467866b6982f66b3423fee58de9da3562618f6d1df2ddeea426354c1efe70b3f799be1b52e3cc67f2043b9ae203678fd3ff9db5dff44b078f0ca +"connect-redis@npm:5.0.0": + version: 5.0.0 + resolution: "connect-redis@npm:5.0.0" + checksum: 0eca205a42b68842c6b461d3cb51bde2cbc99984a0af51e99701f07a55209f3f60e1e34dd6d6cc81aa4fd462cd2d9881bf9b2f44ca3bbcd4b496514822a5e585 languageName: node linkType: hard @@ -9718,15 +9668,6 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.3": - version: 0.5.3 - resolution: "content-disposition@npm:0.5.3" - dependencies: - safe-buffer: 5.1.2 - checksum: 95bf164c0b0b8199d3f44b7631e51b37f683c6a90b9baa4315bd3d405a6d1bc81b7346f0981046aa004331fb3d7a28b629514d01fc209a5251573fc7e4d33380 - languageName: node - linkType: hard - "content-disposition@npm:0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" @@ -9736,7 +9677,7 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 @@ -10161,7 +10102,7 @@ __metadata: languageName: node linkType: hard -"core-js@npm:^3.0.0, core-js@npm:^3.29.0, core-js@npm:^3.30.2, core-js@npm:^3.6.1": +"core-js@npm:^3.29.0, core-js@npm:^3.30.2, core-js@npm:^3.6.1": version: 3.35.1 resolution: "core-js@npm:3.35.1" checksum: e246af6b634be3763ffe3ce6ac4601b4dc5b928006fb6c95e5d08ecd82a2413bf36f00ffe178b89c9a8e94000288933a78a9881b2c9498e6cf312b031013b952 @@ -10997,6 +10938,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -11109,13 +11061,6 @@ __metadata: languageName: node linkType: hard -"destroy@npm:~1.0.4": - version: 1.0.4 - resolution: "destroy@npm:1.0.4" - checksum: da9ab4961dc61677c709da0c25ef01733042614453924d65636a7db37308fef8a24cd1e07172e61173d471ca175371295fbc984b0af5b2b4ff47cd57bd784c03 - languageName: node - linkType: hard - "detect-indent@npm:^5.0.0": version: 5.0.0 resolution: "detect-indent@npm:5.0.0" @@ -11232,6 +11177,7 @@ __metadata: "@commitlint/cli": 9.1.2 "@commitlint/config-conventional": 9.1.2 "@graphql-eslint/eslint-plugin": 3.20.1 + "@hsl-fi/button": ^1.2.4 "@hsl-fi/container-spinner": 0.3.2 "@hsl-fi/hooks": 1.2.4 "@hsl-fi/modal": " ^0.3.2" @@ -11251,7 +11197,7 @@ __metadata: async: ^3.2.2 autoprefixer: 9.8.6 axe-core: ^4.7.2 - axios: 1.6.7 + axios: 1.7.7 babel-loader: 8.2.5 babel-plugin-dynamic-import-node: 2.3.3 babel-plugin-inline-react-svg: 2.0.2 @@ -11259,11 +11205,11 @@ __metadata: babel-plugin-relay: 16.2.0 babel-plugin-transform-react-remove-prop-types: 0.4.24 base64-arraybuffer: 0.1.5 - body-parser: 1.19.0 + body-parser: 1.20.3 chai: 4.3.7 classnames: 2.2.6 compression-webpack-plugin: 5.0.2 - connect-redis: 7.1.1 + connect-redis: 5.0.0 cookie-parser: 1.4.5 copy-webpack-plugin: 6.1.0 css-loader: ^5.2.7 @@ -11283,14 +11229,14 @@ __metadata: eslint-plugin-react: 7.33.2 eslint-plugin-react-hooks: 4.6.0 esm: 3.2.25 - express: 4.17.1 + express: 4.20.0 express-http-proxy: 1.6.2 express-session: 1.18.0 express-static-gzip: 2.0.8 farce: 0.4.5 fast-xml-parser: 4.3.4 favicons-webpack-plugin: 4.2.0 - fetch-mock: 9.11.0 + fetch-mock: ^12.0.2 file-loader: 5.0.2 fluxible: 1.4.0 fluxible-addons-react: 0.2.16 @@ -11364,10 +11310,10 @@ __metadata: react-swipe: 6.0.4 react-truncate-markup: 5.1.0 recompose: 0.30.0 - redis: 4.6.13 + redis: 2.8.0 relay-compiler: 16.2.0 relay-runtime: 16.2.0 - rollup: 2.35.1 + rollup: 2.79.2 rollup-plugin-babel: 4.4.0 rollup-plugin-commonjs: 10.1.0 rollup-plugin-peer-deps-external: 2.2.4 @@ -11712,10 +11658,17 @@ __metadata: languageName: node linkType: hard +"double-ended-queue@npm:^2.1.0-0": + version: 2.1.0-0 + resolution: "double-ended-queue@npm:2.1.0-0" + checksum: 3030cf9dcf6f8e7d8cb6ae5b7304890445d7c32233a614e400ba7b378086ad76f5822d0e501afd5ffe0af1de4bcb842fa23d4c79174d54f6566399435fafc271 + languageName: node + linkType: hard + "dset@npm:^3.1.2": - version: 3.1.3 - resolution: "dset@npm:3.1.3" - checksum: 5db964a36c60c51aa3f7088bfe1dc5c0eedd9a6ef3b216935bb70ef4a7b8fc40fd2f9bb16b9a4692c9c9772cea60cfefb108d2d09fbd53c85ea8f6cd54502d6a + version: 3.1.4 + resolution: "dset@npm:3.1.4" + checksum: 9a7677e9ffd3c13ad850f7cf367aa94b39984006510e84c3c09b7b88bba0a5b3b7196d85a99d0c4cae4e47d67bdeca43dc1834a41d80f31bcdc86dd26121ecec languageName: node linkType: hard @@ -11805,8 +11758,8 @@ __metadata: linkType: hard "elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": - version: 6.5.4 - resolution: "elliptic@npm:6.5.4" + version: 6.6.0 + resolution: "elliptic@npm:6.6.0" dependencies: bn.js: ^4.11.9 brorand: ^1.1.0 @@ -11815,7 +11768,7 @@ __metadata: inherits: ^2.0.4 minimalistic-assert: ^1.0.1 minimalistic-crypto-utils: ^1.0.1 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 + checksum: e912349b883e694bfe65005214237a470c9a098a6ba36fd24396d0ab07feb399920c0738aeed1aed6cf5dca9c64fd479e212faed3a75c9d81453671ef0de5157 languageName: node linkType: hard @@ -11875,6 +11828,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encoding@npm:^0.1.11, encoding@npm:^0.1.12, encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -12139,6 +12099,15 @@ __metadata: languageName: node linkType: hard +"es-define-property@npm:^1.0.0": + version: 1.0.0 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 + languageName: node + linkType: hard + "es-errors@npm:^1.0.0, es-errors@npm:^1.1.0, es-errors@npm:^1.2.1, es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" @@ -12882,41 +12851,42 @@ __metadata: languageName: node linkType: hard -"express@npm:4.17.1": - version: 4.17.1 - resolution: "express@npm:4.17.1" +"express@npm:4.20.0": + version: 4.20.0 + resolution: "express@npm:4.20.0" dependencies: - accepts: ~1.3.7 + accepts: ~1.3.8 array-flatten: 1.1.1 - body-parser: 1.19.0 - content-disposition: 0.5.3 + body-parser: 1.20.3 + content-disposition: 0.5.4 content-type: ~1.0.4 - cookie: 0.4.0 + cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 - depd: ~1.1.2 - encodeurl: ~1.0.2 + depd: 2.0.0 + encodeurl: ~2.0.0 escape-html: ~1.0.3 etag: ~1.8.1 - finalhandler: ~1.1.2 + finalhandler: 1.2.0 fresh: 0.5.2 - merge-descriptors: 1.0.1 + http-errors: 2.0.0 + merge-descriptors: 1.0.3 methods: ~1.1.2 - on-finished: ~2.3.0 + on-finished: 2.4.1 parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.5 - qs: 6.7.0 + path-to-regexp: 0.1.10 + proxy-addr: ~2.0.7 + qs: 6.11.0 range-parser: ~1.2.1 - safe-buffer: 5.1.2 - send: 0.17.1 - serve-static: 1.14.1 - setprototypeof: 1.1.1 - statuses: ~1.5.0 + safe-buffer: 5.2.1 + send: 0.19.0 + serve-static: 1.16.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 type-is: ~1.6.18 utils-merge: 1.0.1 vary: ~1.1.2 - checksum: d964e9e17af331ea6fa2f84999b063bc47189dd71b4a735df83f9126d3bb2b92e830f1cb1d7c2742530eb625e2689d7a9a9c71f0c3cc4dd6015c3cd32a01abd5 + checksum: faa11bffa16be97b26d9f38187e569378c01cad0b92fbd02094fb4e35a224dc5177cc9cc6849141702da80d2d8cbe857c60a7e622e8106695405dc27e38fb3ee languageName: node linkType: hard @@ -13318,26 +13288,16 @@ __metadata: languageName: node linkType: hard -"fetch-mock@npm:9.11.0": - version: 9.11.0 - resolution: "fetch-mock@npm:9.11.0" +"fetch-mock@npm:^12.0.2": + version: 12.0.2 + resolution: "fetch-mock@npm:12.0.2" dependencies: - "@babel/core": ^7.0.0 - "@babel/runtime": ^7.0.0 - core-js: ^3.0.0 - debug: ^4.1.1 - glob-to-regexp: ^0.4.0 - is-subset: ^0.1.1 - lodash.isequal: ^4.5.0 - path-to-regexp: ^2.2.1 - querystring: ^0.2.0 - whatwg-url: ^6.5.0 - peerDependencies: - node-fetch: "*" - peerDependenciesMeta: - node-fetch: - optional: true - checksum: debc4dd83bcda79b0aa71c38d08da6036906cdc49393343eb3426112314a7e57557255664f745d2e3f0b9b2a6e852bd3a564ae3f08332c27e422d3441bb865bd + "@types/glob-to-regexp": ^0.4.4 + dequal: ^2.0.3 + glob-to-regexp: ^0.4.1 + is-subset-of: ^3.1.10 + regexparam: ^3.0.0 + checksum: 6de234c4a3e2e36dd1505a4cfc19138e75b7dd123665a33a85047d9a675cbe88309f995d0ec8a8df32d8d9b028c6607e6e1a275b2a5c04c420b21c22d88568d8 languageName: node linkType: hard @@ -13471,21 +13431,6 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:~1.1.2": - version: 1.1.2 - resolution: "finalhandler@npm:1.1.2" - dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: ~2.3.0 - parseurl: ~1.3.3 - statuses: ~1.5.0 - unpipe: ~1.0.0 - checksum: 617880460c5138dd7ccfd555cb5dde4d8f170f4b31b8bd51e4b646bb2946c30f7db716428a1f2882d730d2b72afb47d1f67cc487b874cb15426f95753a88965e - languageName: node - linkType: hard - "find-cache-dir@npm:^2.0.0, find-cache-dir@npm:^2.1.0": version: 2.1.0 resolution: "find-cache-dir@npm:2.1.0" @@ -13668,7 +13613,7 @@ __metadata: languageName: node linkType: hard -"follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.4": +"follow-redirects@npm:^1.0.0": version: 1.15.5 resolution: "follow-redirects@npm:1.15.5" peerDependenciesMeta: @@ -13678,6 +13623,16 @@ __metadata: languageName: node linkType: hard +"follow-redirects@npm:^1.15.6": + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" + peerDependenciesMeta: + debug: + optional: true + checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 + languageName: node + linkType: hard + "for-each@npm:^0.3.3": version: 0.3.3 resolution: "for-each@npm:0.3.3" @@ -13956,16 +13911,6 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.1.2": - version: 2.1.3 - resolution: "fsevents@npm:2.1.3" - dependencies: - node-gyp: latest - checksum: b5ec0516b44d75b60af5c01ff80a80cd995d175e4640d2a92fbabd02991dd664d76b241b65feef0775c23d531c3c74742c0fbacd6205af812a9c3cef59f04292 - conditions: os=darwin - languageName: node - linkType: hard - "fsevents@patch:fsevents@^1.2.7#~builtin": version: 1.2.13 resolution: "fsevents@patch:fsevents@npm%3A1.2.13#~builtin::version=1.2.13&hash=d11327" @@ -13985,15 +13930,6 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@~2.1.2#~builtin": - version: 2.1.3 - resolution: "fsevents@patch:fsevents@npm%3A2.1.3#~builtin::version=2.1.3&hash=31d12a" - dependencies: - node-gyp: latest - conditions: os=darwin - languageName: node - linkType: hard - "function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -14070,13 +14006,6 @@ __metadata: languageName: node linkType: hard -"generic-pool@npm:3.9.0": - version: 3.9.0 - resolution: "generic-pool@npm:3.9.0" - checksum: 3d89e9b2018d2e3bbf44fec78c76b2b7d56d6a484237aa9daf6ff6eedb14b0899dadd703b5d810219baab2eb28e5128fb18b29e91e602deb2eccac14492d8ca8 - languageName: node - linkType: hard - "genfun@npm:^5.0.0": version: 5.0.0 resolution: "genfun@npm:5.0.0" @@ -14451,7 +14380,7 @@ __metadata: languageName: node linkType: hard -"glob-to-regexp@npm:^0.4.0": +"glob-to-regexp@npm:^0.4.1": version: 0.4.1 resolution: "glob-to-regexp@npm:0.4.1" checksum: e795f4e8f06d2a15e86f76e4d92751cf8bbfcf0157cea5c2f0f35678a8195a750b34096b1256e436f0cebc1883b5ff0888c47348443e69546a5a87f9e1eb1167 @@ -14873,6 +14802,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -15304,19 +15242,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:1.7.2": - version: 1.7.2 - resolution: "http-errors@npm:1.7.2" - dependencies: - depd: ~1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.1 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.0 - checksum: 5534b0ae08e77f5a45a2380f500e781f6580c4ff75b816cb1f09f99a290b57e78a518be6d866db1b48cca6b052c09da2c75fc91fb16a2fe3da3c44d9acbb9972 - languageName: node - linkType: hard - "http-errors@npm:2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" @@ -15342,19 +15267,6 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:~1.7.2": - version: 1.7.3 - resolution: "http-errors@npm:1.7.3" - dependencies: - depd: ~1.1.2 - inherits: 2.0.4 - setprototypeof: 1.1.1 - statuses: ">= 1.5.0 < 2" - toidentifier: 1.0.0 - checksum: a59f359473f4b3ea78305beee90d186268d6075432622a46fb7483059068a2dd4c854a20ac8cd438883127e06afb78c1309168bde6cdfeed1e3700eb42487d99 - languageName: node - linkType: hard - "http-parser-js@npm:>=0.5.1": version: 0.5.8 resolution: "http-parser-js@npm:0.5.8" @@ -15405,8 +15317,8 @@ __metadata: linkType: hard "http-proxy-middleware@npm:^2.0.3": - version: 2.0.6 - resolution: "http-proxy-middleware@npm:2.0.6" + version: 2.0.7 + resolution: "http-proxy-middleware@npm:2.0.7" dependencies: "@types/http-proxy": ^1.17.8 http-proxy: ^1.18.1 @@ -15418,7 +15330,7 @@ __metadata: peerDependenciesMeta: "@types/express": optional: true - checksum: 2ee85bc878afa6cbf34491e972ece0f5be0a3e5c98a60850cf40d2a9a5356e1fc57aab6cff33c1fc37691b0121c3a42602d2b1956c52577e87a5b77b62ae1c3a + checksum: 18caa21145917aa1054740353916e8f03f5a3a93bede9106f1f44d84f7b174df17af1c72bf5fade5cc440c2058ee813f47cbb2bdd6ae6874af1cf33e0ac575f3 languageName: node linkType: hard @@ -16595,6 +16507,15 @@ __metadata: languageName: node linkType: hard +"is-subset-of@npm:^3.1.10": + version: 3.1.10 + resolution: "is-subset-of@npm:3.1.10" + dependencies: + typedescriptor: 3.0.2 + checksum: 98773fc775596dcfbb0f444e037e5ad101319a7932b82d85f706e77f6e53fe5b8bf19a3a8bea950269313c81c7f4ddec51fb107eedb9b51323b2d97a8dfb06c3 + languageName: node + linkType: hard + "is-subset@npm:^0.1.1": version: 0.1.1 resolution: "is-subset@npm:0.1.1" @@ -19132,6 +19053,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -19863,13 +19791,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.1": - version: 2.1.1 - resolution: "ms@npm:2.1.1" - checksum: 0078a23cd916a9a7435c413caa14c57d4b4f6e2470e0ab554b6964163c8a4436448ac7ae020e883685475da6b6796cc396b670f579cb275db288a21e3e57721e - languageName: node - linkType: hard - "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" @@ -21567,6 +21488,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: ab7a3b7a0b914476d44030340b0a65d69851af2a0f33427df1476100ccb87d409c39e2182837a96b98fb38c4ef2ba6b87bdad62bb70a2c153876b8061760583c + languageName: node + linkType: hard + "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" @@ -21583,13 +21511,6 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:^2.2.1": - version: 2.4.0 - resolution: "path-to-regexp@npm:2.4.0" - checksum: 581175bf2968e51452f2b8c71f10e75c995693668b4ecf7d0b48962fbe0c56830661ca5dd5fd6d8e2f0cc9a045ce07e89af504ab133e1d21887c2712df85b1f4 - languageName: node - linkType: hard - "path-to-regexp@npm:^6.2.1": version: 6.2.1 resolution: "path-to-regexp@npm:6.2.1" @@ -23036,7 +22957,7 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:~2.0.5, proxy-addr@npm:~2.0.7": +"proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" dependencies: @@ -23179,10 +23100,12 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.7.0": - version: 6.7.0 - resolution: "qs@npm:6.7.0" - checksum: dfd5f6adef50e36e908cfa70a6233871b5afe66fbaca37ecc1da352ba29eb2151a3797991948f158bb37fccde51bd57845cb619a8035287bfc24e4591172c347 +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: ^1.0.6 + checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 languageName: node linkType: hard @@ -23242,13 +23165,6 @@ __metadata: languageName: node linkType: hard -"querystring@npm:^0.2.0": - version: 0.2.1 - resolution: "querystring@npm:0.2.1" - checksum: 7b83b45d641e75fd39cd6625ddfd44e7618e741c61e95281b57bbae8fde0afcc12cf851924559e5cc1ef9baa3b1e06e22b164ea1397d65dd94b801f678d9c8ce - languageName: node - linkType: hard - "querystringify@npm:^2.1.1": version: 2.2.0 resolution: "querystringify@npm:2.2.0" @@ -23374,18 +23290,6 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.4.0": - version: 2.4.0 - resolution: "raw-body@npm:2.4.0" - dependencies: - bytes: 3.1.0 - http-errors: 1.7.2 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 6343906939e018c6e633a34a938a5d6d1e93ffcfa48646e00207d53b418e941953b521473950c079347220944dc75ba10e7b3c08bf97e3ac72c7624882db09bb - languageName: node - linkType: hard - "raw-body@npm:2.5.1": version: 2.5.1 resolution: "raw-body@npm:2.5.1" @@ -23398,7 +23302,7 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.3.0": +"raw-body@npm:2.5.2, raw-body@npm:^2.3.0": version: 2.5.2 resolution: "raw-body@npm:2.5.2" dependencies: @@ -24144,17 +24048,28 @@ __metadata: languageName: node linkType: hard -"redis@npm:4.6.13": - version: 4.6.13 - resolution: "redis@npm:4.6.13" +"redis-commands@npm:^1.2.0": + version: 1.7.0 + resolution: "redis-commands@npm:1.7.0" + checksum: d1ff7fbcb5e54768c77f731f1d49679d2a62c3899522c28addb4e2e5813aea8bcac3f22519d71d330224c3f2937f935dfc3d8dc65e90db0f5fe22dc2c1515aa7 + languageName: node + linkType: hard + +"redis-parser@npm:^2.6.0": + version: 2.6.0 + resolution: "redis-parser@npm:2.6.0" + checksum: 8d4936875e39d56a951e0bbb6653b4da1f7fdd727552c89561c3c78e7ffeb9c3e8820a78454e939b74d1ba20996d62ac179b4fc39d07340d10f8d52740399422 + languageName: node + linkType: hard + +"redis@npm:2.8.0": + version: 2.8.0 + resolution: "redis@npm:2.8.0" dependencies: - "@redis/bloom": 1.2.0 - "@redis/client": 1.5.14 - "@redis/graph": 1.1.1 - "@redis/json": 1.0.6 - "@redis/search": 1.1.6 - "@redis/time-series": 1.0.5 - checksum: 10150ec30f1f89e47cec41c27dc77a99c78a0b078735de4fc9b79c2a779787d52274c64c52004af161b95b9729067671a4cfca95257719968accb30057856a09 + double-ended-queue: ^2.1.0-0 + redis-commands: ^1.2.0 + redis-parser: ^2.6.0 + checksum: e44dc50a9a92ede2c95b3166482a4b04373853fdbb72ab138e834b868a3cd446798742fc0f85de2d5e442f9c86f58e1250637ea71af3ad5527478d05ef430079 languageName: node linkType: hard @@ -24249,6 +24164,13 @@ __metadata: languageName: node linkType: hard +"regexparam@npm:^3.0.0": + version: 3.0.0 + resolution: "regexparam@npm:3.0.0" + checksum: c8649af1538ccc12b5c5d250525f61bd370227dce41f4fb908433a9651e18b7be21dd8f8518c322dd9ebd75f7caaaea4921e374c39a469c11d4f9d0c738043e0 + languageName: node + linkType: hard + "regexpu-core@npm:^5.3.1": version: 5.3.2 resolution: "regexpu-core@npm:5.3.2" @@ -24916,17 +24838,17 @@ __metadata: languageName: node linkType: hard -"rollup@npm:2.35.1": - version: 2.35.1 - resolution: "rollup@npm:2.35.1" +"rollup@npm:2.79.2": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" dependencies: - fsevents: ~2.1.2 + fsevents: ~2.3.2 dependenciesMeta: fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: d696a4bed381e26583735ecf1650c9da31fae90efd1f1e21f0804156930b1dc71b2dc4c3d1f836a64fb70662a07ec7f52e60d90d6243e10d85a5198c1a1f6e2b + checksum: df7aa4c8b95245dede157b06ab71e1921de6080757d30e9bf31f8fb142064d12dda865e2bafbab4349588f43425b2965a290c9a5da1c048246a70fc21734ebd7 languageName: node linkType: hard @@ -25313,30 +25235,30 @@ __metadata: languageName: node linkType: hard -"send@npm:0.17.1": - version: 0.17.1 - resolution: "send@npm:0.17.1" +"send@npm:0.18.0": + version: 0.18.0 + resolution: "send@npm:0.18.0" dependencies: debug: 2.6.9 - depd: ~1.1.2 - destroy: ~1.0.4 + depd: 2.0.0 + destroy: 1.2.0 encodeurl: ~1.0.2 escape-html: ~1.0.3 etag: ~1.8.1 fresh: 0.5.2 - http-errors: ~1.7.2 + http-errors: 2.0.0 mime: 1.6.0 - ms: 2.1.1 - on-finished: ~2.3.0 + ms: 2.1.3 + on-finished: 2.4.1 range-parser: ~1.2.1 - statuses: ~1.5.0 - checksum: d214c2fa42e7fae3f8fc1aa3931eeb3e6b78c2cf141574e09dbe159915c1e3a337269fc6b7512e7dfddcd7d6ff5974cb62f7c3637ba86a55bde20a92c18bdca0 + statuses: 2.0.1 + checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" dependencies: debug: 2.6.9 depd: 2.0.0 @@ -25351,7 +25273,7 @@ __metadata: on-finished: 2.4.1 range-parser: ~1.2.1 statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 + checksum: 5ae11bd900c1c2575525e2aa622e856804e2f96a09281ec1e39610d089f53aa69e13fd8db84b52f001d0318cf4bb0b3b904ad532fc4c0014eb90d32db0cff55f languageName: node linkType: hard @@ -25388,27 +25310,27 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.14.1": - version: 1.14.1 - resolution: "serve-static@npm:1.14.1" +"serve-static@npm:1.15.0, serve-static@npm:^1.14.1": + version: 1.15.0 + resolution: "serve-static@npm:1.15.0" dependencies: encodeurl: ~1.0.2 escape-html: ~1.0.3 parseurl: ~1.3.3 - send: 0.17.1 - checksum: c6b268e8486d39ecd54b86c7f2d0ee4a38cd7514ddd9c92c8d5793bb005afde5e908b12395898ae206782306ccc848193d93daa15b86afb3cbe5a8414806abe8 + send: 0.18.0 + checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d languageName: node linkType: hard -"serve-static@npm:1.15.0, serve-static@npm:^1.14.1": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:1.16.0": + version: 1.16.0 + resolution: "serve-static@npm:1.16.0" dependencies: encodeurl: ~1.0.2 escape-html: ~1.0.3 parseurl: ~1.3.3 send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d + checksum: a479dfe7e9fa7e8cb3ceccb0d944a3c72bb8f88d78472e30989f58fe15a92cfc909ab05a5c7cda2d1a6aa2663ab503ad1e2f40653740346e53e72b3ba41b6951 languageName: node linkType: hard @@ -25433,6 +25355,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -25470,13 +25406,6 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.1.1": - version: 1.1.1 - resolution: "setprototypeof@npm:1.1.1" - checksum: a8bee29c1c64c245d460ce53f7460af8cbd0aceac68d66e5215153992cc8b3a7a123416353e0c642060e85cc5fd4241c92d1190eec97eda0dcb97436e8fcca3b - languageName: node - linkType: hard - "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -25639,6 +25568,18 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -26250,7 +26191,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:>= 1.4.0 < 2, statuses@npm:>= 1.5.0 < 2, statuses@npm:~1.5.0": +"statuses@npm:>= 1.4.0 < 2": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c @@ -27489,13 +27430,6 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.0": - version: 1.0.0 - resolution: "toidentifier@npm:1.0.0" - checksum: 199e6bfca1531d49b3506cff02353d53ec987c9ee10ee272ca6484ed97f1fc10fb77c6c009079ca16d5c5be4a10378178c3cacdb41ce9ec954c3297c74c6053e - languageName: node - linkType: hard - "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" @@ -27757,7 +27691,7 @@ __metadata: languageName: node linkType: hard -"type-is@npm:~1.6.17, type-is@npm:~1.6.18": +"type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: @@ -27837,6 +27771,13 @@ __metadata: languageName: node linkType: hard +"typedescriptor@npm:3.0.2": + version: 3.0.2 + resolution: "typedescriptor@npm:3.0.2" + checksum: 90e637ece22df0687acae70e152e88dd07ec10d0f4c87de2752bbcb78e420c5f5c86c3fe5e41d9f315a741a1e379e197fc5cb52044f33aafe891be6c63825ef7 + languageName: node + linkType: hard + "ua-parser-js@npm:^0.7.30": version: 0.7.37 resolution: "ua-parser-js@npm:0.7.37" @@ -29068,17 +29009,6 @@ __metadata: languageName: node linkType: hard -"whatwg-url@npm:^6.5.0": - version: 6.5.0 - resolution: "whatwg-url@npm:6.5.0" - dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: a10bd5e29f4382cd19789c2a7bbce25416e606b6fefc241c7fe34a2449de5bc5709c165bd13634eda433942d917ca7386a52841780b82dc37afa8141c31a8ebd - languageName: node - linkType: hard - "whatwg-url@npm:^7.0.0": version: 7.1.0 resolution: "whatwg-url@npm:7.1.0" @@ -29554,13 +29484,6 @@ __metadata: languageName: node linkType: hard -"yallist@npm:4.0.0, yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 - languageName: node - linkType: hard - "yallist@npm:^2.1.2": version: 2.1.2 resolution: "yallist@npm:2.1.2" @@ -29575,6 +29498,13 @@ __metadata: languageName: node linkType: hard +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + "yaml@npm:^1.10.0, yaml@npm:^1.10.2, yaml@npm:^1.7.2": version: 1.10.2 resolution: "yaml@npm:1.10.2"