File manager - Edit - /var/www/html/portal/config/mobiangra.php
Back
<?php return [ /* |-------------------------------------------------------------------------- | API de Telemetria (Systemsatx) |-------------------------------------------------------------------------- */ 'api_url' => env('MOBIANGRA_API_URL', 'http://wsbus.systemsatx.com.br/WCFMoovit.svc/ListaUltimaPosicao'), 'api_hash' => env('MOBIANGRA_API_HASH', 'fca82037402a'), 'api_timeout' => env('MOBIANGRA_API_TIMEOUT', 15), /* |-------------------------------------------------------------------------- | Intervalo de atualização (segundos) |-------------------------------------------------------------------------- */ 'fetch_interval' => env('MOBIANGRA_FETCH_INTERVAL', 10), /* |-------------------------------------------------------------------------- | Caminhos de armazenamento |-------------------------------------------------------------------------- */ 'storage_dir' => 'mobiangra', 'gtfs_dir' => 'mobiangra/gtfs', /** Tamanho máximo do ZIP GTFS no upload admin (kilobytes). */ 'gtfs_zip_max_kb' => env('MOBIANGRA_GTFS_ZIP_MAX_KB', 102400), 'gtfs_zip_filename' => 'gtfs_static.zip', 'gtfs_zip_download_name' => 'angra-gtfs.zip', 'pb_filename' => 'gtfs_realtime_vehicle_position.pb', /* |-------------------------------------------------------------------------- | Publicação estática dos feeds (Google Transit / validadores GTFS) |-------------------------------------------------------------------------- | Arquivos copiados para public/mobiangra-assets/gtfs/ e servidos em /mobiangra/gtfs/* | via Apache (estático, sem CORS/cookies). Atualização: cron + /live_data. */ 'public_gtfs_dir' => 'mobiangra-assets/gtfs', 'public_gtfs_feed_pb_path' => 'mobiangra-assets/gtfs/feed.pb', 'public_gtfs_zip_path' => 'mobiangra-assets/gtfs/gtfs.zip', 'public_gtfs_pb_name' => 'feed.pb', 'public_gtfs_zip_name' => 'gtfs.zip', /** Headers HTTP do GTFS-RT (alinhados ao endpoint legado que funcionava no Google Transit). */ 'gtfs_rt_cache_control' => 'no-cache', 'gtfs_rt_content_disposition' => 'inline; filename=feed.pb', 'live_data_filename' => 'live_data.json', 'feed_status_filename' => 'feed_status.json', /* |-------------------------------------------------------------------------- | ID do Órgão Responsável (Structure) |-------------------------------------------------------------------------- | ID da Secretaria/Órgão que será usado para renderizar o menu lateral, | localização e informações do gestor nas páginas públicas. */ 'structure_id' => env('MOBIANGRA_STRUCTURE_ID', '56ca9600-84ca-4275-b097-f08de2b668b6'), // Placeholder (Ex: Cultura) /* |-------------------------------------------------------------------------- | Fale Conosco - Manifestações do cidadão |-------------------------------------------------------------------------- | MOBIANGRA_MANIFESTACAO_EMAIL - e-mail que recebe as manifestações enviadas. | MOBIANGRA_MANIFESTACAO_IMAGEM_MAX_KB - tamanho final após compressão automática. | MOBIANGRA_MANIFESTACAO_IMAGEM_UPLOAD_MAX_KB - limite de upload antes da compressão. */ 'manifestacao_email_destino' => env('MOBIANGRA_MANIFESTACAO_EMAIL', 'mobilidade@angra.rj.gov.br'), 'manifestacao_relato_max' => (int) env('MOBIANGRA_MANIFESTACAO_RELATO_MAX', 2000), 'manifestacao_imagem_max_kb' => (int) env('MOBIANGRA_MANIFESTACAO_IMAGEM_MAX_KB', 2048), 'manifestacao_imagem_upload_max_kb' => (int) env('MOBIANGRA_MANIFESTACAO_IMAGEM_UPLOAD_MAX_KB', 10240), /* |-------------------------------------------------------------------------- | Configuração editável da frota (fonte externa) |-------------------------------------------------------------------------- | Mapeamentos API→GTFS, cores e veículos com AC. O arquivo em | storage/app/mobiangra/fleet.json é criado automaticamente a partir dos | valores abaixo (seed) e pode ser alterado pelo painel admin sem deploy. */ 'fleet_filename' => 'fleet.json', 'defaults' => [ 'vehicle_color' => '#22c55e', 'line_color' => ['bg' => '#0066cc', 'text' => 'white'], ], /* |-------------------------------------------------------------------------- | Mapeamento interno -> GTFS | Chave: "{Linha}_{Rota}" do rastreador Systemsatx | Valor: [route_id, direction_id] |-------------------------------------------------------------------------- */ 'internal_to_gtfs' => [ '39_274' => ['39', 0], '39_275' => ['39', 1], '42_89' => ['42', 0], '42_91' => ['42', 1], '46_251' => ['46', 0], '46_100' => ['46', 1], '49_95' => ['49', 0], '49_98' => ['49', 1], '51_105' => ['51', 0], '51_106' => ['51', 1], '53_109' => ['53', 0], '53_110' => ['53', 1], '56_115' => ['56', 0], '56_117' => ['56', 1], '57_129' => ['57', 0], '57_130' => ['57', 1], '58_125' => ['58', 0], '58_126' => ['58', 1], '60_113' => ['60', 0], '60_114' => ['60', 1], '69_84' => ['69', 0], '69_124' => ['69', 1], '71_152' => ['71', 0], '71_154' => ['71', 1], '76_155' => ['76', 0], '76_156' => ['76', 1], '80_160' => ['80', 0], '80_161' => ['80', 1], '81_190' => ['81', 0], '81_138' => ['81', 1], '83_162' => ['83', 0], '83_163' => ['83', 1], '85_164' => ['85', 0], '85_167' => ['85', 1], '86_140' => ['86', 0], '86_139' => ['86', 1], '90_173' => ['90', 0], '90_174' => ['90', 1], '91_176' => ['91', 0], '91_177' => ['91', 1], '93_180' => ['93', 0], '93_181' => ['93', 1], '94_168' => ['94', 0], '94_169' => ['94', 1], '95_182' => ['95', 0], '95_183' => ['95', 1], '96_186' => ['96', 0], '96_185' => ['96', 1], '98_187' => ['98', 0], '98_188' => ['98', 1], '99_137' => ['99', 0], '99_189' => ['99', 1], '101_191' => ['101', 0], '101_192' => ['101', 1], '102_127' => ['102', 0], '102_131' => ['102', 1], '104_146' => ['104', 0], '104_147' => ['104', 1], '119_234' => ['119', 0], '119_235' => ['119', 1], '120_237' => ['120', 0], '120_238' => ['120', 1], '121_230' => ['121', 0], '121_229' => ['121', 1], '123_253' => ['123', 0], '123_255' => ['123', 1], '124_250' => ['124', 0], '124_249' => ['124', 1], '125_227' => ['125', 0], '125_228' => ['125', 1], '126_99' => ['126', 0], '126_252' => ['126', 1], '127_257' => ['127', 0], '127_256' => ['127', 1], '128_258' => ['128', 0], '128_259' => ['128', 1], // Alinhado ao GTFS atual: route_id da B101 passou de 130 → 139. '130_262' => ['139', 0], '130_263' => ['139', 1], '139_262' => ['139', 0], '139_263' => ['139', 1], '131_264' => ['131', 0], '131_265' => ['131', 1], '132_260' => ['132', 0], '132_261' => ['132', 1], '133_160' => ['133', 0], '133_266' => ['133', 1], '137_280' => ['137', 0], '137_276' => ['137', 1], '138_284' => ['138', 0], '138_285' => ['138', 1], ], /* |-------------------------------------------------------------------------- | Mapa de rotas: route_id -> nome legível da linha |-------------------------------------------------------------------------- */ 'route_names' => [ '51' => '101 Cantagalo', '130' => 'B101 Cantagalo via Condomínio Portogalo', '139' => 'B101 Cantagalo via Condomínio Portogalo', '53' => '102 Caputera', '60' => '103 Camorim', '83' => '104 Monsuaba', '137' => '105 Morro do Moreno', '76' => '106 Jacuecanga', '90' => 'B106 Jacuecanga Morro da Cruz', '96' => '202 Frade via Sertãozinho', '46' => '203 Serra D\'Água via Zungú', '134' => '203 Zungú (Escola)', '126' => 'B203 Serra D\'Água via Túnel', '138' => '204 Ariró', '94' => '205 Areal', '86' => '206 Banqueta', '125' => 'B206 Banqueta via Morro da Cruz', '121' => 'C206 Via Condomínio Vale da Banqueta', '99' => 'A207 Japuíba via Morro da Cruz', '81' => 'B207 Japuíba via Rio-Santos', '98' => 'A208 Belém via São José', '57' => 'B208 Belém via Bom Jesus', '93' => 'A220 Japuíba via Gamboa (micro)', '95' => 'B220 Japuíba via Gamboa/Ribeira', '80' => '221 Nova Angra', '133' => 'B221 Nova Angra via Gamboa/Ribeira', '91' => '224 Vila Nova', '85' => '225 Campo Belo', '119' => '227 Expresso Pq. Mambucaba', '120' => '230 Itinga', '56' => '300 Japuíba x Ponta Leste', '101' => '306 Belém x Jacuecanga', '102' => 'C01 Circular', '131' => 'C01B Circular via Pestalozzi', '58' => 'C03 Marinas', '123' => 'C03B Marinas via Balneário', '104' => 'C04 Vila Velha', '127' => 'C04B Vila Velha via Heliponto/Tanguá', '69' => 'C05 Retiro', '128' => 'C05B Retiro via Balneário', '71' => 'T10 Divisa Mangaratiba', '42' => 'T11 Ponta Leste', '39' => 'T20 Parque Mambucaba', '49' => 'T21 Frade', '124' => 'T21B Praia Brava', '132' => 'T21C Frade via Itinga', ], /* |-------------------------------------------------------------------------- | Cores do popup por código de linha (para o mapa Leaflet) |-------------------------------------------------------------------------- */ 'line_colors' => [ '101' => ['bg' => 'orange', 'text' => 'white'], 'B101' => ['bg' => 'orange', 'text' => 'white'], '102' => ['bg' => 'green', 'text' => 'white'], '103' => ['bg' => 'orange', 'text' => 'white'], '104' => ['bg' => 'orange', 'text' => 'white'], '105' => ['bg' => 'orange', 'text' => 'white'], '106' => ['bg' => 'green', 'text' => 'white'], 'B106' => ['bg' => 'green', 'text' => 'white'], '202' => ['bg' => 'orange', 'text' => 'white'], '203' => ['bg' => 'green', 'text' => 'white'], 'B203' => ['bg' => 'green', 'text' => 'white'], '204' => ['bg' => 'orange', 'text' => 'white'], '205' => ['bg' => 'orange', 'text' => 'white'], '206' => ['bg' => 'green', 'text' => 'white'], 'B206' => ['bg' => 'orange', 'text' => 'white'], 'C206' => ['bg' => 'orange', 'text' => 'white'], 'A207' => ['bg' => 'green', 'text' => 'white'], 'B207' => ['bg' => 'green', 'text' => 'white'], 'A208' => ['bg' => 'green', 'text' => 'white'], 'B208' => ['bg' => 'green', 'text' => 'white'], 'A220' => ['bg' => 'orange', 'text' => 'white'], 'B220' => ['bg' => 'green', 'text' => 'white'], '221' => ['bg' => 'orange', 'text' => 'white'], 'B221' => ['bg' => 'orange', 'text' => 'white'], '224' => ['bg' => 'orange', 'text' => 'white'], '225' => ['bg' => 'orange', 'text' => 'white'], '227' => ['bg' => 'green', 'text' => 'white'], '230' => ['bg' => 'green', 'text' => 'white'], '300' => ['bg' => 'green', 'text' => 'white'], '306' => ['bg' => 'green', 'text' => 'white'], 'C01' => ['bg' => 'orange', 'text' => 'white'], 'C01B' => ['bg' => 'orange', 'text' => 'white'], 'C03' => ['bg' => 'orange', 'text' => 'white'], 'C03B' => ['bg' => 'orange', 'text' => 'white'], 'C04' => ['bg' => 'orange', 'text' => 'white'], 'C04B' => ['bg' => 'orange', 'text' => 'white'], 'C05' => ['bg' => 'green', 'text' => 'white'], 'C05B' => ['bg' => 'green', 'text' => 'white'], 'T10' => ['bg' => 'green', 'text' => 'white'], 'T11' => ['bg' => 'green', 'text' => 'white'], 'T20' => ['bg' => 'green', 'text' => 'white'], 'T21' => ['bg' => 'green', 'text' => 'white'], 'T21B' => ['bg' => 'green', 'text' => 'white'], 'T21C' => ['bg' => 'green', 'text' => 'white'], ], /* |-------------------------------------------------------------------------- | Micro-ônibus (lista estática da frota) | Ícone e rótulo no mapa são definidos pelo ID do veículo, não pela linha. |-------------------------------------------------------------------------- */ 'micro_vehicles' => [ '002', '003', '004', '026', '057', '058', '061', '062', ], /* |-------------------------------------------------------------------------- | Veículos com Ar Condicionado (lista estática da frota) | Baseado no cadastro real dos ônibus. Identificados por ID do veículo. |-------------------------------------------------------------------------- */ 'ac_vehicles' => [ '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '013', '016', '018', '019', '022', '023', '024', '025', '026', '027', '030', '032', '033', '034', '035', '036', '037', '038', '039', '040', '041', '042', '044', '049', '051', '052', '053', '054', '057', '058', '060', '061', '062', '063', '071', '073', '075', '076', '077', '078', '079', '081', '084', '085', '086', '087', '088', '089', '092', '093', '094', '095', '096', '097', '098', '099', '100', '101', '102', '103', '104', '105', '106', '107', '108', ], /* |-------------------------------------------------------------------------- | Headsigns de direção por rota (extraídos de trips.txt → trip_headsign) | Chave: route_id | Valor: ['0' => 'Destino Ida', '1' => 'Destino Volta'] |-------------------------------------------------------------------------- */ 'direction_headsigns' => [ '39' => ['0' => 'PARQUE MAMBUCABA', '1' => 'CENTRO'], '42' => ['0' => 'PONTA LESTE', '1' => 'CENTRO'], '46' => ['0' => "SERRA D'ÁGUA (VIA ZUNGÚ)", '1' => 'CENTRO'], '49' => ['0' => 'FRADE', '1' => 'CENTRO'], '51' => ['0' => 'CANTAGALO', '1' => 'DIVISA MANGARATIBA'], '53' => ['0' => 'CAPUTERA', '1' => 'CENTRO'], '56' => ['0' => 'PONTA LESTE', '1' => 'JAPUÍBA'], '57' => ['0' => 'BELÉM (VIA BOM JESUS)', '1' => 'CENTRO'], '58' => ['0' => 'MARINAS', '1' => 'CENTRO'], '60' => ['0' => 'CAMORIM', '1' => 'CENTRO'], '69' => ['0' => 'RETIRO', '1' => 'CENTRO'], '71' => ['0' => 'DIVISA MANGARATIBA', '1' => 'CENTRO'], '76' => ['0' => 'JACUECANGA', '1' => 'CENTRO'], '80' => ['0' => 'NOVA ANGRA', '1' => 'CENTRO'], '81' => ['0' => 'JAPUÍBA (VIA RIO-SANTOS)', '1' => 'CENTRO (VIA MORRO DA CRUZ)'], '83' => ['0' => 'MONSUABA', '1' => 'CENTRO'], '85' => ['0' => 'CAMPO BELO', '1' => 'CENTRO (VIA CAMPO BELO)'], '86' => ['0' => 'BANQUETA', '1' => 'CENTRO'], '90' => ['0' => 'JACUECANGA (VIA MORRO DA CRUZ)', '1' => 'CENTRO (VIA MORRO DA CRUZ)'], '91' => ['0' => 'VILA NOVA', '1' => 'CENTRO (VIA VILA NOVA)'], '93' => ['0' => 'JAPUÍBA / GAMBOA', '1' => 'CENTRO (VIA BALNEÁRIO)'], '94' => ['0' => 'AREAL', '1' => 'CENTRO'], '95' => ['0' => 'JAPUÍBA / GAMBOA / RIBEIRA', '1' => 'CENTRO (VIA BALNEÁRIO)'], '96' => ['0' => 'FRADE (VIA SERTÃOZINHO E BEIRA-RIO)', '1' => 'CENTRO'], '98' => ['0' => 'BELÉM (VIA SÃO JOSÉ)', '1' => 'CENTRO'], '99' => ['0' => 'JAPUÍBA (VIA MORRO DA CRUZ)', '1' => 'CENTRO (VIA MORRO DA CRUZ)'], '101' => ['0' => 'JACUECANGA', '1' => 'BELÉM'], '102' => ['0' => 'CIRCULAR BALNEÁRIO', '1' => 'CIRCULAR BALNEÁRIO'], '104' => ['0' => 'VILA VELHA', '1' => 'CENTRO'], '119' => ['0' => 'EXPRESSO PARQUE MAMBUCABA', '1' => 'EXPRESSO CENTRO'], '120' => ['0' => 'ITINGA', '1' => 'CENTRO'], '121' => ['0' => 'BANQUETA (VIA VALE DA BANQUETA)', '1' => 'CENTRO'], '123' => ['0' => 'MARINAS (VIA BALNEÁRIO)', '1' => 'CENTRO (VIA BALNEÁRIO)'], '124' => ['0' => 'PRAIA BRAVA', '1' => 'CENTRO'], '125' => ['0' => 'BANQUETA (VIA MORRO DA CRUZ)', '1' => 'CENTRO (VIA MORRO DA CRUZ)'], '126' => ['0' => "SERRA D'ÁGUA (VIA TÚNEL)", '1' => 'CENTRO'], '127' => ['0' => 'VILA VELHA (VIA TANGUÁ / HELIPONTO)', '1' => 'CENTRO'], '128' => ['0' => 'RETIRO (VIA BALNEÁRIO)', '1' => 'CENTRO (VIA BALNEÁRIO)'], '130' => ['0' => 'DV. MANGARATIBA (VIA COND. PORTOGALO)', '1' => 'CENTRO'], '131' => ['0' => 'CIRCULAR (VIA PESTALOZZI)', '1' => 'CIRCULAR (VIA PESTALOZZI)'], '132' => ['0' => 'FRADE (VIA ITINGA)', '1' => 'CENTRO (VIA ITINGA)'], '133' => ['0' => 'NOVA ANGRA / GAMBOA / RIBEIRA', '1' => 'CENTRO (VIA BALNEÁRIO)'], '137' => ['0' => 'MORRO DO MORENO', '1' => 'CENTRO'], '138' => ['0' => 'ARIRÓ', '1' => 'CENTRO'], ], /* |-------------------------------------------------------------------------- | Cores dos ícones de veículos no mapa (por ID do veículo) | Baseado na frota real. Fallback: 'red'. |-------------------------------------------------------------------------- */ /* |-------------------------------------------------------------------------- | Previsão de chegada (ETA) em tempo real |-------------------------------------------------------------------------- | Limites usados no cálculo (backend) e na exibição do mapa (frontend). */ 'eta' => [ /** Previsão máxima exibida (minutos). Acima disso a linha não aparece na lista. */ 'max_minutes' => (int) env('MOBIANGRA_ETA_MAX_MINUTES', 60), /** Até este valor (minutos), o front exibe o rótulo "Chegando" em vez do número. */ 'chegando_threshold_minutes' => (int) env('MOBIANGRA_ETA_CHEGANDO_THRESHOLD_MINUTES', 1), /** Quantidade máxima de linhas com ETA listadas por parada no mapa. */ 'display_max_lines' => (int) env('MOBIANGRA_ETA_DISPLAY_MAX_LINES', 8), /** Ignora posição de veículo sem atualização há mais de N segundos. */ 'max_stale_seconds' => (int) env('MOBIANGRA_ETA_MAX_STALE_SECONDS', 120), /** * Idade máxima do lote live_data.json: max(max_stale_seconds, fetch_interval * multiplicador). * Se o arquivo estiver mais antigo, nenhuma previsão é retornada. */ 'max_file_age_interval_multiplier' => (int) env('MOBIANGRA_ETA_FILE_AGE_MULTIPLIER', 120), /** Descarta veículo cuja projeção perpendicular ao trajeto exceda este valor (metros). */ 'max_dist_to_shape_m' => (float) env('MOBIANGRA_ETA_MAX_DIST_TO_SHAPE_M', 500), /** Margem (metros) para considerar que o veículo já passou da parada. */ 'vehicle_past_stop_margin_m' => (float) env('MOBIANGRA_ETA_PAST_STOP_MARGIN_M', 150), /** Descarta posição individual defasada em relação ao timestamp do live_data (segundos). */ 'max_vehicle_lag_behind_file_seconds' => (int) env('MOBIANGRA_ETA_MAX_VEHICLE_LAG_SECONDS', 600), 'min_speed_kmh' => (float) env('MOBIANGRA_ETA_MIN_SPEED_KMH', 5), 'max_speed_kmh' => (float) env('MOBIANGRA_ETA_MAX_SPEED_KMH', 60), 'default_speed_kmh' => (float) env('MOBIANGRA_ETA_DEFAULT_SPEED_KMH', 20), ], /* |-------------------------------------------------------------------------- | Linhas próximas (widget da home e API pública) |-------------------------------------------------------------------------- */ 'nearby' => [ 'bounds' => [ 'lat_min' => -23.15, 'lat_max' => -22.85, 'lng_min' => -44.55, 'lng_max' => -44.05, ], 'default_radius_m' => 800, 'max_radius_m' => 2000, 'default_limit' => 5, 'max_limit' => 10, /** Card "Parada mais próxima" do mapa (quantidade de paradas para alternar). */ 'stops_default_limit' => 5, 'stops_max_limit' => 8, ], 'vehicle_colors' => [ '001' => 'limegreen', '002' => 'sandybrown', '02' => 'sandybrown', '003' => 'sandybrown', '03' => 'sandybrown', '004' => 'sandybrown', '04' => 'sandybrown', '005' => 'limegreen', '006' => 'limegreen', '007' => 'limegreen', '008' => 'limegreen', '009' => 'limegreen', '010' => 'limegreen', '011' => 'limegreen', '012' => 'limegreen', '013' => 'limegreen', '014' => 'limegreen', '015' => 'limegreen', '016' => 'limegreen', '017' => 'sandybrown', '018' => 'limegreen', '019' => 'limegreen', '020' => 'limegreen', '021' => 'limegreen', '022' => 'limegreen', '023' => 'limegreen', '024' => 'limegreen', '025' => 'limegreen', '026' => 'sandybrown', '26' => 'sandybrown', '027' => 'limegreen', '028' => 'limegreen', '029' => 'limegreen', '030' => 'limegreen', '031' => 'limegreen', '032' => 'limegreen', '033' => 'limegreen', '034' => 'limegreen', '035' => 'limegreen', '036' => 'limegreen', '037' => 'limegreen', '038' => 'sandybrown', '039' => 'limegreen', '040' => 'limegreen', '041' => 'sandybrown', '042' => 'limegreen', '043' => 'sandybrown', '044' => 'limegreen', '045' => 'limegreen', '046' => 'limegreen', '047' => 'limegreen', '048' => 'limegreen', '049' => 'limegreen', '050' => 'limegreen', '051' => 'limegreen', '052' => 'limegreen', '053' => 'limegreen', '054' => 'limegreen', '055' => 'limegreen', '056' => 'limegreen', '057' => 'sandybrown', '57' => 'sandybrown', '058' => 'sandybrown', '58' => 'sandybrown', '059' => 'limegreen', '060' => 'limegreen', '061' => 'sandybrown', '61' => 'sandybrown', '062' => 'sandybrown', '62' => 'sandybrown', '063' => 'limegreen', '064' => 'limegreen', '065' => 'sandybrown', '066' => 'springgreen', '067' => 'sandybrown', '068' => 'springgreen', '069' => 'limegreen', '070' => 'limegreen', '071' => 'limegreen', '072' => 'sandybrown', '073' => 'limegreen', '074' => 'sandybrown', '075' => 'limegreen', '076' => 'limegreen', '077' => 'limegreen', '078' => 'limegreen', '079' => 'limegreen', '080' => 'sandybrown', '081' => 'limegreen', '082' => 'sandybrown', '083' => 'sandybrown', '084' => 'limegreen', '085' => 'limegreen', '086' => 'limegreen', '087' => 'limegreen', '088' => 'limegreen', '089' => 'limegreen', '090' => 'sandybrown', '091' => 'sandybrown', '092' => 'limegreen', '093' => 'limegreen', '094' => 'limegreen', '095' => 'limegreen', '096' => 'limegreen', '097' => 'limegreen', '098' => 'limegreen', '099' => 'limegreen', '100' => 'limegreen', '101' => 'limegreen', '102' => 'limegreen', '103' => 'limegreen', '104' => 'limegreen', '105' => 'limegreen', '106' => 'limegreen', '107' => 'limegreen', '108' => 'limegreen', '169' => 'green', '172' => 'green', ], ];
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.23 |
proxy
|
phpinfo
|
Settings