Repository: JHBitencourt/dart-book Branch: master Commit: 3dcb4049d330 Files: 487 Total size: 753.8 KB Directory structure: gitextract__k1_49lz/ ├── .github/ │ └── workflows/ │ └── deploy.yaml ├── .gitignore ├── CNAME ├── README.md ├── code/ │ └── pt_Br/ │ ├── 01_capitulo/ │ │ ├── 01_primeiro_programa/ │ │ │ └── main.dart │ │ └── 02_erro_main/ │ │ └── main.dart │ ├── 02_capitulo/ │ │ ├── 01_operadores_aritmeticos/ │ │ │ └── main.dart │ │ ├── 02_operadores_relacionais_equalidade/ │ │ │ └── main.dart │ │ ├── 03_operadores_logicos/ │ │ │ └── main.dart │ │ ├── 04_operador_bit_and/ │ │ │ └── main.dart │ │ ├── 05_operador_bit_or/ │ │ │ └── main.dart │ │ ├── 06_operador_bit_xor/ │ │ │ └── main.dart │ │ ├── 07_operador_bit_not/ │ │ │ └── main.dart │ │ ├── 08_operador_bit_shift_direita/ │ │ │ └── main.dart │ │ ├── 09_operador_bit_shift_esquerda/ │ │ │ └── main.dart │ │ ├── 10_operador_bit_shift_direita_unsigned/ │ │ │ └── main.dart │ │ ├── 11_operador_atribuicao/ │ │ │ └── main.dart │ │ ├── 12_operador_incremento_decremento_1/ │ │ │ └── main.dart │ │ ├── 13_operador_incremento_decremento_2/ │ │ │ └── main.dart │ │ ├── 14_operador_validacao_tipo_1/ │ │ │ └── main.dart │ │ ├── 15_operador_validacao_tipo_2/ │ │ │ └── main.dart │ │ ├── 16_operador_cascade/ │ │ │ └── main.dart │ │ ├── 17_operador_spread/ │ │ │ └── main.dart │ │ ├── 18_operador_ternario/ │ │ │ └── main.dart │ │ ├── 19_operador_acesso/ │ │ │ └── main.dart │ │ ├── 20_operador_ternario_nulo/ │ │ │ └── main.dart │ │ ├── 21_operador_atribuicao_nulo/ │ │ │ └── main.dart │ │ ├── 22_operador_acesso_nulo/ │ │ │ └── main.dart │ │ ├── 23_operador_cascade_nulo/ │ │ │ └── main.dart │ │ ├── 24_operador_acesso_itens_nulo/ │ │ │ └── main.dart │ │ ├── 25_operador_bang/ │ │ │ └── main.dart │ │ ├── 26_precedencia_operadores/ │ │ │ └── main.dart │ │ ├── 27_if_else/ │ │ │ └── main.dart │ │ ├── 28_switch_case/ │ │ │ └── main.dart │ │ ├── 29_switch_case_patterns/ │ │ │ └── main.dart │ │ ├── 30_switch_case_expressions/ │ │ │ └── main.dart │ │ ├── 31_if_case/ │ │ │ └── main.dart │ │ ├── 32_if_case_when/ │ │ │ └── main.dart │ │ ├── 33_while/ │ │ │ └── main.dart │ │ ├── 34_do_while/ │ │ │ └── main.dart │ │ ├── 35_for/ │ │ │ └── main.dart │ │ ├── 36_for_nomeado/ │ │ │ └── main.dart │ │ ├── 37_for_in/ │ │ │ └── main.dart │ │ └── 38_assert/ │ │ └── main.dart │ ├── 03_capitulo/ │ │ ├── 01_coercao/ │ │ │ └── main.dart │ │ ├── 02_dart_analyzer_1/ │ │ │ └── main.dart │ │ ├── 03_dart_analyzer_2/ │ │ │ └── main.dart │ │ ├── 04_inferencia_tipo/ │ │ │ └── main.dart │ │ ├── 05_inferencia_tipo_parametros/ │ │ │ └── main.dart │ │ ├── 06_dynamic/ │ │ │ └── main.dart │ │ ├── 07_numeros/ │ │ │ └── main.dart │ │ ├── 08_booleanos/ │ │ │ └── main.dart │ │ ├── 09_symbols/ │ │ │ └── main.dart │ │ ├── 10_null_safety/ │ │ │ └── main.dart │ │ ├── 11_nullable_types/ │ │ │ └── main.dart │ │ ├── 12_type_promotion/ │ │ │ └── main.dart │ │ ├── 13_type_promotion_nullable/ │ │ │ └── main.dart │ │ ├── 14_operador_bang/ │ │ │ └── main.dart │ │ ├── 15_strings/ │ │ │ └── main.dart │ │ ├── 16_surrogate_pairs/ │ │ │ └── main.dart │ │ ├── 17_criacao_strings/ │ │ │ └── main.dart │ │ ├── 18_interpolacao_strings/ │ │ │ └── main.dart │ │ ├── 19_otimizacao_strings/ │ │ │ └── main.dart │ │ ├── 20_strings_sob_demanda/ │ │ │ └── main.dart │ │ ├── 21_strings_geral/ │ │ │ └── main.dart │ │ ├── 22_variaveis_var/ │ │ │ └── main.dart │ │ ├── 23_variaveis_static/ │ │ │ └── main.dart │ │ ├── 24_variaveis_final_const/ │ │ │ └── main.dart │ │ └── 25_variaveis_late/ │ │ └── main.dart │ ├── 04_capitulo/ │ │ ├── 01_fatorial/ │ │ │ └── main.dart │ │ ├── 02_escopo/ │ │ │ └── main.dart │ │ ├── 03_tipo_function/ │ │ │ └── main.dart │ │ ├── 04_retornos/ │ │ │ └── main.dart │ │ ├── 05_never/ │ │ │ └── main.dart │ │ ├── 06_escopo_closure/ │ │ │ └── main.dart │ │ ├── 07_tear_off/ │ │ │ └── main.dart │ │ ├── 08_parametro_posicional_obrigatorio/ │ │ │ └── main.dart │ │ ├── 09_parametro_posicional_opcional/ │ │ │ └── main.dart │ │ ├── 10_parametro_nomeado_opcional/ │ │ │ └── main.dart │ │ ├── 11_parametro_nomeado_obrigatorio/ │ │ │ └── main.dart │ │ ├── 12_enums/ │ │ │ └── main.dart │ │ └── 13_typedef/ │ │ └── main.dart │ ├── 05_capitulo/ │ │ ├── 01_errors/ │ │ │ └── main.dart │ │ ├── 02_exceptions/ │ │ │ └── main.dart │ │ ├── 03_throw/ │ │ │ └── main.dart │ │ ├── 04_exception_customizada/ │ │ │ └── main.dart │ │ ├── 05_assert/ │ │ │ └── main.dart │ │ ├── 06_assert_x_error/ │ │ │ └── main.dart │ │ ├── 07_try_catch/ │ │ │ └── main.dart │ │ ├── 08_try_catch_on/ │ │ │ └── main.dart │ │ ├── 09_try_catch_exception/ │ │ │ └── main.dart │ │ └── 10_try_catch_finally/ │ │ └── main.dart │ ├── 06_capitulo/ │ │ └── 01_codigo_ansi/ │ │ └── main.dart │ ├── 07_capitulo/ │ │ ├── 01_analyzer/ │ │ │ └── main.dart │ │ ├── 02_analyzer_linter/ │ │ │ ├── analysis_options.yaml │ │ │ └── main.dart │ │ └── 03_comments/ │ │ └── main.dart │ ├── 08_capitulo/ │ │ ├── 01_objeto/ │ │ │ └── main.dart │ │ ├── 02_to_string/ │ │ │ └── main.dart │ │ ├── 03_equalidade/ │ │ │ └── main.dart │ │ ├── 04_sobrescrita_operadores/ │ │ │ └── main.dart │ │ ├── 05_construtor_padrao/ │ │ │ └── main.dart │ │ ├── 06_construtor_nomeado/ │ │ │ └── main.dart │ │ ├── 07_construtor_const/ │ │ │ └── main.dart │ │ ├── 08_construtor_factory/ │ │ │ └── main.dart │ │ ├── 09_encapsulamento/ │ │ │ └── main.dart │ │ ├── 10_heranca/ │ │ │ └── main.dart │ │ ├── 11_polimorfismo/ │ │ │ └── main.dart │ │ ├── 12_classes_abstratas/ │ │ │ └── main.dart │ │ ├── 13_interfaces/ │ │ │ └── main.dart │ │ ├── 14_mixins/ │ │ │ └── main.dart │ │ ├── 15_mixins_a_fundo/ │ │ │ └── main.dart │ │ ├── 16_extension_methods/ │ │ │ └── main.dart │ │ ├── 17_extension_methods_arquivo_diferente/ │ │ │ ├── main.dart │ │ │ └── strings_extension.dart │ │ ├── 18_classe_wrapper/ │ │ │ └── main.dart │ │ ├── 19_extension_types/ │ │ │ ├── main.dart │ │ │ └── pubspec.yaml │ │ ├── 20_modifiers_abstract/ │ │ │ └── main.dart │ │ ├── 21_modifiers_interface/ │ │ │ ├── arquivo.dart │ │ │ └── main.dart │ │ ├── 22_modifiers_base/ │ │ │ ├── arquivo.dart │ │ │ └── main.dart │ │ ├── 23_modifiers_final/ │ │ │ ├── arquivo.dart │ │ │ └── main.dart │ │ └── 24_modifiers_sealed/ │ │ └── main.dart │ ├── 09_capitulo/ │ │ ├── 01_generics_1/ │ │ │ └── main.dart │ │ ├── 02_generics_2/ │ │ │ └── main.dart │ │ ├── 03_generics_3/ │ │ │ └── main.dart │ │ ├── 04_generics_restringindo_tipo/ │ │ │ └── main.dart │ │ ├── 05_generics_metodos/ │ │ │ └── main.dart │ │ ├── 06_lists/ │ │ │ └── main.dart │ │ ├── 07_iterando_lists/ │ │ │ └── main.dart │ │ ├── 08_linked_hash_set/ │ │ │ └── main.dart │ │ ├── 09_hash_set/ │ │ │ └── main.dart │ │ ├── 10_splay_tree_set/ │ │ │ └── main.dart │ │ ├── 11_queue/ │ │ │ └── main.dart │ │ ├── 12_map/ │ │ │ └── main.dart │ │ ├── 13_records/ │ │ │ └── main.dart │ │ ├── 14_records_tipados/ │ │ │ └── main.dart │ │ ├── 15_records_equalidade/ │ │ │ └── main.dart │ │ ├── 16_records_retorno_funcao/ │ │ │ └── main.dart │ │ ├── 17_pattern_matching/ │ │ │ └── main.dart │ │ ├── 18_pattern_destructuring/ │ │ │ └── main.dart │ │ ├── 19_pattern_for_looping/ │ │ │ └── main.dart │ │ └── 20_pattern_collection_literal/ │ │ └── main.dart │ ├── 10_capitulo/ │ │ ├── 01_event_loop/ │ │ │ └── main.dart │ │ ├── 02_programa_sincrono_1/ │ │ │ └── main.dart │ │ ├── 03_programa_sincrono_2/ │ │ │ └── main.dart │ │ ├── 04_future/ │ │ │ └── main.dart │ │ ├── 05_future_encadeado/ │ │ │ └── main.dart │ │ ├── 06_erro_cadeia_assincrona/ │ │ │ └── main.dart │ │ ├── 07_erro_cadeia_try_catch/ │ │ │ └── main.dart │ │ ├── 08_erro_cadeia_catch_error/ │ │ │ └── main.dart │ │ ├── 09_erro_cadeia_on_error/ │ │ │ └── main.dart │ │ ├── 10_future_sync/ │ │ │ └── main.dart │ │ ├── 11_future_microtask/ │ │ │ └── main.dart │ │ ├── 12_future_value/ │ │ │ └── main.dart │ │ ├── 13_future_error/ │ │ │ └── main.dart │ │ ├── 14_future_wait/ │ │ │ └── main.dart │ │ ├── 15_future_any/ │ │ │ └── main.dart │ │ ├── 16_async_await/ │ │ │ └── main.dart │ │ ├── 17_async_await_fluxo/ │ │ │ └── main.dart │ │ ├── 18_async_await_x_future/ │ │ │ └── main.dart │ │ ├── 19_async_await_erro/ │ │ │ └── main.dart │ │ ├── 20_completer_future/ │ │ │ └── main.dart │ │ └── 21_completer_flexibilidade/ │ │ └── main.dart │ ├── 11_capitulo/ │ │ ├── 01_dart_args/ │ │ │ └── main.dart │ │ ├── 02_dart_http/ │ │ │ ├── main.dart │ │ │ └── pubspec.yaml │ │ └── 03_dart_convert/ │ │ └── main.dart │ ├── 12_capitulo/ │ │ ├── 01_stream_subscription/ │ │ │ └── main.dart │ │ ├── 02_stream_subscription_varios_dados/ │ │ │ └── main.dart │ │ ├── 03_stream_subscription_callbacks/ │ │ │ └── main.dart │ │ ├── 04_inscricao_unica_listener/ │ │ │ └── main.dart │ │ ├── 05_broadcast_listener/ │ │ │ └── main.dart │ │ ├── 06_stream_controller/ │ │ │ └── main.dart │ │ ├── 07_stream_controller_sink/ │ │ │ └── main.dart │ │ ├── 08_stream_consumer/ │ │ │ └── main.dart │ │ ├── 09_stream_consumer_2/ │ │ │ └── main.dart │ │ ├── 10_stream_sink_close/ │ │ │ └── main.dart │ │ ├── 11_stream_sink_x_stream_controller/ │ │ │ └── main.dart │ │ ├── 12_controller_callback_inscricao_unica/ │ │ │ └── main.dart │ │ ├── 13_controller_callback_broadcast/ │ │ │ └── main.dart │ │ ├── 14_stream_await/ │ │ │ └── main.dart │ │ ├── 15_stream_await_error/ │ │ │ └── main.dart │ │ ├── 16_stream_await_sem_encerramento/ │ │ │ └── main.dart │ │ ├── 17_stream_propriedades/ │ │ │ └── main.dart │ │ ├── 18_stream_metodos_busca/ │ │ │ └── main.dart │ │ ├── 19_stream_metodos_validacao/ │ │ │ └── main.dart │ │ ├── 20_as_broadcast_stream/ │ │ │ └── main.dart │ │ ├── 21_distinct/ │ │ │ └── main.dart │ │ ├── 22_map/ │ │ │ └── main.dart │ │ ├── 23_expand/ │ │ │ └── main.dart │ │ ├── 24_async_map/ │ │ │ └── main.dart │ │ ├── 25_async_expand/ │ │ │ └── main.dart │ │ ├── 26_skip/ │ │ │ └── main.dart │ │ ├── 27_skip_while/ │ │ │ └── main.dart │ │ ├── 28_take/ │ │ │ └── main.dart │ │ ├── 29_take_while/ │ │ │ └── main.dart │ │ ├── 30_where/ │ │ │ └── main.dart │ │ ├── 31_timeout/ │ │ │ └── main.dart │ │ ├── 32_to_list_to_set/ │ │ │ └── main.dart │ │ ├── 33_drain/ │ │ │ └── main.dart │ │ ├── 34_for_each/ │ │ │ └── main.dart │ │ ├── 35_fold/ │ │ │ └── main.dart │ │ ├── 36_reduce/ │ │ │ └── main.dart │ │ ├── 37_join/ │ │ │ └── main.dart │ │ ├── 38_cast/ │ │ │ └── main.dart │ │ ├── 39_handle_error/ │ │ │ └── main.dart │ │ └── 40_pipe/ │ │ └── main.dart │ ├── 13_capitulo/ │ │ ├── 01_interface_stream_transformer/ │ │ │ └── main.dart │ │ ├── 02_construtor_stream_transformer/ │ │ │ └── main.dart │ │ ├── 03_stream_transformer_base/ │ │ │ └── main.dart │ │ ├── 04_stream_transformer_from_handlers/ │ │ │ └── main.dart │ │ ├── 05_stream_transformer_from_bind/ │ │ │ └── main.dart │ │ ├── 06_problema_inscricao_unica/ │ │ │ └── main.dart │ │ ├── 07_sem_perda_eventos/ │ │ │ └── main.dart │ │ ├── 08_perda_eventos_broadcast/ │ │ │ └── main.dart │ │ ├── 09_broadcast_subscription_buffer/ │ │ │ └── main.dart │ │ ├── 10_geradores_sincronos_yield/ │ │ │ └── main.dart │ │ ├── 11_geradores_sincronos_yield_*/ │ │ │ └── main.dart │ │ ├── 12_geradores_assincronos_yield/ │ │ │ └── main.dart │ │ ├── 13_geradores_assincronos_yield_*/ │ │ │ └── main.dart │ │ └── 14_server/ │ │ └── main.dart │ ├── 14_capitulo/ │ │ ├── 01_isolate/ │ │ │ └── main.dart │ │ ├── 02_nova_isolate/ │ │ │ └── main.dart │ │ ├── 03_unidirecional_unica/ │ │ │ └── main.dart │ │ ├── 04_unidirecional_frequente/ │ │ │ └── main.dart │ │ ├── 05_bidirecional/ │ │ │ └── main.dart │ │ ├── 06_controle_isolate/ │ │ │ └── main.dart │ │ ├── 07_isolate_listeners/ │ │ │ └── main.dart │ │ ├── 08_spawn_uri/ │ │ │ ├── isolate.dart │ │ │ └── main.dart │ │ ├── 09_isolate_run/ │ │ │ └── main.dart │ │ ├── 10_zone_root/ │ │ │ └── main.dart │ │ ├── 11_nova_zone/ │ │ │ └── main.dart │ │ ├── 12_run_zoned/ │ │ │ └── main.dart │ │ ├── 13_hierarquia_zones/ │ │ │ └── main.dart │ │ ├── 14_zone_livre_erros/ │ │ │ └── main.dart │ │ ├── 15_propagacao_erros_zones/ │ │ │ └── main.dart │ │ ├── 16_propagacao_erros_zones_2/ │ │ │ └── main.dart │ │ ├── 17_propagacao_erros_zones_3/ │ │ │ └── main.dart │ │ ├── 18_valores_locais_zones/ │ │ │ └── main.dart │ │ └── 19_zone_specification/ │ │ └── main.dart │ ├── 15_capitulo/ │ │ ├── 01_criacao_diretorio/ │ │ │ └── main.dart │ │ ├── 02_remocao_diretorio/ │ │ │ └── main.dart │ │ ├── 03_criacao_arquivo/ │ │ │ ├── main.dart │ │ │ └── teste.txt │ │ ├── 04_escrita_arquivo/ │ │ │ ├── main.dart │ │ │ └── teste.txt │ │ ├── 05_escrita_arquivo_sob_demanda/ │ │ │ ├── main.dart │ │ │ └── teste.txt │ │ ├── 06_ler_arquivo/ │ │ │ ├── main.dart │ │ │ └── teste.txt │ │ └── 07_ler_arquivo_sob_demanda/ │ │ ├── main.dart │ │ └── teste.txt │ ├── e_com_voce/ │ │ ├── 02_imc/ │ │ │ └── main.dart │ │ ├── 03_benchmark_strings/ │ │ │ └── main.dart │ │ ├── 03_circunferencia/ │ │ │ └── main.dart │ │ ├── 03_regex_cpf/ │ │ │ └── main.dart │ │ ├── 04_funcoes_fatorial_recursao/ │ │ │ └── main.dart │ │ ├── 04_funcoes_fatorial_recursao_closure/ │ │ │ └── main.dart │ │ ├── 05_try_catch_rethrow/ │ │ │ └── main.dart │ │ ├── 08_construtor_inicializadores/ │ │ │ └── main.dart │ │ ├── 08_redirecionando_construtores/ │ │ │ └── main.dart │ │ ├── 08_singleton/ │ │ │ └── main.dart │ │ ├── 09_bidirectional_iterator/ │ │ │ └── main.dart │ │ ├── 09_programador_comparable/ │ │ │ └── main.dart │ │ ├── 09_teoria_conjuntos_set/ │ │ │ └── main.dart │ │ ├── 10_microtask_infinita/ │ │ │ └── main.dart │ │ ├── 13_gerador_divisores/ │ │ │ └── main.dart │ │ ├── 13_gerador_valores_impar/ │ │ │ └── main.dart │ │ ├── 13_stream_transformer_email/ │ │ │ └── main.dart │ │ ├── 13_stream_transformer_telefone/ │ │ │ └── main.dart │ │ ├── 14_isolate_bidirecional_stream_channel/ │ │ │ ├── main.dart │ │ │ └── pubspec.yaml │ │ ├── 15_climatempo_isolate_diretorios/ │ │ │ ├── .gitignore │ │ │ ├── CHANGELOG.md │ │ │ ├── README.md │ │ │ ├── analysis_options.yaml │ │ │ ├── bin/ │ │ │ │ └── climatempo.dart │ │ │ ├── lib/ │ │ │ │ ├── alerta_server.dart │ │ │ │ ├── api.dart │ │ │ │ ├── log.dart │ │ │ │ └── model/ │ │ │ │ ├── cidade.dart │ │ │ │ ├── clima_tempo.dart │ │ │ │ └── tempo.dart │ │ │ ├── log/ │ │ │ │ ├── cidades.txt │ │ │ │ ├── clima/ │ │ │ │ │ └── 4915.txt │ │ │ │ └── erro/ │ │ │ │ └── io/ │ │ │ │ └── io.txt │ │ │ └── pubspec.yaml │ │ ├── 15_climatempo_isolate_erros/ │ │ │ ├── .gitignore │ │ │ ├── CHANGELOG.md │ │ │ ├── README.md │ │ │ ├── analysis_options.yaml │ │ │ ├── bin/ │ │ │ │ └── climatempo.dart │ │ │ ├── lib/ │ │ │ │ ├── alerta_server.dart │ │ │ │ ├── api.dart │ │ │ │ ├── log.dart │ │ │ │ └── model/ │ │ │ │ ├── cidade.dart │ │ │ │ ├── clima_tempo.dart │ │ │ │ └── tempo.dart │ │ │ ├── log/ │ │ │ │ ├── 13032022.txt │ │ │ │ ├── 4915.txt │ │ │ │ ├── cidades.txt │ │ │ │ └── io.txt │ │ │ └── pubspec.yaml │ │ └── 15_climatempo_isolate_zone/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── bin/ │ │ │ └── climatempo.dart │ │ ├── lib/ │ │ │ ├── alerta_server.dart │ │ │ ├── api.dart │ │ │ ├── log.dart │ │ │ └── model/ │ │ │ ├── cidade.dart │ │ │ ├── clima_tempo.dart │ │ │ └── tempo.dart │ │ ├── log/ │ │ │ ├── 13032022.txt │ │ │ ├── 4915.txt │ │ │ ├── cidades.txt │ │ │ └── io.txt │ │ └── pubspec.yaml │ └── na_pratica/ │ ├── 03_strings_palindromo/ │ │ └── main.dart │ ├── 04_pedra_papel_tesoura_lagarto_spock/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── lib/ │ │ │ └── src/ │ │ │ ├── partida.dart │ │ │ └── resultado.dart │ │ ├── pubspec.yaml │ │ └── web/ │ │ ├── index.html │ │ ├── main.dart │ │ └── styles.css │ ├── 06_logger_library/ │ │ └── lib/ │ │ ├── log/ │ │ │ ├── log.dart │ │ │ └── printer.dart │ │ └── main.dart │ ├── 07_logger_package/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── doc/ │ │ │ └── api/ │ │ │ ├── __404error.html │ │ │ ├── categories.json │ │ │ ├── index.html │ │ │ ├── index.json │ │ │ ├── logger/ │ │ │ │ ├── Cores/ │ │ │ │ │ ├── Cores.html │ │ │ │ │ ├── ansi.html │ │ │ │ │ ├── toString.html │ │ │ │ │ └── values-constant.html │ │ │ │ ├── Cores-enum-sidebar.html │ │ │ │ ├── Cores.html │ │ │ │ ├── Logger/ │ │ │ │ │ ├── Logger.html │ │ │ │ │ ├── error.html │ │ │ │ │ ├── info.html │ │ │ │ │ ├── nivel.html │ │ │ │ │ ├── printer.html │ │ │ │ │ └── warning.html │ │ │ │ ├── Logger-class-sidebar.html │ │ │ │ ├── Logger-class.html │ │ │ │ ├── Nivel/ │ │ │ │ │ ├── Nivel.html │ │ │ │ │ ├── toString.html │ │ │ │ │ └── values-constant.html │ │ │ │ ├── Nivel-enum-sidebar.html │ │ │ │ ├── Nivel.html │ │ │ │ ├── Printer/ │ │ │ │ │ ├── Printer.html │ │ │ │ │ ├── fim.html │ │ │ │ │ ├── inicio.html │ │ │ │ │ └── log.html │ │ │ │ ├── Printer-class-sidebar.html │ │ │ │ ├── Printer-class.html │ │ │ │ ├── ansiCores-constant.html │ │ │ │ ├── logger-library-sidebar.html │ │ │ │ ├── logger-library.html │ │ │ │ └── resetarCor-constant.html │ │ │ ├── search.html │ │ │ └── static-assets/ │ │ │ ├── docs.dart.js │ │ │ ├── github.css │ │ │ ├── highlight.pack.js │ │ │ ├── readme.md │ │ │ ├── script.js │ │ │ └── styles.css │ │ ├── example/ │ │ │ └── main.dart │ │ ├── lib/ │ │ │ ├── logger.dart │ │ │ └── src/ │ │ │ ├── log.dart │ │ │ ├── printer.dart │ │ │ ├── printer_console.dart │ │ │ └── printer_io.dart │ │ └── pubspec.yaml │ ├── 11_climatempo/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── bin/ │ │ │ ├── climatempo.aot │ │ │ └── climatempo.dart │ │ ├── lib/ │ │ │ ├── api.dart │ │ │ └── model/ │ │ │ ├── cidade.dart │ │ │ ├── clima_tempo.dart │ │ │ └── tempo.dart │ │ └── pubspec.yaml │ ├── 13_climatempo_client/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── bin/ │ │ │ └── climatempo_client.dart │ │ └── pubspec.yaml │ ├── 13_climatempo_server/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── bin/ │ │ │ └── climatempo.dart │ │ ├── lib/ │ │ │ ├── alerta_server.dart │ │ │ ├── api.dart │ │ │ └── model/ │ │ │ ├── cidade.dart │ │ │ ├── clima_tempo.dart │ │ │ └── tempo.dart │ │ └── pubspec.yaml │ ├── 15_climatempo_arquivos/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── bin/ │ │ │ └── climatempo.dart │ │ ├── lib/ │ │ │ ├── alerta_server.dart │ │ │ ├── api.dart │ │ │ ├── log.dart │ │ │ └── model/ │ │ │ ├── cidade.dart │ │ │ ├── clima_tempo.dart │ │ │ └── tempo.dart │ │ ├── log/ │ │ │ ├── 4915.txt │ │ │ └── cidades.txt │ │ └── pubspec.yaml │ ├── 15_climatempo_arquivos_isolate/ │ │ ├── .gitignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── analysis_options.yaml │ │ ├── bin/ │ │ │ └── climatempo.dart │ │ ├── lib/ │ │ │ ├── alerta_server.dart │ │ │ ├── api.dart │ │ │ ├── log.dart │ │ │ └── model/ │ │ │ ├── cidade.dart │ │ │ ├── clima_tempo.dart │ │ │ └── tempo.dart │ │ ├── log/ │ │ │ ├── 4915.txt │ │ │ └── cidades.txt │ │ └── pubspec.yaml │ └── 15_climatempo_arquivos_isolate_zone/ │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── analysis_options.yaml │ ├── bin/ │ │ └── climatempo.dart │ ├── lib/ │ │ ├── alerta_server.dart │ │ ├── api.dart │ │ ├── log.dart │ │ └── model/ │ │ ├── cidade.dart │ │ ├── clima_tempo.dart │ │ └── tempo.dart │ ├── log/ │ │ ├── 13032022.txt │ │ ├── 4915.txt │ │ └── cidades.txt │ └── pubspec.yaml └── website/ ├── .gitignore ├── README.md ├── gatsby-config.js ├── package.json └── src/ ├── components/ │ ├── audience/ │ │ └── audience.js │ ├── author/ │ │ ├── author.js │ │ └── styles.js │ ├── book-info/ │ │ ├── book-info.js │ │ └── styles.js │ ├── github/ │ │ ├── github.js │ │ └── styles.js │ ├── layout/ │ │ ├── error.js │ │ ├── footer/ │ │ │ ├── footer.js │ │ │ └── styles.js │ │ ├── global.js │ │ ├── header/ │ │ │ ├── header.js │ │ │ └── styles.js │ │ ├── layout.js │ │ ├── normalize.css │ │ ├── styles.js │ │ └── theme.js │ └── table-of-contents/ │ ├── styles.js │ ├── table-of-contents-full.js │ └── table-of-contents.js └── pages/ ├── 404.js ├── index.js └── table-of-contents.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/deploy.yaml ================================================ name: DartGuide Deploy on: push: branches: - master paths: - 'website/**' jobs: build_deploy: runs-on: ubuntu-latest name: Deploy dartguide.dev defaults: run: working-directory: ./website steps: - name: Checkout uses: actions/checkout@v2 - name: Setup node uses: actions/setup-node@v2 with: node-version: '16' - name: Install run: npm ci - name: Build run: npm run build - name: Deploy uses: JamesIves/github-pages-deploy-action@4.1.4 with: branch: gh-pages folder: ./website/public ================================================ FILE: .gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ # Mac .DS_Store .AppleDouble .LSOverride # IntelliJ .idea .vscode ================================================ FILE: CNAME ================================================ dartguide.dev ================================================ FILE: README.md ================================================

- Informações do livro em [dartguide.dev](http://dartguide.dev) - [Sumário completo](https://dartguide.dev/table-of-contents/) - Página do livro na [Casa do Código](https://www.casadocodigo.com.br/products/livro-dart) Neste repositório você encontrará todos os códigos de exemplos do livro. Assim como todas as respostas de desafios propostos organizadas nas [issues](https://github.com/JHBitencourt/dart-book/issues). #### Para acesso rápido aos códigos: 1. [Sessão "Ná Prática"](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/na_pratica) 2. [Sessão "É com você"](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/e_com_voce) 3. [Capítulo 1](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/01_capitulo) 4. [Capítulo 2](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/02_capitulo) 5. [Capítulo 3](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/03_capitulo) 6. [Capítulo 4](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/04_capitulo) 7. [Capítulo 5](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/05_capitulo) 8. [Capítulo 6](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/06_capitulo) 9. [Capítulo 7](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/07_capitulo) 10. [Capítulo 8](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/08_capitulo) 11. [Capítulo 9](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/09_capitulo) 12. [Capítulo 10](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/10_capitulo) 13. [Capítulo 11](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/11_capitulo) 14. [Capítulo 12](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/12_capitulo) 15. [Capítulo 13](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/13_capitulo) 16. [Capítulo 14](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/14_capitulo) 17. [Capítulo 15](https://github.com/JHBitencourt/dart-book/tree/master/code/pt_Br/15_capitulo) ================================================ FILE: code/pt_Br/01_capitulo/01_primeiro_programa/main.dart ================================================ // Primeiro programa o/ main() { print('Hello World!'); } ================================================ FILE: code/pt_Br/01_capitulo/02_erro_main/main.dart ================================================ // Tente executar esse arquivo // Você deverá ver o erro: // Dart_LoadScriptFromKernel: The binary program does not contain 'main'. semMain() { print('Hello World!'); } ================================================ FILE: code/pt_Br/02_capitulo/01_operadores_aritmeticos/main.dart ================================================ void main() { print(40 + 2); // > 42 print('40' + '2'); // > 402 print(50 - 8); // > 42 print(-(-42)); // > 42 print(6 * 7); // > 42 print(11 / 2); // > 5.5 print(11 ~/ 2); // > 5 print(11 % 2); // > 1 } ================================================ FILE: code/pt_Br/02_capitulo/02_operadores_relacionais_equalidade/main.dart ================================================ void main() { print(42 == 42); // > true print(42 != 42); // > false print(42 > 42); // > false print(42 >= 42); // > true print(42 < 42); // > false print(42 <= 42); // > true } ================================================ FILE: code/pt_Br/02_capitulo/03_operadores_logicos/main.dart ================================================ void main() { print(42 == 42 && 42 <= 10); // > false print((42 == 42 && 42 <= 10) || 42 != 42); // > false print(!(42 == 42 && 42 <= 10) || 42 != 10); // > true } ================================================ FILE: code/pt_Br/02_capitulo/04_operador_bit_and/main.dart ================================================ void main() { var and = 42 & 27; print(42.toRadixString(2).padLeft(8, '0')); // > 00101010 print(27.toRadixString(2).padLeft(8, '0')); // > 00011011 print(and); // > 10 print(and.toRadixString(2).padLeft(8, '0')); // > 00001010 } ================================================ FILE: code/pt_Br/02_capitulo/05_operador_bit_or/main.dart ================================================ void main() { var or = 42 | 27; print(42.toRadixString(2).padLeft(8, '0')); // > 00101010 print(27.toRadixString(2).padLeft(8, '0')); // > 00011011 print(or); // > 59 print(or.toRadixString(2).padLeft(8, '0')); // > 00111011 } ================================================ FILE: code/pt_Br/02_capitulo/06_operador_bit_xor/main.dart ================================================ void main() { var xor = 42 ^ 27; print(42.toRadixString(2).padLeft(8, '0')); // > 00101010 print(27.toRadixString(2).padLeft(8, '0')); // > 00011011 print(xor); // > 49 print(xor.toRadixString(2).padLeft(8, '0')); // > 00110001 } ================================================ FILE: code/pt_Br/02_capitulo/07_operador_bit_not/main.dart ================================================ void main() { var not = ~42; print(42.toRadixString(2).padLeft(8, '0')); // > 00101010 print(not); // > -43 print(not.toRadixString(2)); // > -101011 } ================================================ FILE: code/pt_Br/02_capitulo/08_operador_bit_shift_direita/main.dart ================================================ void main() { var shift = 42 >> 1; print(42.toRadixString(2).padLeft(8, '0')); // > 00101010 print(shift); // > 21 print(shift.toRadixString(2).padLeft(8, '0')); // > 00010101 } ================================================ FILE: code/pt_Br/02_capitulo/09_operador_bit_shift_esquerda/main.dart ================================================ void main() { var shift = 42 << 2; print(42.toRadixString(2).padLeft(8, '0')); // > 00101010 print(shift); // > 168 print(shift.toRadixString(2).padLeft(8, '0')); // > 10101000 } ================================================ FILE: code/pt_Br/02_capitulo/10_operador_bit_shift_direita_unsigned/main.dart ================================================ void main() { var shift = -42 >>> 1; print((-42).toRadixString(2).padLeft(8, '0')); // > 0-101010 print(shift); // > 9223372036854775787 print(shift.toRadixString(2)); // > 111111111111111111111111111111111111111111111111111111111101011 } ================================================ FILE: code/pt_Br/02_capitulo/11_operador_atribuicao/main.dart ================================================ void main() { num a = 4; print(a); // > 4 a += 5; print(a); // > 9 a -= 4; print(a); // > 5 a %= 2; print(a); // > 1 a *= 11; print(a); // > 11 a /= 5; print(a); // > 2.2 a ~/= 2; print(a); // > 1 int b = 1; b <<= 4; print(b); // > 16 b |= 42; print(b); // > 58 b &= 60; print(b); // > 56 b ^= 42; print(b); // > 18 b >>= 1; print(b); // > 9 b >>>= 1; print(b); // > 4 } ================================================ FILE: code/pt_Br/02_capitulo/12_operador_incremento_decremento_1/main.dart ================================================ void main() { var a = 0; var b = 1 + ++a; // 1 + 1 print(a); // > 1 print(b); // > 2 var c = 0; var d = 1 + --c; // 1 + -1 print(c); // > -1 print(d); // > 0 } ================================================ FILE: code/pt_Br/02_capitulo/13_operador_incremento_decremento_2/main.dart ================================================ void main() { var a = 0; var b = 1 + a++; // 1 + 0 print(a); // > 1 print(b); // > 1 var c = 0; var d = 1 + c--; // 1 + 0 print(c); // > -1 print(d); // > 1 } ================================================ FILE: code/pt_Br/02_capitulo/14_operador_validacao_tipo_1/main.dart ================================================ void main() { num a = 42; // Ao descomentar a linha abaixo irá produzir um erro de cast de tipo inválido // a = 42.5; print((a as int).bitLength); // > 6 } ================================================ FILE: code/pt_Br/02_capitulo/15_operador_validacao_tipo_2/main.dart ================================================ void main() { num a = 42.5; // O operador is permite validar o tipo para evitar erros de cast if (a is int) { print((a as int).bitLength); } if (a is! int) { print('Não é inteiro'); // > Não é inteiro } } ================================================ FILE: code/pt_Br/02_capitulo/16_operador_cascade/main.dart ================================================ // Sem o operador cascade: // final frase = StringBuffer(); // frase.write('Operação '); // frase.write('em '); // frase.write('cascade.'); void main() { final frase = StringBuffer() ..write('Operação ') ..write('em ') ..write('cascade.'); print(frase); // > Operação em cascade. } ================================================ FILE: code/pt_Br/02_capitulo/17_operador_spread/main.dart ================================================ void main() { final vogais = ['a', 'e', 'i']; final consoantes = ['b', 'c', 'd']; final alfabeto = [...vogais, ...consoantes]; print(alfabeto); // > [a, e, i, b, c, d] } ================================================ FILE: code/pt_Br/02_capitulo/18_operador_ternario/main.dart ================================================ void main() { int numero = 42; print(numero % 2 == 0 ? 'par' : 'ímpar'); // > par } ================================================ FILE: code/pt_Br/02_capitulo/19_operador_acesso/main.dart ================================================ void main() { final map = { 'vogais': 'a,e,i,o,u', 'consoantes': 'b,c,d,...', }; final vogais = ['a', 'e', 'i', 'o', 'u']; print(vogais[0]); // > a print(vogais[4]); // > u print(map['vogais']); // > a,e,i,o,u } ================================================ FILE: code/pt_Br/02_capitulo/20_operador_ternario_nulo/main.dart ================================================ void main() { int? a = null; var resposta = a ?? 42; print(resposta); // > 42 } ================================================ FILE: code/pt_Br/02_capitulo/21_operador_atribuicao_nulo/main.dart ================================================ void main() { int? resposta = null; resposta ??= 42; print(resposta); // > 42 } ================================================ FILE: code/pt_Br/02_capitulo/22_operador_acesso_nulo/main.dart ================================================ void main() { int? resposta = null; print(resposta?.bitLength); // > null } ================================================ FILE: code/pt_Br/02_capitulo/23_operador_cascade_nulo/main.dart ================================================ void main() { StringBuffer? frase = null; frase?..write('Operação ') ..write('em ') ..write('cascade.'); print(frase); // > null } ================================================ FILE: code/pt_Br/02_capitulo/24_operador_acesso_itens_nulo/main.dart ================================================ void main() { List? vogais; print(vogais?[1]); // > null } ================================================ FILE: code/pt_Br/02_capitulo/25_operador_bang/main.dart ================================================ void main() { List? vogais; print(vogais![1]); } ================================================ FILE: code/pt_Br/02_capitulo/26_precedencia_operadores/main.dart ================================================ void main() { print(1+6/2*3-6); // > 4 } ================================================ FILE: code/pt_Br/02_capitulo/27_if_else/main.dart ================================================ void main() { var resposta = 20; if (resposta != 42) { print('A resposta está errada'); // > A resposta está errada } else { print('A resposta está correta'); } var imc = 25.1; if (imc < 18.5) { print('Abaixo do peso'); } else if (imc >= 18.5 && imc < 24.9) { print('Peso normal ideal'); } else if (imc >= 24.9 && imc < 29.9) { print('Sobrepeso'); // > Sobrepeso } else { print('Obesidade'); } } ================================================ FILE: code/pt_Br/02_capitulo/28_switch_case/main.dart ================================================ void main() { var estacao = 'Verão'; switch (estacao) { case 'Outono': case 'Verão': print('Tá calor'); // > Tá calor break; case 'Inverno': print('Tá frio'); break; default: print('Tá bom..'); } var dia = 'Domingo'; switch (dia) { segunda: case 'Segunda': print('Aff, já é segunda..'); break; case 'Terça': print('Usando um feitiço do tempo..'); continue sexta; case 'Quarta': case 'Quinta': throw 'Meio da semana'; sexta: case 'Sexta': print('Sexxxxtou!'); break; case 'Sábado': return; case 'Domingo': print('Aproveitando enquanto dá..'); continue segunda; default: print('Esse dia não existe..'); } } ================================================ FILE: code/pt_Br/02_capitulo/29_switch_case_patterns/main.dart ================================================ void main() { var nota = 8; switch (nota) { case 0: print('Sério?'); case 1 || 2 || 3: print('Estudar mais, urgente!'); case >= 4 && <= 6: print('Tá quase lá..'); case > 6 && <= 8: print('Tá na média!'); // > Tá na média case > 8 when nota <= 10: print('GOAT!'); default: print('Nota inválida'); } } ================================================ FILE: code/pt_Br/02_capitulo/30_switch_case_expressions/main.dart ================================================ void main() { var nota = 9; var mensagem = switch (nota) { 0 => 'Sério?', 1 || 2 || 3 => 'Estudar mais, urgente!', >= 4 && <= 6 => 'Tá quase lá..', > 6 && <= 8 => 'Tá na média!', > 8 when nota <= 10 => 'GOAT!', _ => 'Nota inválida' }; print(mensagem); // > GOAT! } ================================================ FILE: code/pt_Br/02_capitulo/31_if_case/main.dart ================================================ void main() { var coordenadas = [10, 42]; if (coordenadas case [int x, int y]) { print('Coordenadas: (x:$x,y:$y)'); // > Coordenadas: (x:10,y:42) } else { print('Coordenadas inválidas'); } } ================================================ FILE: code/pt_Br/02_capitulo/32_if_case_when/main.dart ================================================ void main() { var coordenadas = [10, -42]; if (coordenadas case [int x, int y] when x >= 0 && y >= 0) { print('Coordenadas: (x:$x,y:$y)'); } } ================================================ FILE: code/pt_Br/02_capitulo/33_while/main.dart ================================================ void main() { var index = 0; while(index < 3) { print(index); index++; } } ================================================ FILE: code/pt_Br/02_capitulo/34_do_while/main.dart ================================================ void main() { do { print('Executado'); // > Executado } while (false); } ================================================ FILE: code/pt_Br/02_capitulo/35_for/main.dart ================================================ void main() { for(var i = 0; i <= 10; i = i+2) { print(i); // > 0 2 4 6 8 10 } // for com continue e break for (var i = 0; i <= 10; i++) { if (i % 2 == 0) continue; if (i > 7) break; print(i); // > 1 3 5 7 } } ================================================ FILE: code/pt_Br/02_capitulo/36_for_nomeado/main.dart ================================================ void main() { forDeFora: for (var i = 0; i <= 2; i++) { print('forDeFora $i'); for (var j = 0; j <= 2; j++) { if (j >= 1 || i == 1) continue forDeFora; print('forDeDentro $j'); } } } ================================================ FILE: code/pt_Br/02_capitulo/37_for_in/main.dart ================================================ void main() { final vogais = ['a', 'e', 'i', 'o', 'u']; for(final vogal in vogais) { if(vogal == 'e') continue; if(vogal == 'u') break; print(vogal); // > a i o } } ================================================ FILE: code/pt_Br/02_capitulo/38_assert/main.dart ================================================ void main() { final vogais = ['a', 'e', 'i', 'o', 'u', 'j']; assert(vogais.length == 5, 'Só deveriam existir 5 vogais!'); } ================================================ FILE: code/pt_Br/03_capitulo/01_coercao/main.dart ================================================ // Coerção implícita em javascript: // var a = "Resposta: " + 42; // console.log(a); // > "Resposta: 42" void main() { var a = 'Resposta:' + 42.toString(); print(a); // > Resposta: 42 } ================================================ FILE: code/pt_Br/03_capitulo/02_dart_analyzer_1/main.dart ================================================ bool erro = true; void main() { // O analisador de dart apontará um erro no código abaixo: erro = 'false'; } ================================================ FILE: code/pt_Br/03_capitulo/03_dart_analyzer_2/main.dart ================================================ bool erro = true; void main() { erro as String; } ================================================ FILE: code/pt_Br/03_capitulo/04_inferencia_tipo/main.dart ================================================ void main() { int continentes = 6; print(continentes.runtimeType); // > int var planetas = 8; print(planetas.runtimeType); // > int } ================================================ FILE: code/pt_Br/03_capitulo/05_inferencia_tipo_parametros/main.dart ================================================ void main() { var somaInt = soma(1, 2); var somaString = soma('1', '2'); print('$somaInt: ${somaInt.runtimeType}'); // > 3: int print('$somaString: ${somaString.runtimeType}'); // > 12: String } soma(a, b) => a + b; ================================================ FILE: code/pt_Br/03_capitulo/06_dynamic/main.dart ================================================ void main() { dynamic objeto = 42; // Uma exceção será lançada em tempo de execução: objeto.metodoQueNemExiste(); // > NoSuchMethodError } ================================================ FILE: code/pt_Br/03_capitulo/07_numeros/main.dart ================================================ void main() { int a = 5; double b = 8.2; double c = 1; num x = (a * b) + c; print('Resultado: $x'); // > Resultado: 42 print('a: ${a.runtimeType}'); // > a: int print('b: ${b.runtimeType}'); // > b: double print('x: ${x.runtimeType}'); // > x: double } ================================================ FILE: code/pt_Br/03_capitulo/08_booleanos/main.dart ================================================ void main() { bool verdadeiro = true; bool falso = false; bool primeiroMaior = 'Esse é muito maior'.length > 'Esse é grande'.length; print('Primeiro é maior? ${primeiroMaior && (verdadeiro || falso)}'); // > Primeiro é maior? true print('verdadeiro: ${verdadeiro.runtimeType}'); // > verdadeiro: bool } ================================================ FILE: code/pt_Br/03_capitulo/09_symbols/main.dart ================================================ void main() { var mod = #modificador; print(#modificador); // > Symbol("modificador") print(mod); // > Symbol("modificador") print('mod: ${mod.runtimeType}'); // > mod: Symbol } ================================================ FILE: code/pt_Br/03_capitulo/10_null_safety/main.dart ================================================ // A null-safety em Dart não permite que o código abaixo compile void main() { int valor; print(valor.isEven); } ================================================ FILE: code/pt_Br/03_capitulo/11_nullable_types/main.dart ================================================ void main() { printNome('Douglas', 'Adams'); printNome('Douglas', null); } void printNome(String nome, String? sobrenome) { print('$nome $sobrenome'); } void valorImpar(int numero) { print(numero.isEven); } // O compilador não permite acessar as propriedades dos tipos em tipos nullable: // void valorImparNullable(int? numero) { // print(numero.isEven); // } ================================================ FILE: code/pt_Br/03_capitulo/12_type_promotion/main.dart ================================================ void main() { print(textoGrande(42)); print(textoGrande('Este tem que ser um texto muito grande com mais de 120 ' 'caracteres para que a função retorne verdadeiro. Parabéns pra você' 'que está lendo esse livro. :) S2 ')); } bool textoGrande(Object objeto) { if (objeto is String) { return objeto.length > 120; } else { return false; } } ================================================ FILE: code/pt_Br/03_capitulo/13_type_promotion_nullable/main.dart ================================================ void main() { print(letrasNome('Julio', 'Bitencourt')); print(letrasNome('Julio', null)); print(letrasNome2('Julio', 'Bitencourt')); print(letrasNome2('Julio', null)); } List letrasNome(String nome, String? sobrenome) { var letras = nome.split(''); if (sobrenome != null) { letras.addAll(sobrenome.split('')); } return letras; } List letrasNome2(String nome, String? sobrenome) { var letras = nome.split(''); if (sobrenome == null) return letras; letras.addAll(sobrenome.split('')); return letras; } ================================================ FILE: code/pt_Br/03_capitulo/14_operador_bang/main.dart ================================================ String? nome; void main() { nome = 'Julio'; // Erro de compilação, afinal nome é uma variável global: // if (nome != null) print(nome.length); // Acessando com operador de cast if (nome != null) print((nome as String).length); // Acessando com o bang if (nome != null) print(nome!.length); } ================================================ FILE: code/pt_Br/03_capitulo/15_strings/main.dart ================================================ void main() { //String('Erro'); // Sem construtor default var a = '42'; // Forma literal print(a); // > 42 print(a.codeUnits); // > [52, 50] print(String.fromCharCode(52)+String.fromCharCode(50)); // > 42 } ================================================ FILE: code/pt_Br/03_capitulo/16_surrogate_pairs/main.dart ================================================ void main() { var spock = '\u{1f596}'; print(spock); // Imprime o símbolo print(spock.length); // > 2 print(spock.codeUnits); // > [55357, 56726] print(spock.runes); // > (128406) print(String.fromCharCode(55357) + String.fromCharCode(56726)); // Imprime o símbolo } ================================================ FILE: code/pt_Br/03_capitulo/17_criacao_strings/main.dart ================================================ void main() { print("Aspas duplas com 'aspas simples'"); // > Aspas duplas com 'aspas simples' print('Aspas simples com "aspas duplas"'); // > Aspas simples com "aspas duplas" print('''Mais de uma linha'''); print(r'Unicode = \u{1f596}'); // > Unicode = \u{1f596} } ================================================ FILE: code/pt_Br/03_capitulo/18_interpolacao_strings/main.dart ================================================ var resposta = 42; void main() { print('''A resposta para a vida o universo e tudo mais é: $resposta'''); print('42 * 42 = ${resposta * resposta}'); // > 42 * 42 = 1764 print('Variável: = \$resposta'); // > Variável: = $resposta print(r'Variável: = $resposta'); // > Variável: = $resposta } ================================================ FILE: code/pt_Br/03_capitulo/19_otimizacao_strings/main.dart ================================================ var elonUm = 'Elon Musk'; var elonDois = 'Elon Musk'; var jeff = 'Jeff Bezos'; void main() { print(elonUm == jeff); // > false print(identical(elonUm, jeff)); // > false print(elonUm == elonDois); // > true print(identical(elonUm, elonDois)); // > true } ================================================ FILE: code/pt_Br/03_capitulo/20_strings_sob_demanda/main.dart ================================================ void main() { print('Dart' + ' é ' + 'incrível!'); // > Dart é incrível! print('Dart' ' é ' 'incrível!'); // > Dart é incrível! var buffer = StringBuffer(); buffer.write('Dart é'); buffer.write(' incrível!'); buffer.writeAll(['E esse', ' livro ', 'também!']); print(buffer); // > Dart é incrível!E esse livro também! } ================================================ FILE: code/pt_Br/03_capitulo/21_strings_geral/main.dart ================================================ String e = 'Douglas Adams'; void main() { print('Vazio: ${e.isEmpty}'); // > Vazio: false print("Adicionando à esquerda '>': ${e.padLeft(15, '>')}"); // > Adicionando à esquerda '>': >>Douglas Adams print("Adicionando à direita '<': ${e.padRight(16, '<')}"); // > Adicionando à direita '<': Douglas Adams<<< print("Mudar todos 'a' para 'e': ${e.replaceAll('a', 'e')}"); // > Mudar todos 'a' para 'e': Dougles Adems print("Mudar primeiro 'a' para 'e': ${e.replaceFirst('a', 'e')}"); // > Mudar primeiro 'a' para 'e': Dougles Adams print("Dividindo: ${e.split(" ")[0]}"); // > Dividindo: Douglas print("Dividindo: ${e.split(" ")[1]}"); // > Dividindo: Adams print('''Matching: Contém 'gl': ${e.contains("gl")} Termina com 'Adams': ${e.endsWith("Adams")} Começa com 'D': ${e.startsWith("d".toUpperCase())}'''); } ================================================ FILE: code/pt_Br/03_capitulo/22_variaveis_var/main.dart ================================================ var pi = 3.14; double y = pi; var x = 'Arquimedes'; String? matematico; void main() { //x = y; // Erro, x já possui o tipo String. matematico = x; print(matematico); // > Arquimedes } ================================================ FILE: code/pt_Br/03_capitulo/23_variaveis_static/main.dart ================================================ //static var global = 'String global'; // Erro class Livro { static int instancias = 0; Livro() { instancias++; } String autor = 'Douglas Adams'; } void main() { print('Instâncias: ${Livro.instancias}'); Livro(); Livro(); print('Autor: ${Livro().autor}'); print('Instâncias: ${Livro.instancias}'); } ================================================ FILE: code/pt_Br/03_capitulo/24_variaveis_final_const/main.dart ================================================ // const double pi = 3.14; const pi = 3.14; // final double circunferencia = 2 * pi; final circunferencia = 2 * pi; /// O código abaixo produz um erro de compilação, afinal variáveis const /// são definidas em tempo de compilação, enquanto final são em tempo de execução // final pi = 3.14; // const circunferencia = 2 * pi; /// Lista com valores constantes: var valoresConstantes = const [1, 2, 3]; final listFinal = [1, 2, 3]; const listConst = [1, 2, 3]; void main() { /// Objetos constantes são canonicalizados: var a = getValorCanonicalizado(); var b = getValorCanonicalizado(); print('A e B são os mesmos objetos? ${identical(a, b)}'); // > 'A e B são os mesmos objetos? true' /// Objetos constantes são imutáveis, não é permitido adicionar valores em uma /// lista constante: listFinal[0] = 4; // é permitido // listConst[0] = 4; // erro de execução } List getValorCanonicalizado() => const [4, 5, 6]; ================================================ FILE: code/pt_Br/03_capitulo/25_variaveis_late/main.dart ================================================ class Pizza { // int pedacos; late int pedacos; void media() { pedacos = 8; } void grande() { pedacos = 16; } String servir() => '$pedacos pedaços servidos!'; } void main() { final pizza = Pizza(); pizza.media(); print(pizza.servir()); // > 8 pedaços servidos! } ================================================ FILE: code/pt_Br/04_capitulo/01_fatorial/main.dart ================================================ void main() { print(fatorial(4)); print(fatorial(0)); print(fatorial(42)); } int fatorial(int numero) { if (numero == 0) return 1; var resultado = 1; for (var i = 1; i <= numero; i++) { resultado *= i; } return resultado; } ================================================ FILE: code/pt_Br/04_capitulo/02_escopo/main.dart ================================================ var escopoGlobal = 'global'; void main() { var escopoMain = 'escopoMain'; a() { var escopoDentro = 'escopoA'; print('a: $escopoGlobal - $escopoMain - $escopoDentro'); b() { var escopoDentro = 'escopoB'; print('b: $escopoGlobal - $escopoMain - $escopoDentro'); } b(); } c() { a(); } c(); print('main: $escopoGlobal - $escopoMain'); } ================================================ FILE: code/pt_Br/04_capitulo/03_tipo_function/main.dart ================================================ var ola = (String nome) { print('Olá $nome'); }; Function hello = (String nome) => print('Olá $nome'); void main() { ola('Julio'); // > Olá Julio ola('${ola.runtimeType}'); // > Olá (String) => Null hello('Julio'); // > Olá Julio hello('${hello.runtimeType}'); // > Olá (String) => void } ================================================ FILE: code/pt_Br/04_capitulo/04_retornos/main.dart ================================================ void main() { print(retornoNulo()); print(retornoNuloDois()); print(retornoString()); /// Um retorno void não pode ser utilizado: // var objeto = retornoDynamic(); // print(objeto); } retornoNulo() {} retornoNuloDois() { return; } retornoString() { return 'String'; } void semRetorno() {} void retornoVazio() { return; } void retornoDynamic() { dynamic dinamico = 'dynamic'; return dinamico; } void retornoFuncao() { return print('retornoFuncao'); } ================================================ FILE: code/pt_Br/04_capitulo/05_never/main.dart ================================================ import 'dart:io'; void main() { print('Antes de encerrar'); exit(0); print('Após encerrar'); } ================================================ FILE: code/pt_Br/04_capitulo/06_escopo_closure/main.dart ================================================ Function criaClosure() { var resposta = 42; return () { resposta++; print(resposta); }; } void main() { var somaImprime = criaClosure(); somaImprime(); somaImprime(); } ================================================ FILE: code/pt_Br/04_capitulo/07_tear_off/main.dart ================================================ void main() { final vogais = ['a', 'e', 'i', 'o', 'u']; vogais.forEach((e) { print(e); }); /// Usando tear-off: vogais.forEach(print); } ================================================ FILE: code/pt_Br/04_capitulo/08_parametro_posicional_obrigatorio/main.dart ================================================ /// Parâmetros: posicional e obrigatório void temperaturaEm(String cidade, int? ano, int? mes, int dia) { print('$cidade $dia/$mes/$ano'); } void main() { temperaturaEm('Floripa', null, 12, 1); // > Floripa 1/12/null } ================================================ FILE: code/pt_Br/04_capitulo/09_parametro_posicional_opcional/main.dart ================================================ void temperaturaEm(String cidade, [int? ano = 2020, int? mes, int dia = 01]) { print('$cidade $dia/$mes/$ano'); } void main() { temperaturaEm('Floripa'); // > Floripa 1/null/2020 temperaturaEm('Floripa', null); // > Floripa 1/null/null temperaturaEm('Floripa', 2021, 1); // > Floripa 1/1/2021 temperaturaEm('Floripa', 2021, 1, 2); // > Floripa 2/1/2021 } ================================================ FILE: code/pt_Br/04_capitulo/10_parametro_nomeado_opcional/main.dart ================================================ void temperaturaEm(String cidade, {int? ano = 2020, int dia = 01, int? mes}) { print('$cidade $dia/$mes/$ano'); } void main() { temperaturaEm('Floripa', ano: 2021); // > Floripa 1/null/2021 temperaturaEm('Floripa', mes: 1); // > Floripa 1/1/2020 temperaturaEm('Floripa', mes: 1, dia: 2, ano: null); // > Floripa 2/1/null } ================================================ FILE: code/pt_Br/04_capitulo/11_parametro_nomeado_obrigatorio/main.dart ================================================ void temperaturaEm(String cidade, {required int dia, required int? mes, int? ano = 2020}) { print('$cidade $dia/$mes/$ano'); } void main() { temperaturaEm('Floripa', dia: 1, mes: null); // > Floripa 1/null/2020 temperaturaEm('Floripa', mes: 1, dia: 12); // > Floripa 12/12/2020 temperaturaEm('Floripa', mes: 1, dia: 2, ano: 2021); // > Floripa 2/1/2021 } ================================================ FILE: code/pt_Br/04_capitulo/12_enums/main.dart ================================================ const double G = 6.67300e-11; enum Planeta { mercurio(3.303e+23, 2.4397e6, aneis: false), venus(4.869e+24, 6.0518e6, aneis: false), terra(5.976e+24, 6.37814e6, aneis: false), marte(6.421e+23, 3.3972e6, aneis: false), jupiter(1.9e+27, 7.1492e7, aneis: true), saturno(5.688e+26, 6.0268e7, aneis: true), urano(8.686e+25, 2.5559e7, aneis: true), netuno(1.024e+26, 2.4746e7, aneis: true); const Planeta(this.massa, this.raio, {required this.aneis}); factory Planeta.planetaComVida() => Planeta.terra; final bool aneis; final double massa; final double raio; bool get ehAzul => this == Planeta.terra; double gravidadeSuperficial() => G * massa / (raio * raio); double pesoSuperficie(double massaCorpo) => massaCorpo * gravidadeSuperficial(); } void main() { print(Planeta.planetaComVida()); print(Planeta.marte.ehAzul); final peso = 80 / Planeta.terra.gravidadeSuperficial(); for (final p in Planeta.values) { print('Meu peso em ${p.name}: ${p.pesoSuperficie(peso)}kg'); } } ================================================ FILE: code/pt_Br/04_capitulo/13_typedef/main.dart ================================================ typedef Operacao = Object Function(double a, double b); double somar(double a, double b) { return a + b; } String subtrair(double a, double b) { return (a - b).toString(); } Object calcular(double a, double b, Operacao operacao) { return operacao(a, b); } void main() { print(calcular(22, 20, somar)); // > 42.0 print(calcular(22, 20, subtrair)); // > 2.0 } ================================================ FILE: code/pt_Br/05_capitulo/01_errors/main.dart ================================================ void main() { var lista = [1, 2]; for (var i = 0; i <= 2; i++) { print('Atribuindo valor $i no índice $i'); lista[i] = i; } } ================================================ FILE: code/pt_Br/05_capitulo/02_exceptions/main.dart ================================================ import 'dart:io'; void main() { // Um formato inválido informado resultará em FormatException final dataUsuario = stdin.readLineSync(); DateTime.parse(dataUsuario!); } ================================================ FILE: code/pt_Br/05_capitulo/03_throw/main.dart ================================================ void voar() { throw Exception('Você não tem asas!'); } void ligarCarro() => throw 'Sem gasolina!'; void main() { // voar(); ligarCarro(); } ================================================ FILE: code/pt_Br/05_capitulo/04_exception_customizada/main.dart ================================================ class SemGasolinaException implements Exception { final String mensagem; const SemGasolinaException(this.mensagem); String toString() => 'SemGasolinaException: $mensagem'; } void ligarCarro() => throw SemGasolinaException('Carro sem gasolina..'); void main() { ligarCarro(); } ================================================ FILE: code/pt_Br/05_capitulo/05_assert/main.dart ================================================ void main() { int? id; assert(id != null, 'O id não pode ser nulo.'); } ================================================ FILE: code/pt_Br/05_capitulo/06_assert_x_error/main.dart ================================================ import 'dart:math'; void main() { // calcularCircunferencia(-2); calcularCircunferenciaError(-2); Motorista('', 14); MotoristaError('', 14); } double calcularCircunferencia(double raio) { assert(raio >= 0, 'O raio deve ser positivo.'); return 2 * pi * raio; } double calcularCircunferenciaError(double raio) { if (raio < 0) throw AssertionError('O raio deve ser positivo.'); return 2 * pi * raio; } class Motorista { final String nome; final int idade; const Motorista(this.nome, this.idade) : assert(nome != '', 'O nome não pode ser vazio'), assert(idade >= 18, 'O motorista deve ser maior de idade'); } class MotoristaError { final String nome; final int idade; MotoristaError(this.nome, this.idade) { if (nome.isEmpty) throw AssertionError('O nome não pode ser vazio'); if (idade < 18) throw AssertionError('O motorista deve ser maior de idade'); } } ================================================ FILE: code/pt_Br/05_capitulo/07_try_catch/main.dart ================================================ void comer() => throw Exception('Acabou a comida..'); void main() { try { comer(); print('Não vai chegar aqui..'); } catch (e, s) { print('Exceção capturada: $e'); print('Stacktrace: $s'); } } ================================================ FILE: code/pt_Br/05_capitulo/08_try_catch_on/main.dart ================================================ void main() { try { DateTime.parse('01/01/2022'); // DateTime.parse('2022-01-22'); } on FormatException catch (e) { print('O formato deve ser ano-mes-dia.. $e'); } catch (e, s) { print('Exceção capturada: $e'); print('Stacktrace: $s'); } } ================================================ FILE: code/pt_Br/05_capitulo/09_try_catch_exception/main.dart ================================================ void comer() => throw 'Acabou a comida..'; void main() { try { comer(); } on FormatException catch (e) { print('O formato de data deve ser ano-mes-dia.. $e'); } on Exception catch (e, s) { print('Exceção capturada: $e'); print('Stacktrace: $s'); } } ================================================ FILE: code/pt_Br/05_capitulo/10_try_catch_finally/main.dart ================================================ import 'dart:async'; void main() { try { abrirConexao(); buscarDados(); // fecharConexao(); } catch (e, s) { print('Exceção capturada: $e'); print('Stacktrace: $s'); } finally { fecharConexao(); } } void abrirConexao() => print('Conexão aberta..'); void buscarDados() => throw TimeoutException('Rede lenta..'); void fecharConexao() => print('Conexão fechada..'); ================================================ FILE: code/pt_Br/06_capitulo/01_codigo_ansi/main.dart ================================================ import 'dart:io'; void error(Object object) { stdout.writeln('\x1b[31m[ERROR] $object\x1b[m'); } void main() { /// O texto será impresso em vermelho no terminal: error('Um texto de erro!'); } ================================================ FILE: code/pt_Br/07_capitulo/01_analyzer/main.dart ================================================ /// Execute o analyzer neste arquivo e deverá ser apontado 1 erro e nenhuma /// melhoria. Afinal, ele não possui um linter configurado. class pessoa { pessoa({this.nome = null}); final String? nome void DizerOi() { print('Olá! Me chamo $nome'); } } main() { final julio = new pessoa(nome: 'Julio'); julio.DizerOi(); } ================================================ FILE: code/pt_Br/07_capitulo/02_analyzer_linter/analysis_options.yaml ================================================ linter: rules: - camel_case_types - non_constant_identifier_names - avoid_init_to_null - always_declare_return_types - unnecessary_new ================================================ FILE: code/pt_Br/07_capitulo/02_analyzer_linter/main.dart ================================================ /// Execute o analyzer neste arquivo e deverá ser apontado 5 melhorias. /// Afinal, ele possui o linter configurado em analysis_options.dart class pessoa { pessoa({this.nome = null}); final String? nome; void DizerOi() { print('Olá! Me chamo $nome'); } } main() { final julio = new pessoa(nome: 'Julio'); julio.DizerOi(); } ================================================ FILE: code/pt_Br/07_capitulo/03_comments/main.dart ================================================ // TODO finalizar este método void imprimirValor() { print(42); // Imprime sempre 42. } /* // TODO finalizar este método void imprimirValor() { print(42); // Imprime sempre 42. Todo esse trecho de código é tratado como comentário.. } */ /// Três barras formam um comentário de documentação do código, que é exportado /// com o comando `dart doc`. /// /// Código ANSI para resetar a cor do terminal const resetarCor = '\x1b[m'; ================================================ FILE: code/pt_Br/08_capitulo/01_objeto/main.dart ================================================ class Programador { String? nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} } void main() { final programador = Programador()..nome = 'Julio Bitencourt'; programador.tarefas.add('Terminar livro de Dart'); print(programador.runtimeType); print(programador.toString()); } ================================================ FILE: code/pt_Br/08_capitulo/02_to_string/main.dart ================================================ class Programador { String? nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} @override String toString() => '$nome'; } void main() { final p1 = Programador()..nome = 'Julio'; print(p1); // > Julio } ================================================ FILE: code/pt_Br/08_capitulo/03_equalidade/main.dart ================================================ class Programador { String? nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} @override String toString() => '$nome'; } void main() { final p1 = Programador()..nome = 'Julio'; final p2 = Programador()..nome = 'Julio'; print(p1 == p2); // > false print('hash p1: ${p1.hashCode} - hash p2: ${p2.hashCode}'); // > hash p1: 624437211 - hash p2: 125619715 } ================================================ FILE: code/pt_Br/08_capitulo/04_sobrescrita_operadores/main.dart ================================================ class Programador { String? nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} @override String toString() => '$nome'; @override bool operator ==(Object other) => other is Programador && nome == other.nome; @override int get hashCode => nome.hashCode; } void main() { final p1 = Programador()..nome = 'Julio'; final p2 = Programador()..nome = 'Julio'; print(p1 == p2); // > true print(identical(p1, p2)); // > false print('hash p1: ${p1.hashCode} - hash p2: ${p2.hashCode}'); // > hash p1: 514913100 - hash p2: 514913100 } ================================================ FILE: code/pt_Br/08_capitulo/05_construtor_padrao/main.dart ================================================ class Programador { // Programador(String nome, List linguagens) { // this.nome = nome; // this.linguagens = linguagens; // } /// Syntax sugar para a forma acima: // Programador(this.nome, this.linguagens); /// Construtor padrão com parâmetros opcionais e valores default: Programador({this.nome = 'Fulano', this.linguagens = const []}); String? nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} @override String toString() => '$nome'; @override bool operator ==(Object other) => other is Programador && nome == other.nome; @override int get hashCode => nome.hashCode; } void main() { final p1 = Programador(); final p2 = Programador(nome: 'Julio', linguagens: ['Dart']); print(p1); print(p2); } ================================================ FILE: code/pt_Br/08_capitulo/06_construtor_nomeado/main.dart ================================================ class Programador { Programador({ this.nome = 'Fulano', this.linguagens = const [], }); Programador.dart(this.nome) { linguagens = ['Dart']; } String? nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} @override String toString() => '$nome'; @override bool operator ==(Object other) => other is Programador && nome == other.nome; @override int get hashCode => nome.hashCode; } void main() { final p1 = Programador(nome: 'James Gosling', linguagens: ['Java']); final p2 = Programador.dart('Julio'); print('$p1 ama ${p1.linguagens}'); print('$p2 ama ${p2.linguagens}'); } ================================================ FILE: code/pt_Br/08_capitulo/07_construtor_const/main.dart ================================================ class LinguagemProgramacao { const LinguagemProgramacao(this.nome); final String nome; } void main() { final primeira = const LinguagemProgramacao('Dart'); final segunda = const LinguagemProgramacao('Dart'); final terceira = LinguagemProgramacao('Dart'); print(identical(primeira, segunda)); // > true print(identical(primeira, terceira)); // > false } ================================================ FILE: code/pt_Br/08_capitulo/08_construtor_factory/main.dart ================================================ class Programador { Programador._internal(this.nome); factory Programador(String nome) { if (_cache.containsKey(nome)) { return _cache[nome]!; } final novo = Programador._internal(nome); _cache[nome] = novo; return novo; } static final Map _cache = {}; String nome; static imprimirCache() { print(_cache); } } void main() { final p1 = Programador('Julio Bitencourt'); final p2 = Programador('Julio Bitencourt'); print(identical(p1, p2)); // > true Programador.imprimirCache(); // > {Julio Bitencourt: Instance of 'Programador'} } ================================================ FILE: code/pt_Br/08_capitulo/09_encapsulamento/main.dart ================================================ // class Programador { // DateTime? nascimento; // } // // void main() { // final p1 = Programador(); // p1.nascimento = DateTime(1995, 12, 1, 2, 30); // print(p1.nascimento); // > 1995-12-01 02:30:00.000 // } class Programador { DateTime? _nascimento; set nascimento(DateTime? value) { if (value != null) _nascimento = DateTime(value.year, value.month, value.day); } DateTime? get nascimento => _nascimento; int get idade { if (_nascimento == null) return 0; return DateTime.now().difference(_nascimento!).inDays ~/ 365; } } void main() { final p1 = Programador(); p1.nascimento = DateTime(1995, 12, 1, 2, 30); print(p1.nascimento); // > 1995-12-01 00:00:00.000 print(p1.idade); // > 26 } ================================================ FILE: code/pt_Br/08_capitulo/10_heranca/main.dart ================================================ class Funcionario { String? nome; double salario = 0.0; List tarefas = []; void trabalhar() { print('${this.runtimeType} trabalhando..'); } } class Programador extends Funcionario { List? linguagens; } class Gerente extends Funcionario { double? bonus; } void main() { final programador = Programador() ..nome = 'Bill Gates' ..linguagens = ['.Net']; final gerente = Gerente() ..nome = 'Jeff Bezos' ..bonus = 500; programador.trabalhar(); // > Programador trabalhando.. print('Programador é Funcionario? ${programador is Funcionario}'); // > Programador é Funcionario? true gerente.trabalhar(); // > Gerente trabalhando.. print('Gerente é Funcionario? ${gerente is Funcionario}'); // > Gerente é Funcionario? true } ================================================ FILE: code/pt_Br/08_capitulo/11_polimorfismo/main.dart ================================================ class Funcionario { void trabalhar() { print('Funcionario trabalhando..'); } } class Programador extends Funcionario { @override void trabalhar() { print('Programador trabalhando..'); } } class Gerente extends Funcionario { @override void trabalhar() { print('Gerente trabalhando..'); super.trabalhar(); } } class Startup { Startup(this.funcionarios); List funcionarios; void novoProjeto() { funcionarios.forEach((f) => f.trabalhar()); } } void main() { Funcionario funcionario = Funcionario(); Funcionario programador = Programador(); Funcionario gerente = Gerente(); final startup = Startup([funcionario, programador, gerente]); startup.novoProjeto(); } ================================================ FILE: code/pt_Br/08_capitulo/12_classes_abstratas/main.dart ================================================ abstract class Funcionario { String? nome; double salario = 0.0; List tarefas = []; void trabalhar(); } class Programador extends Funcionario { List? linguagens; @override void trabalhar() { print('Programador trabalhando..'); } } class Gerente extends Funcionario { double? bonus; @override void trabalhar() { print('Gerente trabalhando..'); } } class Robo extends Funcionario { double? bateria; @override void trabalhar() { print('0100010110010110'); } } class Assalariado { Assalariado(this.salario); double? salario; void receber() {} } class Startup { Startup(this.funcionarios); List funcionarios; void novoProjeto() { funcionarios.forEach((f) => f.trabalhar()); } } void main() { Funcionario programador = Programador(); Funcionario gerente = Gerente(); final startup = Startup([programador, gerente]); startup.novoProjeto(); } ================================================ FILE: code/pt_Br/08_capitulo/13_interfaces/main.dart ================================================ abstract class Assalariado { Assalariado(this.salario); double salario; void receber(); } abstract class Funcionario { String? nome; List tarefas = []; void trabalhar(); } class Programador extends Funcionario implements Assalariado { Programador({this.salario = 1000}); List? linguagens; @override double salario; @override void trabalhar() { print('Programador trabalhando..'); } @override void receber() { print('Programador recebendo $salario'); } } class Gerente extends Funcionario implements Assalariado { Gerente({this.salario = 5000}); double? bonus; @override double salario; @override void trabalhar() { print('Gerente trabalhando..'); } @override void receber() { print('Gerente recebendo $salario'); } } class Robo extends Funcionario { double? bateria; @override void trabalhar() { print('0100010110010110'); } } class Startup { List funcionarios; List assalariados; Startup(this.funcionarios, this.assalariados); void pagarFuncionarios() { assalariados.forEach((a) => a.receber()); } } void main() { Funcionario programador = Programador(); Funcionario gerente = Gerente(); Funcionario robo = Robo(); final startup = Startup( [programador, gerente, robo], [(programador as Assalariado), (gerente as Assalariado)], ); startup.pagarFuncionarios(); } ================================================ FILE: code/pt_Br/08_capitulo/14_mixins/main.dart ================================================ mixin Assalariado on Funcionario { double salario = 0; void receber() { print('Pegando o salário do ${super.nome}, valor de $salario'); } } abstract class Funcionario { String? nome; List tarefas = []; void trabalhar(); } class Programador extends Funcionario with Assalariado { List? linguagens; void trabalhar() { print('Programador trabalhando..'); } } class Gerente extends Funcionario with Assalariado { double? bonus; @override void trabalhar() { print('Gerente trabalhando..'); } } class Robo extends Funcionario { double? bateria; @override void trabalhar() { print('0100010110010110'); } } class Startup { List funcionarios; List assalariados; Startup(this.funcionarios, this.assalariados); void pagarFuncionarios() { assalariados.forEach((a) => a.receber()); } } void main() { Funcionario programador = Programador() ..nome = 'Bill Gates' ..salario = 34000; Funcionario gerente = Gerente() ..nome = 'Douglas Adams' ..salario = 42000; Funcionario robo = Robo(); final startup = Startup( [programador, gerente, robo], [(programador as Assalariado), (gerente as Assalariado)], ); startup.pagarFuncionarios(); } ================================================ FILE: code/pt_Br/08_capitulo/15_mixins_a_fundo/main.dart ================================================ abstract class A { String ola(); } mixin B { String ola() => 'Olá B'; } mixin C { String ola() => 'Olá C'; } class D extends A with B, C { void dizerOla() { print(ola()); } } void main() { D().dizerOla(); } ================================================ FILE: code/pt_Br/08_capitulo/16_extension_methods/main.dart ================================================ String capitalizar(String texto) { if (texto.isEmpty) return texto; return '${texto[0].toUpperCase()}${texto.substring(1)}'; } extension on String { String capitalizar() => this.isEmpty ? this : '${this[0].toUpperCase()}${this.substring(1)}'; String operator &(String other) => '$this - $other'; String get primeiraPalavra => split(' ').first; String get ultimaPalavra => split(' ').last; } void main() { print(capitalizar('dart')); // > Dart print('julio'.capitalizar()); // > Julio print('julio bitencourt'.primeiraPalavra); // > julio print('julio bitencourt'.ultimaPalavra.capitalizar()); // > Bitencourt print('julio' & 'bitencourt'); // > julio - bitencourt } ================================================ FILE: code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/main.dart ================================================ import 'strings_extension.dart'; String capitalizar(String texto) { if (texto.isEmpty) return texto; return '${texto[0].toUpperCase()}${texto.substring(1)}'; } void main() { print(capitalizar('dart')); // > Dart print('julio'.capitalizar()); // > Julio print('julio bitencourt'.primeiraPalavra); // > julio print('julio bitencourt'.ultimaPalavra.capitalizar()); // > Bitencourt print('julio' & 'bitencourt'); // > julio - bitencourt } ================================================ FILE: code/pt_Br/08_capitulo/17_extension_methods_arquivo_diferente/strings_extension.dart ================================================ extension StringExtension on String { String capitalizar() => this.isEmpty ? this : '${this[0].toUpperCase()}${this.substring(1)}'; String operator &(String other) => '$this - $other'; String get primeiraPalavra => split(' ').first; String get ultimaPalavra => split(' ').last; } ================================================ FILE: code/pt_Br/08_capitulo/18_classe_wrapper/main.dart ================================================ class Id { Id(this._valor); final int _valor; bool get isValid => _valor > 0; Id get next => Id(_valor +1); @override String toString() => '$_valor'; } class Funcionario { Funcionario(this.id); final Id id; } void main() { final id = Funcionario(Id(1)).id; // print(id + 1); // Erro de compilação print(id.next.next); // > 3 print(id.runtimeType); // > Id } ================================================ FILE: code/pt_Br/08_capitulo/19_extension_types/main.dart ================================================ import 'package:meta/meta.dart'; extension type Id(int id) { Id get next => Id(id + 1); bool get isValid => id > 0; } class Funcionario { Funcionario(this.id); final Id id; } void main() { final id = Funcionario(Id(1)).id; // print(id + 1); // Erro de compilação print(id.next.next); // > 3 print(id.runtimeType); // > int int idInt = id as int; print(idInt + idInt); // > 2 if(id case int n) print('${n+n}'); // > 2 } extension type MinhaString(String _) implements String { @redeclare int operator [](int index) => codeUnitAt(index); } ================================================ FILE: code/pt_Br/08_capitulo/19_extension_types/pubspec.yaml ================================================ name: extensions description: A starting point for Dart libraries or applications. version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: sdk: ^3.5.1 # Add regular dependencies here. dependencies: meta: ^1.16.0 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 ================================================ FILE: code/pt_Br/08_capitulo/20_modifiers_abstract/main.dart ================================================ abstract class A {} class B extends A {} class C implements A {} // Modificador abstract desabilita o instanciamento final a = A(); // Erro ================================================ FILE: code/pt_Br/08_capitulo/21_modifiers_interface/arquivo.dart ================================================ interface class A {} ================================================ FILE: code/pt_Br/08_capitulo/21_modifiers_interface/main.dart ================================================ import 'arquivo.dart'; // Modificador interface desabilita a herança: class B extends A {} // Erro class C implements A {} final a = A(); ================================================ FILE: code/pt_Br/08_capitulo/22_modifiers_base/arquivo.dart ================================================ base class A {} ================================================ FILE: code/pt_Br/08_capitulo/22_modifiers_base/main.dart ================================================ import 'arquivo.dart'; base class B extends A {} final a = A(); // Modificador base desabilita o implements base class C implements A {} // Erro ================================================ FILE: code/pt_Br/08_capitulo/23_modifiers_final/arquivo.dart ================================================ final class A {} ================================================ FILE: code/pt_Br/08_capitulo/23_modifiers_final/main.dart ================================================ import 'arquivo.dart'; //Modificador final desabilita subclasses e subtipos: class B extends A {} // Erro class C implements A {} // Erro final a = A(); ================================================ FILE: code/pt_Br/08_capitulo/24_modifiers_sealed/main.dart ================================================ sealed class Poligono {} class Pentagono extends Poligono {} sealed class Triangulo extends Poligono {} class Isoceles extends Triangulo {} class Equilatero extends Triangulo {} sealed class Quadrilatero extends Poligono {} class Retangulo extends Quadrilatero {} int ladosPoligono(Poligono p) => switch (p) { Isoceles() || Equilatero() => 3, Retangulo() => 4, Pentagono() => 5, }; ================================================ FILE: code/pt_Br/09_capitulo/01_generics_1/main.dart ================================================ abstract class VeiculoAutomotor {} class Carro extends VeiculoAutomotor {} class Caminhao extends VeiculoAutomotor {} class FilaPedagio { List _veiculos = []; void entrarNaFila(veiculo) { _veiculos.add(veiculo); } } void main() { final fila = FilaPedagio(); fila.entrarNaFila(Carro()); /// Caminhão não deveria entrar na mesma fila que um carro fila.entrarNaFila(Caminhao()); } ================================================ FILE: code/pt_Br/09_capitulo/02_generics_2/main.dart ================================================ abstract class VeiculoAutomotor {} class Carro extends VeiculoAutomotor {} class Caminhao extends VeiculoAutomotor {} class FilaPedagioCarro { List _veiculos = []; void entrarNaFila(Carro veiculo) { _veiculos.add(veiculo); } } class FilaPedagioCaminhao { List _veiculos = []; void entrarNaFila(Caminhao veiculo) { _veiculos.add(veiculo); } } /// Criar duas filas separadas é uma alternativa, mas não é /// um bom design de código, pois estamos duplicando código. void main() { var filaCarro = FilaPedagioCarro(); filaCarro.entrarNaFila(Carro()); var filaCaminhao = FilaPedagioCaminhao(); filaCaminhao.entrarNaFila(Caminhao()); } ================================================ FILE: code/pt_Br/09_capitulo/03_generics_3/main.dart ================================================ abstract class VeiculoAutomotor {} class Carro extends VeiculoAutomotor {} class Caminhao extends VeiculoAutomotor {} class FilaPedagio { List _veiculos = []; void entrarNaFila(T veiculo) { _veiculos.add(veiculo); } } /// Tipando FilaPedagio com generics ganhamos a liberdade de criar /// filas especialistas em um determinado tipo. /// Como filas só de carros ou caminhões. void main() { final filaCarro = FilaPedagio(); filaCarro.entrarNaFila(Carro()); // filaCarro.entrarNaFila(Caminhao()); // Erro final filaCaminhao = FilaPedagio(); filaCaminhao.entrarNaFila(Caminhao()); } ================================================ FILE: code/pt_Br/09_capitulo/04_generics_restringindo_tipo/main.dart ================================================ abstract class VeiculoAutomotor {} class Carro extends VeiculoAutomotor {} class Caminhao extends VeiculoAutomotor {} class FilaPedagio { List _veiculos = []; void entrarNaFila(T veiculo) { _veiculos.add(veiculo); } } class Bicicleta {} /// Restringindo os tipos aceitos em FilaPedagio para apenas subclasses de /// VeiculoAutomotor, estamos impedindo que veículos como Bicicleta entrem na /// fila de pedágio. void main() { final filaCarro = FilaPedagio(); final filaCaminhao = FilaPedagio(); // final filaBicicleta = FilaPedagio(); //Erro } ================================================ FILE: code/pt_Br/09_capitulo/05_generics_metodos/main.dart ================================================ T ultimo(List itens) { T ultimo = itens.last; return ultimo; } void main() { print(ultimo([10, 20, 30])); // > 30 print(ultimo([1.4, 2, 42.0])); // > 42.0 } ================================================ FILE: code/pt_Br/09_capitulo/06_lists/main.dart ================================================ void main() { final vogais = []; vogais.add('a'); vogais.add(42); print(vogais); print(vogais.runtimeType); print('---------------'); final risadas = []; risadas.addAll(['kkk', 'haha', 'rsrs']); print(risadas); print(risadas.runtimeType); print('---------------'); final alfabeto = ['a', 'b']; alfabeto.add('c'); print(alfabeto); print(alfabeto.runtimeType); print('---------------'); /// Lista de tamanho fixo: final vogaisFixo = List.filled(5, 'e'); vogaisFixo[0] = 'a'; vogaisFixo[4] = 'u'; // vogaisFixo.add('a'); // Erro print(vogaisFixo); } ================================================ FILE: code/pt_Br/09_capitulo/07_iterando_lists/main.dart ================================================ void main() { final risadas = ['kkk', 'haha', 'rsrs']; /// Primeira forma de varrer uma lista: /// Para quando o índice é importante. for (var i = 0; i < risadas.length; i++) print(risadas[i]); print('---------------'); /// Segunda forma de varrer uma lista: /// Para quando o índice não importa. for (final r in risadas) print(r); print('---------------'); /// Terceira forma de varrer uma lista: /// Uma forma funcional risadas.forEach((r) => print(r)); print('---------------'); /// Quarta forma de varrer uma lista: /// Uma forma hardcore. Utilizando a interface Iterator para controle /// do ponteiro que varre a lista. Iterator i = risadas.iterator; while (i.moveNext()) print(i.current); } ================================================ FILE: code/pt_Br/09_capitulo/08_linked_hash_set/main.dart ================================================ import 'dart:collection'; /// Todo Set por padrão implementa um LinkedHashSet, /// que mantém a ordem dos elementos inseridos. void main() { final megasena = Set(); megasena.addAll([44, 35, 4, 11, 29, 4, 35, 57]); print(megasena); // > {44, 35, 4, 11, 29, 57} final vogais = {'a', 'e', 'i', 'a', 'o', 'u'}; print(vogais); // > {a, e, i, o, u} print(vogais.elementAt(1)); // e // print(vogais[0]); // Erro final consoantes = LinkedHashSet(); consoantes.addAll(['b', 'c', 'd']); print(consoantes); // > {b, c, d} } ================================================ FILE: code/pt_Br/09_capitulo/09_hash_set/main.dart ================================================ import 'dart:collection'; /// A implementação do HashSet não mantém a ordem de inserção. /// A ordem dos elementos é de acordo com a implementação do hashCode. void main() { final megasena = HashSet(); megasena.addAll([44, 35, 4, 11, null, 29, 4, null, 35, 57]); print(megasena); // > {35, 4, 57, 11, null, 44, 29} } ================================================ FILE: code/pt_Br/09_capitulo/10_splay_tree_set/main.dart ================================================ import 'dart:collection'; /// A implementação do SplayTreeSet também não mantém a ordem de inserção. /// A ordem dos elementos é de acordo com a implementação do compareTo de [Comparable]. void main() { final vogais = ['e', 'i', 'a', 'o', 'u']; vogais.sort(); print(vogais); // > [a, e, i, o, u] final megasena = SplayTreeSet(); megasena.addAll(['44', '35', '4', '11', '4']); print(megasena); // > {11, 35, 4, 44} final megasena2 = SplayTreeSet((a, b) { return int.parse(a).compareTo(int.parse(b)); }); megasena2.addAll(['44', '35', '4', '11', '4']); print(megasena2); // > {4, 11, 35, 44} } ================================================ FILE: code/pt_Br/09_capitulo/11_queue/main.dart ================================================ import 'dart:collection'; void main() { final megasena = Queue(); megasena.addAll([11, 35]); print(megasena); megasena.addFirst(4); // > {4, 11, 35} print(megasena); megasena.removeLast(); // > {4, 11} print(megasena); megasena.addLast(44); // > {4, 11, 44} print(megasena); megasena.removeFirst(); // > {11, 44} print(megasena); } ================================================ FILE: code/pt_Br/09_capitulo/12_map/main.dart ================================================ import 'dart:collection'; void main() { final clientes = Map(); clientes[1] = 'Rafael'; clientes[1] = 'Juliana'; clientes.putIfAbsent(2, () => 'João'); clientes.putIfAbsent(2, () => 'Maria'); print(clientes); // {1: Juliana, 2: João} final usuario = { 'Nome': 'Julio', 'Linguagens': ['dart', 'java'] }; usuario.putIfAbsent('Github', () => 'JHBitencourt'); print(usuario.runtimeType); // > _InternalLinkedHashMap print(usuario['Nome']!.runtimeType); // > String print(usuario['Sobrenome']?.runtimeType); // > null Iterable chaves = clientes.keys; Iterable valores = clientes.values; Iterable elementos = clientes.entries; print(elementos.first.key); // > 1 print(elementos.first.value); // > Juliana final linkedHashMap = LinkedHashMap.fromIterables(['3', '1', '2'], [1, 2, 3]); print(linkedHashMap); // > {3: 1, 1: 2, 2: 3} final hashMap = HashMap.fromIterables(['3', '1', '2'], [1, 2, 3]); print(hashMap); // > {1: 2, 3: 1, 2: 3} final splayTreeMap = SplayTreeMap.fromIterables( ['3', '1', '2'], [1, 2, 3], (a, b) { return int.parse(a).compareTo(int.parse(b)); }); print(splayTreeMap); // > {1: 2, 2: 3, 3: 1} } ================================================ FILE: code/pt_Br/09_capitulo/13_records/main.dart ================================================ void main() { var turing = ('Alan Turing', 41, 1954); var hawking = ('Stephen Hawking',); var lovelace = ('Ada Lovelace', idade: 36, falecimento: 1852); print(hawking.runtimeType); // > (String) print(turing.runtimeType); // > (String, int, int) print(turing.$1); // > Alan Turing print(turing.$3); // > 1954 print(lovelace.idade); // > 36 } ================================================ FILE: code/pt_Br/09_capitulo/14_records_tipados/main.dart ================================================ void main() { (String, int, int) turing = ('Alan Turing', 41, 1954); (String nome,) hawking = ('Stephen Hawking',); (String nome, {int idade, int falecimento}) lovelace; lovelace = ('Ada Lovelace', idade: 36, falecimento: 1852); print(lovelace.runtimeType); // > (String, {int falecimento, int idade}) } ================================================ FILE: code/pt_Br/09_capitulo/15_records_equalidade/main.dart ================================================ void main() { (int x, int y, int z) coordenada1 = (10, 3, 4); (int r, int g, int b) cor1 = (10, 3, 4); print(coordenada1 == cor1); // > true ({int x, int y, int z}) coordenada2 = (x: 10, y: 3, z: 4); ({int r, int g, int b}) cor2 = (r: 10, g: 3, b: 4); print(coordenada2 == cor2); // > false } ================================================ FILE: code/pt_Br/09_capitulo/16_records_retorno_funcao/main.dart ================================================ void main() { var comprovante = comprovanteTransacao(); print(comprovante.$1); // > chavepix@gmail.com var (chaveDestino, _, hora: data) = comprovanteTransacao(); print(chaveDestino); // > chavepix@gmail.com print(data); // > 2024-11-19 21:24:02.623 } typedef Comprovante = (String chave, double valor, {DateTime hora}); Comprovante comprovanteTransacao() { return ('chavepix@gmail.com', 29.9, hora: DateTime.now()); } // (String, double, DateTime) comprovanteTransacao() { // return ('chavepix@gmail.com', 29.9, DateTime.now()); // } ================================================ FILE: code/pt_Br/09_capitulo/17_pattern_matching/main.dart ================================================ void main() { var list = [1, 2, 3, 4]; var [primeiro, ..., ultimo] = list; print('$primeiro - $ultimo'); // > 1 - 4 var (a, b) = ('esquerda', 'direita'); (a, b) = (b, a); print('$a - $b'); // > direita - esquerda var coordenada = (4, 2); if(coordenada case (var x, var y) when x > 0 && y > 0) { print('Coordenadas positivas $x-$y!'); // > Coordenadas positivas 4-2! } switch (coordenada) { case (var x, var y) when x > 0 && y > 0: print('1° quadrante do plano cartesiano!'); // > 1° quadrante do plano cartesiano! case (var x, var y) when x < 0 && y < 0: print('3° quadrante do plano cartesiano!'); } var cliente = Cliente(id: 42, apelido: 'Bob', idade: 28); var Cliente(:id, apelido: nickname) = cliente; print('Cliente $id é o $nickname'); // > Cliente 42 é o Bob } class Cliente { final int id; final String apelido; final int? idade; Cliente({required this.id, required this.apelido, this.idade}); } ================================================ FILE: code/pt_Br/09_capitulo/18_pattern_destructuring/main.dart ================================================ void main() { final resposta = 42; switch (resposta) { case 42: print('sentido da vida, do universo e tudo mais!'); } final pares = [2, 4, 6, 8]; switch (pares) { case [2, _, 4, 5]: print('Segundo valor não importa'); case [2 || 4, ...]: print('Começa com 2 ou 4!'); // > Começa com 2 ou 4! default: print('Sem matching.'); } } ================================================ FILE: code/pt_Br/09_capitulo/19_pattern_for_looping/main.dart ================================================ void main() { var clientes = {1:'Bob', 2:'Ana'}; for(var MapEntry(:key, value: nome) in clientes.entries) { print('Cliente $key chama-se $nome'); } } ================================================ FILE: code/pt_Br/09_capitulo/20_pattern_collection_literal/main.dart ================================================ void main() { var numeros = [-3, 4, 6, 1, -9, -4]; var positivos = [for (var n in numeros) if (n case > 0) n]; print(positivos); // > [4, 6, 1] } ================================================ FILE: code/pt_Br/10_capitulo/01_event_loop/main.dart ================================================ import 'dart:async'; void main () { print('Início main()'); Timer.run(() => print('Event loop 1')); // #E1 Timer.run(() { // #E2 scheduleMicrotask(() => print('Microtask 3')); // #M3 print('Event loop 2'); }); scheduleMicrotask(() => print('Microtask 1')); // #M1 Timer.run(() => print('Event loop 3')); // #E3 scheduleMicrotask(() => print('Microtask 2')); // #M2 print('Fim main()'); } ================================================ FILE: code/pt_Br/10_capitulo/02_programa_sincrono_1/main.dart ================================================ void main () { print('Início main()'); int index = 0; while(index < 10) { print('Índice $index'); index++; } print('Fim main()'); } ================================================ FILE: code/pt_Br/10_capitulo/03_programa_sincrono_2/main.dart ================================================ import 'dart:io'; void main() { print(temperaturaAtual()); print(previsaoAmanha()); } String temperaturaAtual() { sleep(const Duration(seconds: 3)); return 'Está fazendo 28º'; } String previsaoAmanha() { sleep(const Duration(seconds: 4)); return 'Amanhã fará 35º'; } ================================================ FILE: code/pt_Br/10_capitulo/04_future/main.dart ================================================ void main() { final future = Future(() { return 84 ~/ 2; }).then((int valor) { print('Future em estado Completo, valor: $valor'); }).catchError((Object erro, StackTrace stacktrace) { print('Future em estado Completo, erro: $erro'); print(stacktrace); }).whenComplete(() { print('Future finalizado'); }); print('$future em estado Incompleto'); } ================================================ FILE: code/pt_Br/10_capitulo/05_future_encadeado/main.dart ================================================ void main() { buscarId().then((int id) { print('Id encontrado, buscando nome..'); return buscarNome(id); }).then(print); print('Buscando..'); } Future buscarId() { return Future.delayed(const Duration(seconds: 3), () => 1); } Future buscarNome(int id) { return Future.delayed(const Duration(seconds: 3), () => 'JHBitencourt'); } ================================================ FILE: code/pt_Br/10_capitulo/06_erro_cadeia_assincrona/main.dart ================================================ Future um() => Future.value('Primeiro'); Future dois() => Future.error('Erro no dois()'); Future tres() => Future.value('Terceiro'); void main() { um().then((_) => dois()) .then((_) => tres()) .then((String valor) { print('O valor é $valor'); }); } ================================================ FILE: code/pt_Br/10_capitulo/07_erro_cadeia_try_catch/main.dart ================================================ Future um() => Future.value('Primeiro'); Future dois() => Future.error('Erro no dois()'); Future tres() => Future.value('Terceiro'); void main() { try { um().then((_) => dois()) .then((_) => tres()) .then((String valor) { print('O valor é $valor'); }); } catch(e) { print('Capturado: $e'); } } ================================================ FILE: code/pt_Br/10_capitulo/08_erro_cadeia_catch_error/main.dart ================================================ Future um() => Future.value('Primeiro'); Future dois() => Future.error('Erro no dois()'); Future tres() => Future.value('Terceiro'); void main() { um().then((_) => dois()) .then((_) => tres()) .catchError((dynamic e) { print('Capturado: $e'); return '42'; }).then((String valor) { print('O valor é $valor'); }); } ================================================ FILE: code/pt_Br/10_capitulo/09_erro_cadeia_on_error/main.dart ================================================ Future um() => Future.value('Primeiro'); Future dois() => Future.error('Erro no dois()'); Future tres() => Future.value('Terceiro'); void main() { um().then((_) => dois()) .then((_) => tres(), onError: (dynamic e) { print('Capturado onError: $e'); return '42 :)'; }).catchError((dynamic e) { print('Capturado: $e'); return '42'; }).then((String valor) { print('O valor é $valor'); }); } ================================================ FILE: code/pt_Br/10_capitulo/10_future_sync/main.dart ================================================ void main() { Future.sync(() { print('Função Future.sync() executada'); return 'Future síncrono?'; }).then(print); print('Future.sync():'); } ================================================ FILE: code/pt_Br/10_capitulo/11_future_microtask/main.dart ================================================ void main() { Future(() => 'Future normal').then(print); Future.microtask(() => 'Future microtask').then(print); } ================================================ FILE: code/pt_Br/10_capitulo/12_future_value/main.dart ================================================ void main() { Future(() => Future.value(42)).then(print); print('Future.value():'); } ================================================ FILE: code/pt_Br/10_capitulo/13_future_error/main.dart ================================================ void main() { Future.error('ERRO') .then( (valor) => print('Não executa, o Future completa com erro..'), onError: (e) => print('Erro capturado no onError $e'), ) .catchError((e) => print('Future.error() => $e')); } ================================================ FILE: code/pt_Br/10_capitulo/14_future_wait/main.dart ================================================ void main() { Future.wait(listaFuture()).then(print, onError: print); print('Aguardando..'); } List> listaFuture() => [2, 1, 3] .map((s) => Future.delayed(Duration(seconds: s), () => 'Tempo: $s')) .toList(); Future comErro() => Future.error('Erro ao buscar dados.'); ================================================ FILE: code/pt_Br/10_capitulo/15_future_any/main.dart ================================================ void main() { Future.any(listaFuture()).then(print, onError: print); print('Aguardando..'); } List> listaFuture() => [2, 1, 5] .map((s) => Future.delayed(Duration(seconds: s), () => 'Tempo: $s')) .toList(); Future comErro() => Future.error('Erro ao buscardados.'); ================================================ FILE: code/pt_Br/10_capitulo/16_async_await/main.dart ================================================ void main() { final r = resposta().then(print); print('Resposta: $r'); } resposta() async { return 42; } ================================================ FILE: code/pt_Br/10_capitulo/17_async_await_fluxo/main.dart ================================================ void main() { final future = resposta(); future.then(print); print('Resposta: $future'); } Future resposta() async { print('Isso é síncrono'); final r = await 42; print('Isso é após o await'); return r; } ================================================ FILE: code/pt_Br/10_capitulo/18_async_await_x_future/main.dart ================================================ Future buscarNomeUsuario() { return buscarId().then((int id) { return buscarNome(id); }).then((String nome) { return 'Usuário: $nome'; }); } Future buscarNomeUsuarioAsync() async { final id = await buscarId(); final nome = await buscarNome(id); return 'Usuário: $nome'; } main() async { final usuario = await buscarNomeUsuario(); print('$usuario'); final usuarioAsync = await buscarNomeUsuarioAsync(); print('$usuarioAsync'); } Future buscarId() async => 42; Future buscarNome(int id) async => 'JHBitencourt'; ================================================ FILE: code/pt_Br/10_capitulo/19_async_await_erro/main.dart ================================================ void main() { buscarId(); print('Capturando um erro assíncrono...'); } Future buscarId() async { try { return await Future(() { return 42 ~/ 0; }); } on UnsupportedError catch (e) { print('Erro capturado: $e'); } catch (e) { print('Demais erros caem aqui'); } return 0; } // Future buscarId() async { // return Future(() { // return 42 ~/ 0; // }).catchError((dynamic e) { // print('Erro capturado: $e'); // return 0; // }, test: (dynamic e) => e is UnsupportedError) // .catchError( // (dynamic e) { // print('Demais erros caem aqui'); // return 0; // }, // ); // } ================================================ FILE: code/pt_Br/10_capitulo/20_completer_future/main.dart ================================================ import 'dart:async'; class Database { void salvarUsuario(String usuario, void Function(String) callback) { Timer(Duration(seconds: 2), () { callback('$usuario salvo'); }); } } class FutureDatabase { Future salvarUsuario(String usuario) { final completer = Completer(); Database().salvarUsuario(usuario, (String resultado) { completer.complete(resultado); }); return completer.future; } } Future main() async { // Database().salvarUsuario('JHBitencourt', callbackUsuario); final resultado = await FutureDatabase().salvarUsuario('JHBitencourt'); print('Resultado: $resultado'); } void callbackUsuario(String resultado) { print('Callback executado: $resultado'); } ================================================ FILE: code/pt_Br/10_capitulo/21_completer_flexibilidade/main.dart ================================================ import 'dart:async'; import 'dart:math'; class CompletoComNumero { late Completer _completer; int numero; CompletoComNumero._internal(this.numero) { _completer = Completer(); sorteio().listen(_validarNumero); } Stream sorteio() async* { for (int i = 0; i < 5; i++) { if (_completer.isCompleted) break; await Future.delayed(Duration(seconds: 1)); final sorteado = Random().nextInt(5) + 1; print('Sorteio: $sorteado'); yield sorteado; } if (!_completer.isCompleted) { _completer.completeError('O número não foi sorteado!'); } } void _validarNumero(int numeroSorteado) { if (numeroSorteado == numero) { _completer.complete('O número $numero foi sorteado!'); } } static Future novo(int numero) async { final c = CompletoComNumero._internal(numero); return c._completer.future; } } void main() { CompletoComNumero.novo(3).then(print).catchError(print); } ================================================ FILE: code/pt_Br/11_capitulo/01_dart_args/main.dart ================================================ /// Rode o programa com o código: /// dart main.dart teste1 2 3 void main(List args) { print(args); } ================================================ FILE: code/pt_Br/11_capitulo/02_dart_http/main.dart ================================================ import 'package:http/http.dart' as http; void main(List args) async { http.Response response = await http.get(Uri.parse('https://google.com')); print(response.body); } ================================================ FILE: code/pt_Br/11_capitulo/02_dart_http/pubspec.yaml ================================================ name: livro_dart description: Dart http. environment: sdk: '>=2.16.0 <3.0.0' dependencies: http: ^0.13.4 ================================================ FILE: code/pt_Br/11_capitulo/03_dart_convert/main.dart ================================================ import 'dart:convert'; void main() { final dados = '{"data":[{ "id":1, "name":"Acre" }, { "id":2, "name":"Alagoas" }]}'; Map map = json.decode(dados); print(map); } ================================================ FILE: code/pt_Br/12_capitulo/01_stream_subscription/main.dart ================================================ import 'dart:async'; void main() { print('Início main()'); final stream = Stream.value('A'); StreamSubscription subscription = stream.listen((dado) { print('Novo evento: $dado'); }); print('Fim main()'); } ================================================ FILE: code/pt_Br/12_capitulo/02_stream_subscription_varios_dados/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E', 'I']); final subscription = stream.listen(null); subscription.onData((dado) { print('Novo evento: $dado'); }); } ================================================ FILE: code/pt_Br/12_capitulo/03_stream_subscription_callbacks/main.dart ================================================ void main() { final stream = Stream.error('StreamErro'); final subscription = stream.listen((dado) { print('Novo evento: $dado'); }); subscription.onError((e) { print('Erro capturado: $e'); }); subscription.onDone(() => print('Stream finalizada')); } ================================================ FILE: code/pt_Br/12_capitulo/04_inscricao_unica_listener/main.dart ================================================ void main() async { final stream = Stream.value('42'); final inscricaoUm = stream.listen(print); /// Erro! Só é possível 1 listener em streams de inscrição única. final inscricaoDois = stream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/05_broadcast_listener/main.dart ================================================ void main() async { final stream = Stream.value('42').asBroadcastStream(); stream.listen((dado) => print('Inscrição 1 - $dado')); stream.listen((dado) => print('Inscrição 2 - $dado')); } ================================================ FILE: code/pt_Br/12_capitulo/06_stream_controller/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); Stream stream = controller.stream; } ================================================ FILE: code/pt_Br/12_capitulo/07_stream_controller_sink/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); final stream = controller.stream; final subscription = stream.listen((dado) { print('Novo evento: $dado'); }); subscription.onError((e) { print('Erro capturado: $e'); }); StreamSink sink = controller.sink; sink.add(42); sink.addError('Erro'); } ================================================ FILE: code/pt_Br/12_capitulo/08_stream_consumer/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); controller.stream.listen((dado) { print('Novo evento: $dado'); }); StreamSink sink = controller.sink; final future = sink.addStream(Stream.fromIterable(['A', 'B', 'C'])); future.whenComplete(() => print('Todos eventos processados')); } ================================================ FILE: code/pt_Br/12_capitulo/09_stream_consumer_2/main.dart ================================================ import 'dart:async'; void main() { final controllerUm = StreamController(); controllerUm.stream.listen((dado) { print('Novo evento StreamUm: $dado'); }, onDone: () => print('StreamUm finalizada')); final controllerDois = StreamController.broadcast(); final future = controllerUm.sink.addStream(controllerDois.stream); future.whenComplete(() => print('Todos eventos processados')); controllerDois.stream.listen((dado) { print('Novo evento StreamDois: $dado'); }, onDone: () => print('StreamDois finalizada')); controllerDois.sink.add(42); } ================================================ FILE: code/pt_Br/12_capitulo/10_stream_sink_close/main.dart ================================================ import 'dart:async'; void main() { final controllerUm = StreamController(); controllerUm.stream.listen((dado) { print('Novo evento StreamUm: $dado'); }, onDone: () => print('StreamUm finalizada')); final controllerDois = StreamController.broadcast(); final future = controllerUm.sink.addStream(controllerDois.stream); future.whenComplete(() { print('Todos eventos processados'); controllerUm.sink.close(); }); controllerDois.stream.listen((dado) { print('Novo evento StreamDois: $dado'); }, onDone: () => print('StreamDois finalizada')); controllerDois.sink.add(42); controllerDois.sink.close(); } ================================================ FILE: code/pt_Br/12_capitulo/11_stream_sink_x_stream_controller/main.dart ================================================ import 'dart:async'; void acessaSink(StreamSink sink) { sink.add(42); if (sink is StreamController) { sink.stream.listen(print); } } void main() { /// Sink encapsulada, impede o acesso direto ao controller: acessaSink(StreamController().sink); /// Controller também é um sink, mas fornece acesso a mais informações // acessaSink(StreamController()); } ================================================ FILE: code/pt_Br/12_capitulo/12_controller_callback_inscricao_unica/main.dart ================================================ import 'dart:async'; void dispararEventos(StreamController controller) async { for (var i = 1; i <= 6; i++) { if (i == 5) { controller.sink.addError('Erro no número $i'); continue; } await Future.delayed(Duration(seconds: 1), () { controller.sink.add(i); }); } controller.sink.close(); print('StreamController em estado FECHADO'); } void main() { StreamController? controller; controller = StreamController( onListen: () { print('StreamController em estado ATIVO'); dispararEventos(controller!); }, onResume: () => print('StreamController resumido'), onPause: () => print('StreamController pausado'), onCancel: () => print('StreamController em estado CANCELADO'), sync: false); controller.sink.add(0); print('StreamController em estado INICIAL'); StreamSubscription? inscricao; Future.delayed(Duration(seconds: 2), () { inscricao = controller!.stream.listen((int dado) { print('Número: $dado'); if (dado == 1) { print('Inscrição pausada'); inscricao!.pause(Future.delayed( Duration(seconds: 1), () => print('Inscrição resumida'))); } }, onError: (print), onDone: () => print('onDone'), cancelOnError: true); }); } ================================================ FILE: code/pt_Br/12_capitulo/13_controller_callback_broadcast/main.dart ================================================ import 'dart:async'; void dispararEventos(StreamController controller) async { for (var i = 1; i <= 6; i++) { if (i == 3) { controller.sink.addError('Erro no número $i'); continue; } await Future.delayed(Duration(seconds: 1), () { controller.sink.add(i); }); } controller.sink.close(); print('StreamController em estado FECHADO'); } void criarInscricao(StreamController controller, int valor) { StreamSubscription? inscricao; Future.delayed(Duration(seconds: 2), () { inscricao = controller.stream.listen((int dado) { print('[Inscrição $valor] número: $dado'); if (dado == valor) { print('[Inscrição $valor] pausada'); inscricao!.pause(Future.delayed(Duration(seconds: 2), () => print('[Inscrição $valor] resumida'))); } if (dado == valor + 3) { print('[Inscrição $valor] cancelada'); inscricao!.cancel(); } }, onError: (e) => print('[Inscrição $valor] $e'), onDone: () => print('[Inscrição $valor] onDone'), cancelOnError: false); }); } void main() { StreamController? controller; controller = StreamController.broadcast( onListen: () { print('StreamController em estado ATIVO'); dispararEventos(controller!); }, onCancel: () => print('StreamController em estado CANCELADO' ), sync: false); controller.sink.add(0); print('StreamController em estado INICIAL'); criarInscricao(controller, 1); criarInscricao(controller, 2); Future.delayed(Duration(seconds: 8), () { criarInscricao(controller!, 3); }); } ================================================ FILE: code/pt_Br/12_capitulo/14_stream_await/main.dart ================================================ // void main() { // print('início main()'); // final stream = Stream.fromIterable(['4', '2']); // stream.listen((dado) { // print('Novo evento: $dado'); // }); // print('fim main()'); // } Future main() async { print('início main()'); final stream = Stream.fromIterable(['4', '2']); await for (var dado in stream) { print('Novo evento: $dado'); } print('fim main()'); } ================================================ FILE: code/pt_Br/12_capitulo/15_stream_await_error/main.dart ================================================ void main() async { print('início main()'); final stream = Stream.error(['Error']); try { await for (var dado in stream) { print('Novo evento: $dado'); } } catch (e) { print('Erro capturado: $e'); } print('fim main()'); } ================================================ FILE: code/pt_Br/12_capitulo/16_stream_await_sem_encerramento/main.dart ================================================ import 'dart:async'; void main() async { print('início main()'); final controller = StreamController(); controller.sink.add('42'); await for (var dado in controller.stream) { print('Novo evento: $dado'); } print('fim main()'); } ================================================ FILE: code/pt_Br/12_capitulo/17_stream_propriedades/main.dart ================================================ void main() { final stream = Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream(); stream.first.then(print); // > AA stream.last.then(print); // > AU stream.isEmpty.then(print); // > false stream.length.then(print); // > 5 print(stream.isBroadcast); // > true stream.single.catchError((e) => e.toString()).then(print); // > Bad state: Too many elements } ================================================ FILE: code/pt_Br/12_capitulo/18_stream_metodos_busca/main.dart ================================================ void main() { final stream = Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream(); stream.elementAt(2).then(print); // > AI stream .firstWhere((valor) => valor.startsWith('A'), orElse: () => 'Nenhum valor começa com A') .then(print); //> AA stream .lastWhere((valor) => valor.startsWith('A'), orElse: () => 'Nenhum valor termina com A') .then(print); //> AU stream .singleWhere((valor) => valor.startsWith('A')) .then(print) .catchError(print); // > Bad state: Too many elements } ================================================ FILE: code/pt_Br/12_capitulo/19_stream_metodos_validacao/main.dart ================================================ void main() { final stream = Stream.fromIterable(['AA', 'AE', 'AI', 'AO', 'AU']).asBroadcastStream(); stream.any((valor) => valor.endsWith('E')).then(print); // > true stream.every((valor) => valor.startsWith('A')).then(print); // > true stream.contains('AO').then(print); // > true } ================================================ FILE: code/pt_Br/12_capitulo/20_as_broadcast_stream/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); final single = controller.stream; final broadcast = single.asBroadcastStream(onListen: (StreamSubscription s) { print('Inscrição realizada'); }, onCancel: (StreamSubscription s) { print('Todas inscrições canceladas'); }); final subscription = broadcast.listen(null); subscription.onData((e) { print('Novo elemento em broadcast $e'); subscription.cancel(); }); controller.sink.add('42'); } ================================================ FILE: code/pt_Br/12_capitulo/21_distinct/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'A', 'I', 'I', 'A', 'U']); final distinctStream = stream.distinct(); distinctStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/22_map/main.dart ================================================ void main() { final stream = Stream.fromIterable([4, 2]); final mapStream = stream.map((e) => e * 2); mapStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/23_expand/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E']); final expandStream = stream.expand((e) => [e, e]); expandStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/24_async_map/main.dart ================================================ void main() { final stream = Stream.fromIterable([4, 2]); final mapStream = stream.asyncMap((e) => Future.delayed(Duration(seconds: 2), () => e * 2)); mapStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/25_async_expand/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E']); final expandStream = stream.asyncExpand((e) => Stream.fromIterable([e, e])); expandStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/26_skip/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']); final skipStream = stream.skip(3); skipStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/27_skip_while/main.dart ================================================ void main() { final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]); final skipStream = stream.skipWhile((e) => e <= 6); skipStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/28_take/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']); final takeStream = stream.take(3); takeStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/29_take_while/main.dart ================================================ void main() { final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]); final takeStream = stream.takeWhile((e) => e <= 3); takeStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/30_where/main.dart ================================================ void main() { final stream = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]); final whereStream = stream.where((e) => e % 2 == 0); whereStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/31_timeout/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); controller.sink.add(4); Timer(Duration(seconds: 3), () { controller.sink.add(2); controller.close(); }); final timeoutStream = controller.stream.timeout( Duration(seconds: 2), onTimeout: (sink) { sink.add('Timeout excedido'); }, ); timeoutStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/32_to_list_to_set/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E', 'E', 'O', 'O']).asBroadcastStream(); stream.toList().then(print); stream.toSet().then(print); } ================================================ FILE: code/pt_Br/12_capitulo/33_drain/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); controller.sink.add(4); controller.sink.add(2); controller.close(); controller.stream.drain('Stream encerrada').then(print); } ================================================ FILE: code/pt_Br/12_capitulo/34_for_each/main.dart ================================================ void main() { final stream = Stream.fromIterable([4, 2]); stream .forEach((e) => print('Elemento: $e')) .then((v) => print('Future completo')); } ================================================ FILE: code/pt_Br/12_capitulo/35_fold/main.dart ================================================ void main() { final streamUm = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']); final streamDois = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]); streamUm.fold('Vogais->', (a, b) => '[$a,$b]').then(print); streamDois.fold(10, (int a, int b) => a + b).then(print); } ================================================ FILE: code/pt_Br/12_capitulo/36_reduce/main.dart ================================================ void main() { final streamUm = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']); final streamDois = Stream.fromIterable([1, 2, 3, 4, 5, 6, 7, 8, 9]); streamUm.reduce((a, b) => '[$a,$b]').then(print); streamDois.reduce((a, b) => a + b).then(print); } ================================================ FILE: code/pt_Br/12_capitulo/37_join/main.dart ================================================ void main() { final stream = Stream.fromIterable(['A', 'E', 'I', 'O', 'U']); stream.join('-').then(print); } ================================================ FILE: code/pt_Br/12_capitulo/38_cast/main.dart ================================================ import 'dart:async'; void main() { final controller = StreamController(); controller.sink.add(42); final novaStream = controller.stream.cast(); novaStream.listen(print); } ================================================ FILE: code/pt_Br/12_capitulo/39_handle_error/main.dart ================================================ import 'dart:async'; void main() async { final controller = StreamController(); controller.sink.add('4'); controller.sink.addError('Erro'); controller.sink.add('2'); final streamError = controller.stream.handleError((e) { print('Erro capturado $e'); }); await for (var dado in streamError) { print('Novo evento: $dado'); } } ================================================ FILE: code/pt_Br/12_capitulo/40_pipe/main.dart ================================================ import 'dart:async'; void main() async { final controllerUm = StreamController(); controllerUm.sink.add('4'); controllerUm.sink.add('2'); controllerUm.close(); final controllerDois = StreamController(); controllerUm.stream .pipe(controllerDois) .then((v) => print('Eventos adicionados')); controllerDois.stream.listen(print); } ================================================ FILE: code/pt_Br/13_capitulo/01_interface_stream_transformer/main.dart ================================================ import 'dart:async'; class AlfabetoTransformer implements StreamTransformer { AlfabetoTransformer({this.sufixo = '', this.prefixo = ''}) { _controller = StreamController( onListen: _onListen, onCancel: _onCancel, onPause: () => _subscription.pause, onResume: () => _subscription.resume); } AlfabetoTransformer.broadcast({this.sufixo = '', this.prefixo = ''}) { _controller = StreamController.broadcast(onListen: _onListen, onCancel: _onCancel); } late StreamController _controller; late StreamSubscription _subscription; late Stream _streamEntrada; String sufixo; String prefixo; void _onListen() { _subscription = _streamEntrada.listen(_onData, onError: _controller.addError, onDone: _controller.close); } void _onCancel() { _subscription.cancel(); } void _onData(String dado) { if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) { _controller.sink.add('$prefixo$dado$sufixo'); } else { _controller.sink.addError('Elemento inválido'); } } @override Stream bind(Stream stream) { _streamEntrada = stream; return _controller.stream; } @override StreamTransformer cast() => StreamTransformer.castFrom(this); } void main() { final stream = Stream .fromIterable(['A', 'b', 'CC', 'D', '2', '@'] ); final streamTransformada = stream .transform(AlfabetoTransformer(sufixo: ']', prefixo: '[')); streamTransformada.listen(print, onError: print); } ================================================ FILE: code/pt_Br/13_capitulo/02_construtor_stream_transformer/main.dart ================================================ import 'dart:async'; StreamTransformer criarTransformer({ String sufixo = '', String prefixo = '', }) { return StreamTransformer( (Stream streamEntrada, bool cancelOnError) { late StreamController controller; late StreamSubscription subscription; controller = StreamController( onListen: () { subscription = streamEntrada.listen((dado) { if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) { controller.sink.add('$prefixo$dado$sufixo'); } else { controller.sink.addError('Elemento inválido'); } }, onDone: controller.close, onError: controller.addError, cancelOnError: cancelOnError); }, onPause: () => subscription.pause(), onResume: () => subscription.resume(), onCancel: () => subscription.cancel(), ); return controller.stream.listen(null); }); } void main() { final stream = Stream.fromIterable(['z', '0', '%', 'U']); final streamTransformada = stream.transform(criarTransformer(sufixo: '-', prefixo: '-')); streamTransformada.listen(print, onError: print); } ================================================ FILE: code/pt_Br/13_capitulo/03_stream_transformer_base/main.dart ================================================ import 'dart:async'; class AlfabetoTransformer extends StreamTransformerBase { AlfabetoTransformer({ String sufixo = '', String prefixo = '', }) : _transformer = criarTransformer(sufixo, prefixo); final StreamTransformer _transformer; @override Stream bind(Stream stream) => _transformer.bind(stream); static StreamTransformer criarTransformer( String sufixo, String prefixo) { return StreamTransformer( (Stream inputStream, bool cancelOnError) { late StreamController controller; late StreamSubscription subscription; controller = StreamController( onListen: () { subscription = inputStream.listen( (dado) { if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) { controller.sink.add('$prefixo$dado$sufixo'); } else { controller.sink.addError('Elemento inválido'); } }, onDone: controller.close, onError: controller.addError, ); }, onPause: () => subscription.pause(), onResume: () => subscription.resume(), onCancel: () => subscription.cancel(), ); return controller.stream.listen(null); }); } } void main() { final stream = Stream.fromIterable(['FF', 'f', '42', '-']); final streamTransformada = stream.transform(AlfabetoTransformer(sufixo: '/', prefixo: '/')); streamTransformada.listen(print, onError: print); } ================================================ FILE: code/pt_Br/13_capitulo/04_stream_transformer_from_handlers/main.dart ================================================ import 'dart:async'; StreamTransformer criarTransformer({ String sufixo = '', String prefixo = '', }) { return StreamTransformer.fromHandlers( handleData: (String dado, EventSink sink) { if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) { sink.add('$prefixo$dado$sufixo'); } else { sink.addError('Elemento inválido'); } }, handleError: (Object error, StackTrace stackTrace, EventSink sink) { sink.addError('Erro stream'); }, handleDone: (EventSink sink) { sink.add('Stream finalizada'); }); } void main() { StreamController? controller; controller = StreamController(onListen: () { controller!.sink.add('j'); controller.sink.add('42'); controller.sink.addError('Erro!'); controller.close(); }); final streamTransformada = controller.stream.transform(criarTransformer(sufixo: '*', prefixo: '*')); streamTransformada.listen(print, onError: print); } ================================================ FILE: code/pt_Br/13_capitulo/05_stream_transformer_from_bind/main.dart ================================================ import 'dart:async'; class AlfabetoTransformer extends StreamTransformerBase { AlfabetoTransformer({ String sufixo = '', String prefixo = '', }) : _transformer = criarTransformer(sufixo, prefixo); final StreamTransformer _transformer; @override Stream bind(Stream stream) => _transformer.bind(stream); static StreamTransformer criarTransformer( String sufixo, String prefixo) { return StreamTransformer( (Stream inputStream, bool cancelOnError) { late StreamController controller; late StreamSubscription subscription; controller = StreamController( onListen: () { subscription = inputStream.listen( (dado) { if (dado.length == 1 && RegExp('[a-zA-Z]').hasMatch(dado)) { controller.sink.add('$prefixo$dado$sufixo'); } else { controller.sink.addError('Elemento inválido'); } }, onDone: controller.close, onError: controller.addError, ); }, onPause: () => subscription.pause(), onResume: () => subscription.resume(), onCancel: () => subscription.cancel(), ); return controller.stream.listen(null); }); } } final alfabetoMinusculoTransformer = StreamTransformer.fromBind( (Stream stream) => stream .transform(AlfabetoTransformer(sufixo: '}', prefixo: '{')) .map((dado) => dado.toLowerCase())); void main() { final stream = Stream.fromIterable(['F', 'f', '42', 'J']); final streamTransformada = stream.transform(alfabetoMinusculoTransformer); streamTransformada.listen(print, onError: print); } ================================================ FILE: code/pt_Br/13_capitulo/06_problema_inscricao_unica/main.dart ================================================ void main() { final stream = Stream.fromIterable(['Stream', 'inscrição', 'única']); stream.first.then(print); // > Stream // stream.listen(null); // > Bad state: Stream has already been listened to. } ================================================ FILE: code/pt_Br/13_capitulo/07_sem_perda_eventos/main.dart ================================================ import 'dart:async'; Stream get streamNumeros { final controller = StreamController(); var i = 1; Timer.periodic(Duration(seconds: 1), (timer) { if (i == 10) timer.cancel(); controller.sink.add(i++); }); return controller.stream; } void main() { final stream = streamNumeros; Future.delayed(Duration(seconds: 5), () { stream.listen(print); }); } ================================================ FILE: code/pt_Br/13_capitulo/08_perda_eventos_broadcast/main.dart ================================================ import 'dart:async'; Stream get streamNumeros { final controller = StreamController.broadcast(); var i = 1; Timer.periodic(Duration(seconds: 1), (timer) { if (i == 10) timer.cancel(); controller.sink.add(i++); }); return controller.stream; } void main() { final stream = streamNumeros; Future.delayed(Duration(seconds: 7), () { stream.listen((e) { print('Inscrição A $e'); }); }); Future.delayed(Duration(seconds: 9), () { stream.listen((e) { print('Inscrição B $e'); }); }); } ================================================ FILE: code/pt_Br/13_capitulo/09_broadcast_subscription_buffer/main.dart ================================================ import 'dart:async'; Stream get streamNumeros { final controller = StreamController.broadcast(); var i = 1; Timer.periodic(Duration(seconds: 1), (timer) { if (i == 10) timer.cancel(); controller.sink.add(i++); }); return controller.stream; } void main() { final stream = streamNumeros; Future.delayed(Duration(seconds: 2), () { final inscricao = stream.listen(print); Future.delayed(Duration(seconds: 2), () { inscricao.pause(); Future.delayed(Duration(seconds: 3), () { inscricao.resume(); }); }); }); } ================================================ FILE: code/pt_Br/13_capitulo/10_geradores_sincronos_yield/main.dart ================================================ import 'dart:io'; Iterable numeros() sync* { print('Gerador iniciado'); for (int i = 0; i < 3; i++) { sleep(Duration(seconds: 2)); yield i; } print('Gerador finalizado'); } void main() { print('Início main'); final iterable = numeros(); print('Começo iteração:'); Iterator i = iterable.iterator; while (i.moveNext()) print('Número: ${i.current}'); print('Término main'); } ================================================ FILE: code/pt_Br/13_capitulo/11_geradores_sincronos_yield_*/main.dart ================================================ Iterable letrasNumeros() sync* { for (int i = 1; i < 3; i++) yield i; yield* letras(); } Iterable letras() sync* { yield* ['A', 'B']; } void main() async { for (var i in letrasNumeros()) print('Valor: ${i}'); } ================================================ FILE: code/pt_Br/13_capitulo/12_geradores_assincronos_yield/main.dart ================================================ Stream numeros() async* { print('Gerador iniciado'); for (int i = 0; i < 3; i++) { await Future.delayed(Duration(seconds: 2)); yield i; } print('Gerador finalizado'); } void main() { print('Início main'); final stream = numeros(); stream.listen((i) => print('Número: $i')); print('Término main'); } ================================================ FILE: code/pt_Br/13_capitulo/13_geradores_assincronos_yield_*/main.dart ================================================ Stream letrasNumeros() async* { yield* letras(); for (int i = 1; i < 3; i++) yield i; } Stream letras() async* { yield* Stream.fromIterable(['A', 'B']); } void main() async { await for (var i in letrasNumeros()) print('Valor: ${i}'); } ================================================ FILE: code/pt_Br/13_capitulo/14_server/main.dart ================================================ import 'dart:io'; void main() async { var server = await HttpServer.bind('127.0.0.1', 8080); await for (HttpRequest request in server) { request.response.write('Primeiro server em Dart!'); await request.response.close(); } } ================================================ FILE: code/pt_Br/14_capitulo/01_isolate/main.dart ================================================ import 'dart:isolate'; void main() async { Isolate mainIsolate = Isolate.current; print('Executando na isolate: {${mainIsolate.debugName}}'); mainIsolate.kill(priority: Isolate.immediate); print('fim do main()'); } ================================================ FILE: code/pt_Br/14_capitulo/02_nova_isolate/main.dart ================================================ import 'dart:isolate'; void main() async { Isolate mainIsolate = Isolate.current; print('Executando na isolate: {${mainIsolate.debugName}}'); await Isolate.spawn(funcaoEntrada, 'Olá nova Isolate.', debugName: 'novaIsolate'); Isolate.run(computation) } void funcaoEntrada(String parametro) { final isolate = Isolate.current; print('Executando na isolate: {${isolate.debugName}}'); print('Parâmetro: $parametro'); } ================================================ FILE: code/pt_Br/14_capitulo/03_unidirecional_unica/main.dart ================================================ import 'dart:isolate'; void main() async { final receivePort = ReceivePort(); await Isolate.spawn(workerIsolate, receivePort.sendPort); receivePort.first.then((dado) => print('Mensagem recebida: $dado')); } void workerIsolate(SendPort sendPort) async { final resposta = await Future.delayed(Duration(seconds: 2), () => 'Conteúdo do arquivo'); Isolate.exit(sendPort, resposta); } ================================================ FILE: code/pt_Br/14_capitulo/04_unidirecional_frequente/main.dart ================================================ import 'dart:async'; import 'dart:isolate'; void main() async { final receivePort = ReceivePort(); await Isolate.spawn(workerIsolate, receivePort.sendPort); receivePort.listen((dado) { print('Mensagem recebida: $dado'); }); } void workerIsolate(SendPort sendPort) async { sendPort.send('Upload iniciado'); Timer.periodic(Duration(milliseconds: 100), (timer) { if (timer.tick % 10 == 0) sendPort.send('Upload ${timer.tick} % '); if (timer.tick == 100) { timer.cancel(); sendPort.send('Upload encerrado'); } }); } ================================================ FILE: code/pt_Br/14_capitulo/05_bidirecional/main.dart ================================================ import 'dart:async'; import 'dart:isolate'; Future isolateBidirecional( ReceivePort receivePort, void onMessage(var message)) async { final completer = Completer(); print('[MAIN Isolate]: Iniciado comunicação, aguardando handshake'); receivePort.listen((mensagem) { if (mensagem is SendPort) { completer.complete(mensagem); } else { onMessage(mensagem); } }); await Isolate.spawn(novaIsolate, receivePort.sendPort); return completer.future; } void novaIsolate(SendPort sendPort) { print( '[NOVA Isolate]: Solicitação de comunicação recebida, enviando resposta'); final receivePort = ReceivePort(); receivePort.listen((mensagem) { print('[NOVA Isolate]: Mensagem recebida $mensagem'); }); sendPort.send(receivePort.sendPort); Timer.periodic(Duration(seconds: 2), (timer) { sendPort.send(timer.tick); if (timer.tick == 10) timer.cancel(); }); } void main() async { final receivePort = ReceivePort(); SendPort sendPort = await isolateBidirecional(receivePort, (mensagem) { print('[MAIN Isolate]: Mensagem recebida $mensagem'); }); print( '[MAIN Isolate]: Handshake concluído, comunicação bidirecional estabelecida.'); Timer.periodic(Duration(seconds: 1), (timer) { sendPort.send(timer.tick); if (timer.tick == 10) timer.cancel(); }); } ================================================ FILE: code/pt_Br/14_capitulo/06_controle_isolate/main.dart ================================================ import 'dart:async'; import 'dart:isolate'; void main() async { final receivePort = ReceivePort(); final isolate = await Isolate.spawn(novaIsolate, receivePort.sendPort); final capability = Capability(); Future.delayed(Duration(seconds: 1), () { isolate.pause(capability); }); Future.delayed(Duration(seconds: 3), () { isolate.resume(capability); }); receivePort.listen((dado) { print('Mensagem recebida: $dado'); if (dado == 7) { isolate.kill(priority: Isolate.immediate); receivePort.close(); } }); } void novaIsolate(SendPort sendPort) async { Timer.periodic(Duration(milliseconds: 500), (timer) { sendPort.send(timer.tick); }); } ================================================ FILE: code/pt_Br/14_capitulo/07_isolate_listeners/main.dart ================================================ import 'dart:async'; import 'dart:isolate'; void main() async { final receivePort = ReceivePort(); receivePort.listen((dado) { print('Mensagem recebida: $dado'); }); final isolate = await Isolate.spawn(novaIsolate, receivePort.sendPort, errorsAreFatal: true); isolate.addOnExitListener(receivePort.sendPort, response: 'Isolate finalizada'); isolate.addErrorListener(receivePort.sendPort); Future.delayed(Duration(seconds: 1), () { isolate.ping(receivePort.sendPort, response: 'Ping com sucesso'); }); } void novaIsolate(SendPort sendPort) async { Future.delayed(Duration(seconds: 2), () { throw TimeoutException('Exceção na isolate'); }); } ================================================ FILE: code/pt_Br/14_capitulo/08_spawn_uri/isolate.dart ================================================ import 'dart:isolate'; void main(List args, SendPort sendPort) { print('[${Isolate.current.debugName}] - Args {$args}'); sendPort.send('Esse livro é muito massa mesmo!'); } ================================================ FILE: code/pt_Br/14_capitulo/08_spawn_uri/main.dart ================================================ import 'dart:isolate'; void main() async { final receivePort = ReceivePort(); receivePort.listen((dado) { print('[IsolatePrincipal] - $dado'); }); await Isolate.spawnUri( Uri.parse('isolate.dart'), ['Args 1', 'Args 2'], receivePort.sendPort, debugName: 'IsolateSeparada'); } ================================================ FILE: code/pt_Br/14_capitulo/09_isolate_run/main.dart ================================================ import 'dart:convert'; import 'dart:isolate'; void main() async { final (int id, String cliente) = await Isolate.run(() async { final json = await Future.delayed(Duration(seconds: 2), () { return '{"id": 42,"cliente": "Elon Musk"}'; }); final dados = jsonDecode(json); return (dados['id'] as int, dados['cliente'] as String); }); print('Cliente mais rico: [id: $id, nome: $cliente]'); } ================================================ FILE: code/pt_Br/14_capitulo/10_zone_root/main.dart ================================================ import 'dart:async'; void main() { final root = Zone.current; print(root); // > Instance of '_RootZone' } ================================================ FILE: code/pt_Br/14_capitulo/11_nova_zone/main.dart ================================================ import 'dart:async'; void main() { final root = Zone.current; print('Zone principal: $root'); final novaZone = root.fork(); novaZone.run(() { print('Zone nova: ${Zone.current}'); print('Zone nova pai: ${Zone.current.parent}'); }); } ================================================ FILE: code/pt_Br/14_capitulo/12_run_zoned/main.dart ================================================ import 'dart:async'; void main() { runZoned(() { print('Zone nova: ${Zone.current}'); print('Zone nova pai: ${Zone.current.parent}'); }); } ================================================ FILE: code/pt_Br/14_capitulo/13_hierarquia_zones/main.dart ================================================ import 'dart:async'; void main() { a(); Future? future; runZoned(() { future = Future(a).then(b); }); future?.then(c); } a() => print('a'); b(valor) => runZoned(() => a()); c(valor) => print('c'); ================================================ FILE: code/pt_Br/14_capitulo/14_zone_livre_erros/main.dart ================================================ import 'dart:async'; void main() { runZonedGuarded(() { mainZonedGuarded(); }, (e, s) { print('Erro capturado: $e'); }); } void mainZonedGuarded() { Future(() => throw TimeoutException('Um erro qualquer')); Future(() => throw 'Outro erro qualquer'); Future(() => throw 'Mais um erro qualquer'); } ================================================ FILE: code/pt_Br/14_capitulo/15_propagacao_erros_zones/main.dart ================================================ import 'dart:async'; void main() { runZonedGuarded(() { runZoned(() { Future(() => throw TimeoutException('Um erro qualquer na zone#3')); }); }, (e, s) { print('Erro capturado na zone#2 $e'); }); } ================================================ FILE: code/pt_Br/14_capitulo/16_propagacao_erros_zones_2/main.dart ================================================ import 'dart:async'; void main() { Future? future; runZonedGuarded(() { future = Future(() => throw TimeoutException('Um erro qualquer')); }, (e, s) { print('Erro capturado na zone $e'); }); future!.catchError((e) => print('Nunca executa')); } ================================================ FILE: code/pt_Br/14_capitulo/17_propagacao_erros_zones_3/main.dart ================================================ import 'dart:async'; void main() { final future = Future(() => throw TimeoutException('Um erro qualquer')); future.whenComplete(() => print('whenComplete zone#1')); runZonedGuarded(() { future.whenComplete(() => print('whenComplete zone#2')); print('Dentro zone#2'); }, (e, s) { print('Erro capturado na zone#2 $e'); }); runZoned(() { future.whenComplete(() => print('whenComplete zone#3')); }); } ================================================ FILE: code/pt_Br/14_capitulo/18_valores_locais_zones/main.dart ================================================ import 'dart:async'; void main() { runZoned(() { print(Zone.current['resposta']); // > 42 }, zoneValues: {'resposta': 42}); /// Usando symbol como chave runZoned(() { print(Zone.current[#resposta]); // > 42 }, zoneValues: {#resposta: 42}); /// Sobrescrevendo valores globais runZoned(() { logZone(); runZoned(() { logZone(); print('Resposta ${Zone.current[#resposta]}'); }, zoneValues: {#nomeZone: 'Zone B'}); }, zoneValues: {#nomeZone: 'Zone A', #resposta: 42}); } void logZone() => print('Rodando na ${Zone.current[#nomeZone]}'); ================================================ FILE: code/pt_Br/14_capitulo/19_zone_specification/main.dart ================================================ import 'dart:async'; void main() { runZoned(() { print('Teste log'); print('42'); }, zoneSpecification: ZoneSpecification( print: (Zone self, ZoneDelegate parent, Zone zone, String line) { parent.print(zone, '${DateTime.now()} - $line'); })); } ================================================ FILE: code/pt_Br/15_capitulo/01_criacao_diretorio/main.dart ================================================ import 'dart:io'; Future main() async { final dir = Directory('dir/teste'); await dir.create(recursive: true); print('Diretórios criados: $dir'); // > Diretórios criados: Directory: 'dir/teste' } ================================================ FILE: code/pt_Br/15_capitulo/02_remocao_diretorio/main.dart ================================================ import 'dart:io'; Future main() async { final dir = Directory('dir/teste'); // await dir.create(recursive: true); if (await dir.exists()) { await dir.delete(recursive: true); print('Diretório removido: $dir'); // > Diretório removido: Directory: 'dir/teste' } } ================================================ FILE: code/pt_Br/15_capitulo/03_criacao_arquivo/main.dart ================================================ import 'dart:io'; Future main() async { final file = File('teste.txt'); await file.create(); print('Arquivo criado: $file'); // > Arquivo criado: File: 'teste.txt' } ================================================ FILE: code/pt_Br/15_capitulo/03_criacao_arquivo/teste.txt ================================================ ================================================ FILE: code/pt_Br/15_capitulo/04_escrita_arquivo/main.dart ================================================ import 'dart:io'; import 'dart:convert'; Future main() async { final file = File('teste.txt'); await file.writeAsString('linha um', encoding: Utf8Codec()); await file.writeAsString('\nlinha dois', mode: FileMode.append); } ================================================ FILE: code/pt_Br/15_capitulo/04_escrita_arquivo/teste.txt ================================================ linha um linha dois ================================================ FILE: code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/main.dart ================================================ import 'dart:io'; Future main() async { final file = File('teste.txt'); IOSink sink = file.openWrite(mode: FileMode.write); await for (String texto in gerarStream()) { sink.write(texto); await sink.flush(); } await sink.close(); } Stream gerarStream() async* { for (int i = 0; i <= 10; i++) { await Future.delayed(Duration(seconds: 1)); yield '$i\n'; } } ================================================ FILE: code/pt_Br/15_capitulo/05_escrita_arquivo_sob_demanda/teste.txt ================================================ 0 1 2 3 4 5 6 7 8 9 10 ================================================ FILE: code/pt_Br/15_capitulo/06_ler_arquivo/main.dart ================================================ import 'dart:io'; import 'dart:convert'; Future main() async { final file = File('teste.txt'); String texto = await file.readAsString(encoding: Utf8Codec()); print(texto); } ================================================ FILE: code/pt_Br/15_capitulo/06_ler_arquivo/teste.txt ================================================ 0 1 2 3 4 5 6 7 8 9 10 ================================================ FILE: code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/main.dart ================================================ import 'dart:io'; import 'dart:convert'; Future main() async { final file = File('teste.txt'); Stream> streamBytes = file.openRead(); Stream linhas = utf8.decoder.bind(streamBytes).transform(LineSplitter()); await for (var linha in linhas) { print('Valor da linha: ${linha}'); } } ================================================ FILE: code/pt_Br/15_capitulo/07_ler_arquivo_sob_demanda/teste.txt ================================================ 0 1 2 3 4 5 6 7 8 9 10 ================================================ FILE: code/pt_Br/e_com_voce/02_imc/main.dart ================================================ void main() { int idade = 26; double altura = 1.71; // centimetros double peso = 64.2; // quilogramas double imc = peso / (altura * altura); print('IMC: $imc'); if (idade < 20) { /// crianças/adolescentes if (imc < 13) { print('Abaixo do peso'); } else if (imc >= 13 && imc < 16.8) { print('Peso normal ideal'); } else if (imc >= 16.8 && imc < 18.3) { print('Sobrepeso'); } else { print('Obesidade'); } } else if (idade >= 20 && idade < 59) { /// adultos if (imc < 18.5) { print('Abaixo do peso'); } else if (imc >= 18.5 && imc < 25) { print('Peso normal ideal'); } else if (imc >= 25 && imc < 30) { print('Sobrepeso'); } else if (imc >= 30 && imc < 35) { print('Obesidade grau 1'); } else if (imc >= 35 && imc < 40) { print('Obesidade grau 2'); } else { print('Obesidade grau 3'); } } else { /// idosos if (imc < 22) { print('Abaixo do peso'); } else if (imc >= 22 && imc < 27) { print('Peso normal ideal'); } else { print('Obesidade'); } } } ================================================ FILE: code/pt_Br/e_com_voce/03_benchmark_strings/main.dart ================================================ /* Com 9999 Strings: 0:00:00.007252 : StringBuffer 0:00:00.178047 : Concatenação Com 99999 Strings 0:00:00.020247 : StringBuffer 0:03:59.309432 : Concatenação */ const quantidade = 9999; void main() { print("Benchmarking $quantidade strings"); print("${medir(usarStringBuffer)} : StringBuffer"); print("${medir(usarConcatenacao)} : Concatenação"); } Duration medir(Function fn) { final sw = Stopwatch(); sw.start(); fn(); return sw.elapsed; } void usarStringBuffer() { var hodor = new StringBuffer(); for (var i = quantidade; i > 0; i--) { hodor.write(i.toString()); hodor.write(" hold the door\n"); } hodor.toString(); } void usarConcatenacao() { var hodor = ''; for (var i = quantidade; i > 0; i--) { hodor += i.toString(); hodor += " hold the door\n"; } } ================================================ FILE: code/pt_Br/e_com_voce/03_circunferencia/main.dart ================================================ import 'dart:io'; import 'dart:math'; final dynamic a = 'dinâmica?'; const dynamic b = 'dinâmica?'; void main() { print("------ Cálculo de circunferência ------"); print("> Qual o raio para cálculo?"); final raio = double.tryParse(stdin.readLineSync() ?? ''); //tryParse() retorna null caso não consiga converter para double if(raio == null) { print('Esse não é um valor de raio válido..'); exit(0); //Finaliza o programa } print('A circunferência é: ${2 * raio * pi}'); // pi é uma constante de dart:math print("------------------------"); } class A { final dynamic a = 'dinâmica?'; } ================================================ FILE: code/pt_Br/e_com_voce/03_regex_cpf/main.dart ================================================ void main() { final regExp = RegExp(r'^\d{3}\.?\d{3}\.?\d{3}\-?\d{2}$'); print(regExp.hasMatch('000')); print(regExp.hasMatch('000111222333')); print(regExp.hasMatch('000.111.222-333')); print(regExp.hasMatch('000.111.22299')); print(regExp.hasMatch('000.111.222-99')); print(regExp.hasMatch('000111222-99')); print(regExp.hasMatch('00011122299')); } ================================================ FILE: code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao/main.dart ================================================ import 'dart:io'; main() { print('Insira o número para cálculo do fatorial:'); final numero = int.tryParse(stdin.readLineSync() ?? '') ?? 0; print('Resultado: ${fatorial(numero)}'); } /// Modo 1: int fatorial(int numero) { if(numero == 0) return 1; // regra especial 0! = 1 return numero * fatorial(numero - 1); } /// Modo 2: // int fatorial(int numero) => numero == 0 ? 1 : numero * fatorial(numero - 1); ================================================ FILE: code/pt_Br/e_com_voce/04_funcoes_fatorial_recursao_closure/main.dart ================================================ import 'dart:io'; main() { print('Insira o número para cálculo do fatorial:'); final numero = int.tryParse(stdin.readLineSync() ?? '') ?? 0; print('Resultado: ${calcularFatorial(numero)}'); } /// Modo 1: int calcularFatorial(int numero) { int fatorial(int numero) { if (numero == 0) return 1; // regra especial 0! = 1 return numero * fatorial(numero - 1); } return fatorial(numero); } /// Modo 2: // int calcularFatorial(int numero) { // int fatorial(int numero) => numero == 0 ? 1 : numero * fatorial(numero - 1); // // return fatorial(numero); // } ================================================ FILE: code/pt_Br/e_com_voce/05_try_catch_rethrow/main.dart ================================================ void main() { try { buscarUsuario(); } catch (e, s) { print(e); print(s.toString()); print('Catch de erro global'); } } void buscarUsuario() { try { buscarUsuarioCache(); buscarUsuarioBancoDados(); } catch (e) { if (e is CacheException) { print('Não trataremos erro de cache nesse método..'); /// Um throw e; não mantém o stacktrace original. // throw e; rethrow; } print('Tratando demais erros.'); } } void buscarUsuarioCache() { throw CacheException('erro ao buscar o usuário no cache'); } void buscarUsuarioBancoDados() {} class CacheException implements Exception { final String mensagem; const CacheException(this.mensagem); } ================================================ FILE: code/pt_Br/e_com_voce/08_construtor_inicializadores/main.dart ================================================ import 'dart:math'; class Circunferencia { final double resultado; /// Inicializar valores e utilizar assert Circunferencia(double raio) : resultado = 2 * pi * raio, assert(raio >= 0); } class Subclasse extends Circunferencia { /// Chamada para construtor de superclasse Subclasse(double raio) : super(raio); } void main() { final c = Circunferencia(5); print(c.resultado); final s = Subclasse(5); print(s.resultado); } ================================================ FILE: code/pt_Br/e_com_voce/08_redirecionando_construtores/main.dart ================================================ class Coordenada { int x, y; Coordenada(this.x, this.y); /// Redireciona para o construtor padrão Coordenada.inicio() : this(0, 0); /// Redireciona para o construtor padrão Coordenada.xZero(int y) : this(0, y); /// Redireciona para o construtor padrão Coordenada.yZero(int x) : this(x, 0); String toString() { return 'Coordenada{x: $x, y: $y}'; } } void main() { final um = Coordenada(42, 42); final dois = Coordenada.inicio(); final tres = Coordenada.xZero(42); final quatro = Coordenada.yZero(42); print(um); print(dois); print(tres); print(quatro); } ================================================ FILE: code/pt_Br/e_com_voce/08_singleton/main.dart ================================================ /// Singleton com Factory class SingletonUm { SingletonUm._(); static final SingletonUm _instance = SingletonUm._(); factory SingletonUm() { return _instance; } } /// Singleton com get class SingletonDois { SingletonDois._(); static final SingletonDois _instance = SingletonDois._(); static SingletonDois get instance { return _instance; } } /// Singleton com static class SingletonTres { SingletonTres._(); static final SingletonTres instance = SingletonTres._(); } void main() { SingletonUm a = SingletonUm(); SingletonUm b = SingletonUm(); print('SingletonUm identical: ${identical(a, b)}'); SingletonDois c = SingletonDois.instance; SingletonDois d = SingletonDois.instance; print('SingletonDois identical: ${identical(c, d)}'); SingletonTres e = SingletonTres.instance; SingletonTres f = SingletonTres.instance; print('SingletonTres identical: ${identical(e, f)}'); } ================================================ FILE: code/pt_Br/e_com_voce/09_bidirectional_iterator/main.dart ================================================ class BidirectionalIteratorList { BidirectionalIteratorList(Iterable iterable, {bool back = false}) : _iterable = iterable, _length = iterable.length, _index = back ? iterable.length - 1 : 0; final Iterable _iterable; final int _length; int _index; E? _current; get current => _current; bool moveNext() { int length = _iterable.length; if (_length != length) throw ConcurrentModificationError(_iterable); if (_index >= length) { _current = null; return false; } _current = _iterable.elementAt(_index); _index++; return true; } bool movePrevious() { int length = _iterable.length; if (_length != length) throw ConcurrentModificationError(_iterable); if (_index < 0) { _current = null; return false; } _current = _iterable.elementAt(_index); _index--; return true; } } void main() { final risadas = ['kkk', 'haha', 'rsrs']; print('Ordem natural:'); final iteratorNext = BidirectionalIteratorList(risadas); while (iteratorNext.moveNext()) print(iteratorNext.current); print('Ordem trás pra frente:'); final iteratorPrevious = BidirectionalIteratorList(risadas, back: true); while (iteratorPrevious.movePrevious()) print(iteratorPrevious.current); } ================================================ FILE: code/pt_Br/e_com_voce/09_programador_comparable/main.dart ================================================ class Programador implements Comparable { Programador({required this.nome, required this.salario}); String nome; double salario = 0.0; List tarefas = []; List? linguagens; void trabalhar() {} int compareTo(Programador other) { // return salario.compareTo(other.salario); //CompareTo salário return nome.compareTo(other.nome); } String toString() => 'Programador{nome: $nome, salario: $salario}'; } void main() { final programadores = [ Programador(nome: 'James Gosling', salario: 3000), Programador(nome: 'Bill Gates', salario: 5000), Programador(nome: 'Larry Page', salario: 2000), ]; print('Lista sem ordem: $programadores'); programadores.sort(); print('Lista sorteada: $programadores'); } ================================================ FILE: code/pt_Br/e_com_voce/09_teoria_conjuntos_set/main.dart ================================================ void main() { final a = {'c', 'a', 'r', 'e', 't'}; final b = {'a', 'e', 'i', 'o', 'u'}; print('Conjunto a: $a'); print('Conjunto b: $b'); // União print('União de a e b: ${a.union(b)}'); // Interseção print('Interseção de a e b: ${a.intersection(b)}'); // Diferença print('Diferença de a e b: ${a.difference(b)}'); print('Diferença de b e a: ${b.difference(a)}'); } ================================================ FILE: code/pt_Br/e_com_voce/10_microtask_infinita/main.dart ================================================ import 'dart:async'; import 'dart:io'; int counter = 0; /// O Future nunca é executado por conta da prioridade da microtask queue main() { print('Início main()'); criarMicrotask(); Future(() => 42).then(print); print('Fim main()'); } criarMicrotask() { scheduleMicrotask(() { counter++; print('microtask $counter'); sleep(Duration(seconds: 1)); criarMicrotask(); }); } ================================================ FILE: code/pt_Br/e_com_voce/13_gerador_divisores/main.dart ================================================ import 'dart:io'; Stream divisores(int numero) async* { for (int i = 1; i <= numero; i++) { if (numero % i == 0) yield i; } } Future main() async { print('Insira o valor:'); final numero = int.parse(stdin.readLineSync()!); print('Todos os divisores de $numero:'); await for (final e in divisores(numero)) { print('Número: $e'); } } ================================================ FILE: code/pt_Br/e_com_voce/13_gerador_valores_impar/main.dart ================================================ Stream numerosImpar() async* { for (int i = 0; i < 1000; i++) { if (i % 2 != 0) yield i; } } Future main() async { print('Todos os valores ímpares de 0 a 1000:'); await for (final e in numerosImpar()) { print('Número: $e'); } print('Fim'); } ================================================ FILE: code/pt_Br/e_com_voce/13_stream_transformer_email/main.dart ================================================ import 'dart:async'; const emailPattern = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; StreamTransformer transformerEmail() { return StreamTransformer.fromHandlers( handleData: (String dado, EventSink sink) { final regExp = RegExp(emailPattern); if (regExp.hasMatch(dado)) { sink.add('E-mail válido: $dado'); } else { sink.addError('---> Inválido: $dado'); } }, handleError: (Object error, StackTrace stackTrace, EventSink sink) { sink.addError('Erro stream'); }, handleDone: (EventSink sink) { sink.add('Stream finalizada'); }); } void main() { StreamController? controller; controller = StreamController(onListen: () { controller!.sink.add('jhb@aaa'); controller.sink.add('jhb@gmail.com'); controller.sink.add('peter-parker@marvel.com'); controller.sink.add('julio.gmail.com'); controller.close(); }); final streamEmail = controller.stream.transform(transformerEmail()); streamEmail.listen(print, onError: print); } ================================================ FILE: code/pt_Br/e_com_voce/13_stream_transformer_telefone/main.dart ================================================ import 'dart:async'; const telefonePattern = r'^(?:(?:\+|00)?(55)\s?)?(?:(?:\(?[1-9][0-9]\)?)?\s?)?(?:((?:9\d|[2-9])\d{3})-?(\d{4}))$'; StreamTransformer transformerTelefone() { return StreamTransformer.fromHandlers( handleData: (String dado, EventSink sink) { final regExp = RegExp(telefonePattern); if (regExp.hasMatch(dado)) { sink.add('Telefone válido: $dado'); } else { sink.addError('---> Inválido: $dado'); } }, handleError: (Object error, StackTrace stackTrace, EventSink sink) { sink.addError('Erro stream'); }, handleDone: (EventSink sink) { sink.add('Stream finalizada'); }); } void main() { StreamController? controller; controller = StreamController(onListen: () { controller!.sink.add('4891883344'); controller.sink.add('(473) 998735467'); controller.sink.add('47991433265'); controller.sink.add('(47) 998735467'); controller.sink.add('473998735467'); controller.sink.add('554891883344'); controller.close(); }); final streamEmail = controller.stream.transform(transformerTelefone()); streamEmail.listen(print, onError: print); } ================================================ FILE: code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/main.dart ================================================ import 'dart:isolate'; import 'package:stream_channel/isolate_channel.dart'; void main(args) async { final receivePort = ReceivePort(); final channel = IsolateChannel.connectReceive(receivePort); channel.stream.listen((data) { print(' mensagem recebida: $data'); }); await Isolate.spawn(novaIsolate, receivePort.sendPort); channel.sink.add('Alguém ta me ouvindo? Câmbio desligo.'); } void novaIsolate(SendPort sPort) { final channel = IsolateChannel.connectSend(sPort); channel.stream.listen((data) { print(' mensagem recebida: $data'); }); channel.sink.add('Oi isolate main. Câmbio desligo.'); } ================================================ FILE: code/pt_Br/e_com_voce/14_isolate_bidirecional_stream_channel/pubspec.yaml ================================================ name: isolate_bidirecional description: Comunicação bidirecional em isolates pelo stream_channel. version: 1.0.0 environment: sdk: ^3.5.1 dependencies: stream_channel: ^2.1.0 dev_dependencies: lints: ^1.0.0 test: ^1.16.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/bin/climatempo.dart ================================================ import 'dart:async'; import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/log.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) { runZonedGuarded(() { executar(args); }, (e, s) { print(e); print(s); salvarErro(e, s); }); } Future executar(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); if (comando['salvar']) await salvarCidadesIsolate(cidades); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); if (comando['salvar']) await salvarTempoIsolate(tempo); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/log.dart ================================================ import 'dart:async'; import 'dart:io'; import 'dart:isolate'; import 'package:climatempo/model/clima_tempo.dart'; import 'model/cidade.dart'; Future _validarDiretorio({String? dirPath}) async { final dir = Directory(dirPath ?? 'log'); if (!(await dir.exists())) { await dir.create(recursive: true); } } Future salvarTempoIsolate(ClimaTempo climaTempo) async { final isolate = await Isolate.spawn(salvarTempo, climaTempo); _registrarCallbackFinalizacao(isolate); } Future salvarTempo(ClimaTempo climaTempo) async { runZonedGuarded(() async { await _validarDiretorio(dirPath: 'log/clima/'); final file = File('log/clima/${climaTempo.cidade.id}.txt'); await file.writeAsString('===\n$climaTempo', mode: FileMode.append); }, (e, s) { print(e); print(s); salvarErro(e, s, fileName: 'io/io.txt'); }); } void _registrarCallbackFinalizacao(Isolate isolate) { final receivePort = ReceivePort(); receivePort.listen((mensagem) { print(mensagem); receivePort.close(); }); isolate.addOnExitListener(receivePort.sendPort, response: 'Arquivo salvo com sucesso!'); } Future salvarCidadesIsolate(List cidades) async { final isolate = await Isolate.spawn(salvarCidades, cidades); _registrarCallbackFinalizacao(isolate); } Future salvarCidades(List cidades) async { runZonedGuarded(() async { await _validarDiretorio(); final file = File('log/cidades.txt'); final sink = file.openWrite(mode: FileMode.write); cidades.forEach((c) => sink.writeln(c)); await sink.flush(); await sink.close(); }, (e, s) { print(e); print(s); salvarErro(e, s, fileName: 'io/io.txt'); }); } Future salvarErro(Object erro, StackTrace stackTrace, {String? fileName}) async { final data = DateTime.now(); final ano = data.year; final mes = _doisDigitos(data.month); final dia = _doisDigitos(data.day); final fileDir = 'log/erro/${fileName ?? '$dia$mes$ano.txt'}'; await _validarDiretorio(dirPath: fileDir.split(RegExp(r'[^\/]+$')).first); final file = File(fileDir); await file.writeAsString('${data.toIso8601String()} : $erro\n', mode: FileMode.append); await file.writeAsString('${data.toIso8601String()} : $stackTrace', mode: FileMode.append); } String _doisDigitos(int numero) { if (numero >= 10) return '$numero'; return '0$numero'; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/cidades.txt ================================================ Id: 5049 - Nome: Abdon Batista - Estado: SC, País: BR Id: 5050 - Nome: Abelardo Luz - Estado: SC, País: BR Id: 5051 - Nome: Agrolândia - Estado: SC, País: BR Id: 5052 - Nome: Agronômica - Estado: SC, País: BR Id: 5053 - Nome: Água Doce - Estado: SC, País: BR Id: 5054 - Nome: Águas Brancas - Estado: SC, País: BR Id: 5055 - Nome: Águas de Chapecó - Estado: SC, País: BR Id: 5056 - Nome: Águas Frias - Estado: SC, País: BR Id: 5057 - Nome: Águas Mornas - Estado: SC, País: BR Id: 5058 - Nome: Alfredo Wagner - Estado: SC, País: BR Id: 5059 - Nome: Alto Bela Vista - Estado: SC, País: BR Id: 5060 - Nome: Anchieta - Estado: SC, País: BR Id: 5061 - Nome: Angelina - Estado: SC, País: BR Id: 5062 - Nome: Anita Garibaldi - Estado: SC, País: BR Id: 5063 - Nome: Anitápolis - Estado: SC, País: BR Id: 5064 - Nome: Anta Gorda - Estado: SC, País: BR Id: 5065 - Nome: Antônio Carlos - Estado: SC, País: BR Id: 5066 - Nome: Apiúna - Estado: SC, País: BR Id: 5067 - Nome: Arabutã - Estado: SC, País: BR Id: 5068 - Nome: Araquari - Estado: SC, País: BR Id: 5069 - Nome: Araranguá - Estado: SC, País: BR Id: 5070 - Nome: Armazém - Estado: SC, País: BR Id: 5071 - Nome: Arroio Trinta - Estado: SC, País: BR Id: 5072 - Nome: Arvoredo - Estado: SC, País: BR Id: 5073 - Nome: Ascurra - Estado: SC, País: BR Id: 5074 - Nome: Atalanta - Estado: SC, País: BR Id: 5075 - Nome: Aurora - Estado: SC, País: BR Id: 5076 - Nome: Balneário Arroio do Silva - Estado: SC, País: BR Id: 5077 - Nome: Balneário Barra do Sul - Estado: SC, País: BR Id: 5078 - Nome: Balneário Camboriú - Estado: SC, País: BR Id: 5080 - Nome: Balneário Gaivota - Estado: SC, País: BR Id: 4769 - Nome: Balneário Piçarras - Estado: SC, País: BR Id: 5081 - Nome: Bandeirante - Estado: SC, País: BR Id: 5082 - Nome: Barra Bonita - Estado: SC, País: BR Id: 5083 - Nome: Barra do Ibiraquera - Estado: SC, País: BR Id: 5084 - Nome: Barra do Saí - Estado: SC, País: BR Id: 5085 - Nome: Barra Velha - Estado: SC, País: BR Id: 5086 - Nome: Bela Vista do Toldo - Estado: SC, País: BR Id: 5087 - Nome: Belmonte - Estado: SC, País: BR Id: 5088 - Nome: Benedito Novo - Estado: SC, País: BR Id: 5089 - Nome: Biguaçu - Estado: SC, País: BR Id: 5090 - Nome: Blumenau - Estado: SC, País: BR Id: 5091 - Nome: Bocaina do Sul - Estado: SC, País: BR Id: 5092 - Nome: Bombinhas - Estado: SC, País: BR Id: 5093 - Nome: Bom Jardim da Serra - Estado: SC, País: BR Id: 5095 - Nome: Bom Jesus - Estado: SC, País: BR Id: 5094 - Nome: Bom Jesus do Oeste - Estado: SC, País: BR Id: 5096 - Nome: Bom Retiro - Estado: SC, País: BR Id: 5097 - Nome: Bom Sucesso - Estado: SC, País: BR Id: 5098 - Nome: Botuverá - Estado: SC, País: BR Id: 5099 - Nome: Braço do Norte - Estado: SC, País: BR Id: 5100 - Nome: Braço do Trombudo - Estado: SC, País: BR Id: 5101 - Nome: Brunópolis - Estado: SC, País: BR Id: 5102 - Nome: Brusque - Estado: SC, País: BR Id: 5103 - Nome: Caçador - Estado: SC, País: BR Id: 5104 - Nome: Caibi - Estado: SC, País: BR Id: 5105 - Nome: Calmon - Estado: SC, País: BR Id: 5106 - Nome: Camboriú - Estado: SC, País: BR Id: 5107 - Nome: Campina da Alegria - Estado: SC, País: BR Id: 5108 - Nome: Campo Alegre - Estado: SC, País: BR Id: 5109 - Nome: Campo Belo do Sul - Estado: SC, País: BR Id: 5110 - Nome: Campo Erê - Estado: SC, País: BR Id: 5111 - Nome: Campos Novos - Estado: SC, País: BR Id: 5112 - Nome: Canelinha - Estado: SC, País: BR Id: 5113 - Nome: Canoinhas - Estado: SC, País: BR Id: 5114 - Nome: Capão Alto - Estado: SC, País: BR Id: 5115 - Nome: Capinzal - Estado: SC, País: BR Id: 5116 - Nome: Capivari de Baixo - Estado: SC, País: BR Id: 5117 - Nome: Catanduvas - Estado: SC, País: BR Id: 5118 - Nome: Caxambu do Sul - Estado: SC, País: BR Id: 5119 - Nome: Celso Ramos - Estado: SC, País: BR Id: 4888 - Nome: Cerro Negro - Estado: SC, País: BR Id: 4889 - Nome: Chapadão do Lageado - Estado: SC, País: BR Id: 4890 - Nome: Chapecó - Estado: SC, País: BR Id: 4891 - Nome: Cocal do Sul - Estado: SC, País: BR Id: 4892 - Nome: Concórdia - Estado: SC, País: BR Id: 4893 - Nome: Cordilheira Alta - Estado: SC, País: BR Id: 4894 - Nome: Coronel Freitas - Estado: SC, País: BR Id: 4895 - Nome: Coronel Martins - Estado: SC, País: BR Id: 4896 - Nome: Correia Pinto - Estado: SC, País: BR Id: 4897 - Nome: Corupá - Estado: SC, País: BR Id: 4898 - Nome: Criciúma - Estado: SC, País: BR Id: 4899 - Nome: Cunha Porã - Estado: SC, País: BR Id: 4900 - Nome: Cunhataí - Estado: SC, País: BR Id: 4901 - Nome: Curitibanos - Estado: SC, País: BR Id: 4902 - Nome: Descanso - Estado: SC, País: BR Id: 4903 - Nome: Dionísio Cerqueira - Estado: SC, País: BR Id: 4904 - Nome: Dona Emma - Estado: SC, País: BR Id: 4905 - Nome: Doutor Pedrinho - Estado: SC, País: BR Id: 4906 - Nome: Enseada de Brito - Estado: SC, País: BR Id: 4907 - Nome: Entre Rios - Estado: SC, País: BR Id: 4909 - Nome: Ermo - Estado: SC, País: BR Id: 4912 - Nome: Erval Velho - Estado: SC, País: BR Id: 4913 - Nome: Faxinal dos Guedes - Estado: SC, País: BR Id: 4914 - Nome: Flor do Sertão - Estado: SC, País: BR Id: 4915 - Nome: Florianópolis - Estado: SC, País: BR Id: 4916 - Nome: Formosa do Sul - Estado: SC, País: BR Id: 4918 - Nome: Forquilhinha - Estado: SC, País: BR Id: 4919 - Nome: Fraiburgo - Estado: SC, País: BR Id: 4920 - Nome: Frei Rogério - Estado: SC, País: BR Id: 4921 - Nome: Galvão - Estado: SC, País: BR Id: 4922 - Nome: Garopaba - Estado: SC, País: BR Id: 4923 - Nome: Garuva - Estado: SC, País: BR Id: 4924 - Nome: Gaspar - Estado: SC, País: BR Id: 4925 - Nome: Governador Celso Ramos - Estado: SC, País: BR Id: 4927 - Nome: Grão Pará - Estado: SC, País: BR Id: 4928 - Nome: Gravatal - Estado: SC, País: BR Id: 4929 - Nome: Guabiruba - Estado: SC, País: BR Id: 4930 - Nome: Guaraciaba - Estado: SC, País: BR Id: 4931 - Nome: Guaramirim - Estado: SC, País: BR Id: 4932 - Nome: Guarda do Embaú - Estado: SC, País: BR Id: 4933 - Nome: Guarujá do Sul - Estado: SC, País: BR Id: 4935 - Nome: Guatá - Estado: SC, País: BR Id: 4934 - Nome: Guatambú - Estado: SC, País: BR Id: 4936 - Nome: Herval d'Oeste - Estado: SC, País: BR Id: 4937 - Nome: Ibiam - Estado: SC, País: BR Id: 4938 - Nome: Ibicaré - Estado: SC, País: BR Id: 4939 - Nome: Ibirama - Estado: SC, País: BR Id: 4940 - Nome: Içara - Estado: SC, País: BR Id: 4941 - Nome: Ilhota - Estado: SC, País: BR Id: 4942 - Nome: Imaruí - Estado: SC, País: BR Id: 4943 - Nome: Imbituba - Estado: SC, País: BR Id: 4944 - Nome: Imbuia - Estado: SC, País: BR Id: 4945 - Nome: Indaial - Estado: SC, País: BR Id: 4946 - Nome: Iomerê - Estado: SC, País: BR Id: 4947 - Nome: Ipira - Estado: SC, País: BR Id: 4948 - Nome: Ipoméia - Estado: SC, País: BR Id: 4949 - Nome: Iporã do Oeste - Estado: SC, País: BR Id: 4950 - Nome: Ipuaçu - Estado: SC, País: BR Id: 4951 - Nome: Ipumirim - Estado: SC, País: BR Id: 4952 - Nome: Iraceminha - Estado: SC, País: BR Id: 4953 - Nome: Irani - Estado: SC, País: BR Id: 4954 - Nome: Irati - Estado: SC, País: BR Id: 4955 - Nome: Irineópolis - Estado: SC, País: BR Id: 4962 - Nome: Itá - Estado: SC, País: BR Id: 4956 - Nome: Itaiópolis - Estado: SC, País: BR Id: 4957 - Nome: Itajaí - Estado: SC, País: BR Id: 4958 - Nome: Itapema - Estado: SC, País: BR Id: 4959 - Nome: Itapiranga - Estado: SC, País: BR Id: 4960 - Nome: Itapoá - Estado: SC, País: BR Id: 4961 - Nome: Itapocu - Estado: SC, País: BR Id: 4963 - Nome: Ituporanga - Estado: SC, País: BR Id: 4964 - Nome: Jaborá - Estado: SC, País: BR Id: 4965 - Nome: Jacinto Machado - Estado: SC, País: BR Id: 4966 - Nome: Jaguaruna - Estado: SC, País: BR Id: 4967 - Nome: Jaraguá do Sul - Estado: SC, País: BR Id: 4968 - Nome: Jardinópolis - Estado: SC, País: BR Id: 4969 - Nome: Joaçaba - Estado: SC, País: BR Id: 4970 - Nome: Joinville - Estado: SC, País: BR Id: 4971 - Nome: José Boiteux - Estado: SC, País: BR Id: 4972 - Nome: Jupiá - Estado: SC, País: BR Id: 4974 - Nome: Lacerdópolis - Estado: SC, País: BR Id: 4975 - Nome: Lages - Estado: SC, País: BR Id: 4976 - Nome: Laguna - Estado: SC, País: BR Id: 4977 - Nome: Lajeado Grande - Estado: SC, País: BR Id: 4978 - Nome: Laurentino - Estado: SC, País: BR Id: 4979 - Nome: Lauro Muller - Estado: SC, País: BR Id: 4980 - Nome: Lebon Régis - Estado: SC, País: BR Id: 4981 - Nome: Leoberto Leal - Estado: SC, País: BR Id: 4982 - Nome: Lindóia do Sul - Estado: SC, País: BR Id: 4983 - Nome: Lontras - Estado: SC, País: BR Id: 4984 - Nome: Luiz Alves - Estado: SC, País: BR Id: 4985 - Nome: Luzerna - Estado: SC, País: BR Id: 4986 - Nome: Macieira - Estado: SC, País: BR Id: 4987 - Nome: Mafra - Estado: SC, País: BR Id: 4988 - Nome: Major Gercino - Estado: SC, País: BR Id: 4989 - Nome: Major Vieira - Estado: SC, País: BR Id: 4990 - Nome: Maracajá - Estado: SC, País: BR Id: 4991 - Nome: Maravilha - Estado: SC, País: BR Id: 4992 - Nome: Marema - Estado: SC, País: BR Id: 4993 - Nome: Massaranduba - Estado: SC, País: BR Id: 4994 - Nome: Matos Costa - Estado: SC, País: BR Id: 4995 - Nome: Meleiro - Estado: SC, País: BR Id: 4996 - Nome: Mirim Doce - Estado: SC, País: BR Id: 4997 - Nome: Modelo - Estado: SC, País: BR Id: 4998 - Nome: Mondaí - Estado: SC, País: BR Id: 4999 - Nome: Monte Carlo - Estado: SC, País: BR Id: 5000 - Nome: Monte Castelo - Estado: SC, País: BR Id: 5001 - Nome: Morro da Fumaça - Estado: SC, País: BR Id: 5002 - Nome: Morro Grande - Estado: SC, País: BR Id: 5003 - Nome: Navegantes - Estado: SC, País: BR Id: 5004 - Nome: Nova Erechim - Estado: SC, País: BR Id: 5005 - Nome: Nova Itaberaba - Estado: SC, País: BR Id: 5006 - Nome: Nova Trento - Estado: SC, País: BR Id: 5007 - Nome: Nova Veneza - Estado: SC, País: BR Id: 4678 - Nome: Novo Horizonte - Estado: SC, País: BR Id: 4679 - Nome: Orleans - Estado: SC, País: BR Id: 4680 - Nome: Otacílio Costa - Estado: SC, País: BR Id: 4681 - Nome: Ouro - Estado: SC, País: BR Id: 4682 - Nome: Ouro Verde - Estado: SC, País: BR Id: 4683 - Nome: Paial - Estado: SC, País: BR Id: 4648 - Nome: Painel - Estado: SC, País: BR Id: 4756 - Nome: Palhoça - Estado: SC, País: BR Id: 4757 - Nome: Palma Sola - Estado: SC, País: BR Id: 4758 - Nome: Palmeira - Estado: SC, País: BR Id: 4759 - Nome: Palmitos - Estado: SC, País: BR Id: 4760 - Nome: Papanduva - Estado: SC, País: BR Id: 4761 - Nome: Paraíso - Estado: SC, País: BR Id: 4762 - Nome: Passo de Torres - Estado: SC, País: BR Id: 4763 - Nome: Passos Maia - Estado: SC, País: BR Id: 4764 - Nome: Paulo Lopes - Estado: SC, País: BR Id: 4765 - Nome: Pedras Grandes - Estado: SC, País: BR Id: 4766 - Nome: Penha - Estado: SC, País: BR Id: 4767 - Nome: Peritiba - Estado: SC, País: BR Id: 4768 - Nome: Petrolândia - Estado: SC, País: BR Id: 4770 - Nome: Pinhalzinho - Estado: SC, País: BR Id: 4771 - Nome: Pinheiro Preto - Estado: SC, País: BR Id: 4772 - Nome: Piratuba - Estado: SC, País: BR Id: 4773 - Nome: Planalto Alegre - Estado: SC, País: BR Id: 4774 - Nome: Pomerode - Estado: SC, País: BR Id: 4776 - Nome: Ponte Alta - Estado: SC, País: BR Id: 4775 - Nome: Ponte Alta do Norte - Estado: SC, País: BR Id: 4777 - Nome: Ponte Serrada - Estado: SC, País: BR Id: 4778 - Nome: Porto Belo - Estado: SC, País: BR Id: 4779 - Nome: Porto União - Estado: SC, País: BR Id: 4780 - Nome: Pouso Redondo - Estado: SC, País: BR Id: 4781 - Nome: Praia do Santinho - Estado: SC, País: BR Id: 4782 - Nome: Praia Grande - Estado: SC, País: BR Id: 4783 - Nome: Presidente Castelo Branco - Estado: SC, País: BR Id: 4784 - Nome: Presidente Getúlio - Estado: SC, País: BR Id: 4785 - Nome: Presidente Nereu - Estado: SC, País: BR Id: 4811 - Nome: Princesa - Estado: SC, País: BR Id: 4812 - Nome: Quilombo - Estado: SC, País: BR Id: 4813 - Nome: Rancho Queimado - Estado: SC, País: BR Id: 4814 - Nome: Rio das Antas - Estado: SC, País: BR Id: 4815 - Nome: Rio do Campo - Estado: SC, País: BR Id: 4816 - Nome: Rio d'Oeste - Estado: SC, País: BR Id: 4817 - Nome: Rio dos Cedros - Estado: SC, País: BR Id: 4818 - Nome: Rio do Sul - Estado: SC, País: BR Id: 4819 - Nome: Rio Fortuna - Estado: SC, País: BR Id: 4820 - Nome: Rio Negrinho - Estado: SC, País: BR Id: 4821 - Nome: Rio Rufino - Estado: SC, País: BR Id: 4822 - Nome: Riqueza - Estado: SC, País: BR Id: 4823 - Nome: Rodeio - Estado: SC, País: BR Id: 4824 - Nome: Romelândia - Estado: SC, País: BR Id: 4825 - Nome: Salete - Estado: SC, País: BR Id: 4826 - Nome: Saltinho - Estado: SC, País: BR Id: 4827 - Nome: Salto Veloso - Estado: SC, País: BR Id: 4828 - Nome: Sangão - Estado: SC, País: BR Id: 4829 - Nome: Santa Cecília - Estado: SC, País: BR Id: 4830 - Nome: Santa Helena - Estado: SC, País: BR Id: 4831 - Nome: Santa Rosa de Lima - Estado: SC, País: BR Id: 4832 - Nome: Santa Rosa do Sul - Estado: SC, País: BR Id: 4834 - Nome: Santa Terezinha - Estado: SC, País: BR Id: 4833 - Nome: Santa Terezinha do Progresso - Estado: SC, País: BR Id: 4835 - Nome: Santiago do Sul - Estado: SC, País: BR Id: 4836 - Nome: Santo Amaro da Imperatriz - Estado: SC, País: BR Id: 4837 - Nome: São Bento do Sul - Estado: SC, País: BR Id: 4838 - Nome: São Bernardino - Estado: SC, País: BR Id: 4839 - Nome: São Bonifácio - Estado: SC, País: BR Id: 4840 - Nome: São Carlos - Estado: SC, País: BR Id: 4841 - Nome: São Cristovão do Sul - Estado: SC, País: BR Id: 4842 - Nome: São Domingos - Estado: SC, País: BR Id: 4843 - Nome: São Francisco do Sul - Estado: SC, País: BR Id: 4844 - Nome: São João Batista - Estado: SC, País: BR Id: 4845 - Nome: São João do Itaperiú - Estado: SC, País: BR Id: 4846 - Nome: São João do Oeste - Estado: SC, País: BR Id: 4847 - Nome: São João do Sul - Estado: SC, País: BR Id: 4848 - Nome: São Joaquim - Estado: SC, País: BR Id: 4851 - Nome: São José - Estado: SC, País: BR Id: 4849 - Nome: São José do Cedro - Estado: SC, País: BR Id: 4850 - Nome: São José do Cerrito - Estado: SC, País: BR Id: 4852 - Nome: São Lourenço d'Oeste - Estado: SC, País: BR Id: 4853 - Nome: São Ludgero - Estado: SC, País: BR Id: 4854 - Nome: São Martinho - Estado: SC, País: BR Id: 4855 - Nome: São Miguel da Boa Vista - Estado: SC, País: BR Id: 4856 - Nome: São Miguel do Oeste - Estado: SC, País: BR Id: 4857 - Nome: São Pedro de Alcântara - Estado: SC, País: BR Id: 4858 - Nome: Saudades - Estado: SC, País: BR Id: 85793 - Nome: SBCH - Estado: SC, País: BR Id: 74832 - Nome: SBFL - Estado: SC, País: BR Id: 74833 - Nome: SBJV - Estado: SC, País: BR Id: 85285 - Nome: SBNF - Estado: SC, País: BR Id: 4859 - Nome: Schroeder - Estado: SC, País: BR Id: 4860 - Nome: Seara - Estado: SC, País: BR Id: 4861 - Nome: Serra Alta - Estado: SC, País: BR Id: 4862 - Nome: Siderópolis - Estado: SC, País: BR Id: 4863 - Nome: Sombrio - Estado: SC, País: BR Id: 4864 - Nome: Sul Brasil - Estado: SC, País: BR Id: 4865 - Nome: Taió - Estado: SC, País: BR Id: 4866 - Nome: Tangará - Estado: SC, País: BR Id: 4867 - Nome: Tigrinhos - Estado: SC, País: BR Id: 4868 - Nome: Tijucas - Estado: SC, País: BR Id: 4869 - Nome: Timbé do Sul - Estado: SC, País: BR Id: 4871 - Nome: Timbó - Estado: SC, País: BR Id: 4870 - Nome: Timbó Grande - Estado: SC, País: BR Id: 4872 - Nome: Três Barras - Estado: SC, País: BR Id: 4875 - Nome: Treviso - Estado: SC, País: BR Id: 4878 - Nome: Treze de Maio - Estado: SC, País: BR Id: 4879 - Nome: Treze Tílias - Estado: SC, País: BR Id: 4880 - Nome: Trombudo Central - Estado: SC, País: BR Id: 4881 - Nome: Tubarão - Estado: SC, País: BR Id: 4882 - Nome: Tunápolis - Estado: SC, País: BR Id: 4883 - Nome: Turvo - Estado: SC, País: BR Id: 4884 - Nome: União do Oeste - Estado: SC, País: BR Id: 4885 - Nome: Urubici - Estado: SC, País: BR Id: 4886 - Nome: Urupema - Estado: SC, País: BR Id: 4887 - Nome: Urussanga - Estado: SC, País: BR Id: 4482 - Nome: Vargeão - Estado: SC, País: BR Id: 4484 - Nome: Vargem - Estado: SC, País: BR Id: 4483 - Nome: Vargem Bonita - Estado: SC, País: BR Id: 4485 - Nome: Vidal Ramos - Estado: SC, País: BR Id: 4486 - Nome: Videira - Estado: SC, País: BR Id: 4487 - Nome: Vitor Meireles - Estado: SC, País: BR Id: 4488 - Nome: Witmarsum - Estado: SC, País: BR Id: 4489 - Nome: Xanxerê - Estado: SC, País: BR Id: 4490 - Nome: Xavantina - Estado: SC, País: BR Id: 4491 - Nome: Xaxim - Estado: SC, País: BR Id: 4492 - Nome: Zortéa - Estado: SC, País: BR ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/clima/4915.txt ================================================ === Cidade: Florianópolis, SC - BR 2022-03-13 23:11:47.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/log/erro/io/io.txt ================================================ 2022-03-13T23:13:23.420404 : Erro ao salvar o tempo no arquivo 2022-03-13T23:13:23.420404 : #0 salvarTempo. (package:climatempo/log.dart:24:5) #1 salvarTempo. (package:climatempo/log.dart:23:19) #2 _rootRun (dart:async/zone.dart:1426:13) #3 _CustomZone.run (dart:async/zone.dart:1328:19) #4 _runZoned (dart:async/zone.dart:1861:10) #5 runZonedGuarded (dart:async/zone.dart:1849:12) #6 salvarTempo (package:climatempo/log.dart:23:3) #7 _delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:300:17) #8 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) 2022-03-13T23:14:29.744959 : FileSystemException: Cannot open file, path = 'log/clima/4915.txt' (OS Error: No such file or directory, errno = 2) 2022-03-13T23:14:29.744959 : #0 _File.open. (dart:io/file_impl.dart:356:9) #1 _rootRunUnary (dart:async/zone.dart:1434:47) #2 _CustomZone.runUnary (dart:async/zone.dart:1335:19) #3 salvarTempo. (package:climatempo/log.dart:25:5) ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_diretorios/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/bin/climatempo.dart ================================================ import 'dart:async'; import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/log.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) { runZonedGuarded(() { executar(args); }, (e, s) { print(e); print(s); salvarErro(e, s); }); } Future executar(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); if (comando['salvar']) await salvarCidadesIsolate(cidades); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); if (comando['salvar']) await salvarTempoIsolate(tempo); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/log.dart ================================================ import 'dart:async'; import 'dart:io'; import 'dart:isolate'; import 'package:climatempo/model/clima_tempo.dart'; import 'model/cidade.dart'; Future _validarDiretorio() async { final dir = Directory('log'); if (!(await dir.exists())) { await dir.create(); } } Future salvarTempoIsolate(ClimaTempo climaTempo) async { final receivePortError = ReceivePort(); receivePortError.listen((error) { final errorList = error as List; salvarErro( errorList.first, StackTrace.fromString(errorList[1]), fileName: 'io.txt', ); }); final isolate = await Isolate.spawn( salvarTempo, climaTempo, onError: receivePortError.sendPort, ); _registrarCallbackFinalizacao(isolate); } Future salvarTempo(ClimaTempo climaTempo) async { await _validarDiretorio(); final file = File('log/${climaTempo.cidade.id}.txt'); await file.writeAsString('===\n$climaTempo', mode: FileMode.append); } void _registrarCallbackFinalizacao(Isolate isolate) { final receivePort = ReceivePort(); receivePort.listen((mensagem) { print(mensagem); receivePort.close(); }); isolate.addOnExitListener(receivePort.sendPort, response: 'Arquivo salvo com sucesso!'); } Future salvarCidadesIsolate(List cidades) async { final receivePortError = ReceivePort(); receivePortError.listen((error) { final errorList = error as List; salvarErro( errorList.first, StackTrace.fromString(errorList[1]), fileName: 'io.txt', ); }); final isolate = await Isolate.spawn( salvarCidades, cidades, onError: receivePortError.sendPort, ); _registrarCallbackFinalizacao(isolate); } Future salvarCidades(List cidades) async { await _validarDiretorio(); final file = File('log/cidades.txt'); final sink = file.openWrite(mode: FileMode.write); cidades.forEach((c) => sink.writeln(c)); await sink.flush(); await sink.close(); } Future salvarErro(Object erro, StackTrace stackTrace, {String? fileName}) async { await _validarDiretorio(); final data = DateTime.now(); final ano = data.year; final mes = _doisDigitos(data.month); final dia = _doisDigitos(data.day); final fileDir = 'log/${fileName ?? '$dia$mes$ano.txt'}'; final file = File(fileDir); await file.writeAsString('${data.toIso8601String()} : $erro\n', mode: FileMode.append); await file.writeAsString('${data.toIso8601String()} : $stackTrace', mode: FileMode.append); } String _doisDigitos(int numero) { if (numero >= 10) return '$numero'; return '0$numero'; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/13032022.txt ================================================ 2022-03-13T22:18:37.172126 : {"error":true,"detail":"Invalid token"} 2022-03-13T22:18:37.172126 : #0 climaAtual (package:climatempo/api.dart:34:35) #1 registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10) #2 executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19) 2022-03-13T22:18:54.065327 : {"error":true,"detail":"Invalid token"} 2022-03-13T22:18:54.065327 : #0 climaAtual (package:climatempo/api.dart:34:35) #1 registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10) #2 executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19) 2022-03-13T22:53:09.878905 : type 'List' is not a subtype of type 'StackTrace' 2022-03-13T22:53:09.878905 : #0 salvarTempoIsolate. (package:climatempo/log.dart:19:32) #1 _rootRunUnary (dart:async/zone.dart:1442:13) #2 _CustomZone.runUnary (dart:async/zone.dart:1335:19) #3 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) #4 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11) #5 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7) #6 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19) #7 _StreamController._add (dart:async/stream_controller.dart:648:7) #8 _StreamController.add (dart:async/stream_controller.dart:596:5) #9 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) 2022-03-13T22:54:20.667082 : type 'List' is not a subtype of type 'StackTrace' 2022-03-13T22:54:20.667082 : #0 salvarTempoIsolate. (package:climatempo/log.dart:21:32) #1 _rootRunUnary (dart:async/zone.dart:1442:13) #2 _CustomZone.runUnary (dart:async/zone.dart:1335:19) #3 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) #4 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11) #5 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7) #6 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19) #7 _StreamController._add (dart:async/stream_controller.dart:648:7) #8 _StreamController.add (dart:async/stream_controller.dart:596:5) #9 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) 2022-03-13T22:55:14.830927 : type 'String' is not a subtype of type 'StackTrace' 2022-03-13T22:55:14.830927 : #0 salvarTempoIsolate. (package:climatempo/log.dart:20:42) #1 _rootRunUnary (dart:async/zone.dart:1442:13) #2 _CustomZone.runUnary (dart:async/zone.dart:1335:19) #3 _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7) #4 _BufferingStreamSubscription._sendData (dart:async/stream_impl.dart:341:11) #5 _BufferingStreamSubscription._add (dart:async/stream_impl.dart:271:7) #6 _SyncStreamControllerDispatch._sendData (dart:async/stream_controller.dart:774:19) #7 _StreamController._add (dart:async/stream_controller.dart:648:7) #8 _StreamController.add (dart:async/stream_controller.dart:596:5) #9 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/4915.txt ================================================ === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:45:02.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 22:18:07.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 === Cidade: Florianópolis, SC - BR 2022-03-13 22:18:07.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/cidades.txt ================================================ Id: 5049 - Nome: Abdon Batista - Estado: SC, País: BR Id: 5050 - Nome: Abelardo Luz - Estado: SC, País: BR Id: 5051 - Nome: Agrolândia - Estado: SC, País: BR Id: 5052 - Nome: Agronômica - Estado: SC, País: BR Id: 5053 - Nome: Água Doce - Estado: SC, País: BR Id: 5054 - Nome: Águas Brancas - Estado: SC, País: BR Id: 5055 - Nome: Águas de Chapecó - Estado: SC, País: BR Id: 5056 - Nome: Águas Frias - Estado: SC, País: BR Id: 5057 - Nome: Águas Mornas - Estado: SC, País: BR Id: 5058 - Nome: Alfredo Wagner - Estado: SC, País: BR Id: 5059 - Nome: Alto Bela Vista - Estado: SC, País: BR Id: 5060 - Nome: Anchieta - Estado: SC, País: BR Id: 5061 - Nome: Angelina - Estado: SC, País: BR Id: 5062 - Nome: Anita Garibaldi - Estado: SC, País: BR Id: 5063 - Nome: Anitápolis - Estado: SC, País: BR Id: 5064 - Nome: Anta Gorda - Estado: SC, País: BR Id: 5065 - Nome: Antônio Carlos - Estado: SC, País: BR Id: 5066 - Nome: Apiúna - Estado: SC, País: BR Id: 5067 - Nome: Arabutã - Estado: SC, País: BR Id: 5068 - Nome: Araquari - Estado: SC, País: BR Id: 5069 - Nome: Araranguá - Estado: SC, País: BR Id: 5070 - Nome: Armazém - Estado: SC, País: BR Id: 5071 - Nome: Arroio Trinta - Estado: SC, País: BR Id: 5072 - Nome: Arvoredo - Estado: SC, País: BR Id: 5073 - Nome: Ascurra - Estado: SC, País: BR Id: 5074 - Nome: Atalanta - Estado: SC, País: BR Id: 5075 - Nome: Aurora - Estado: SC, País: BR Id: 5076 - Nome: Balneário Arroio do Silva - Estado: SC, País: BR Id: 5077 - Nome: Balneário Barra do Sul - Estado: SC, País: BR Id: 5078 - Nome: Balneário Camboriú - Estado: SC, País: BR Id: 5080 - Nome: Balneário Gaivota - Estado: SC, País: BR Id: 4769 - Nome: Balneário Piçarras - Estado: SC, País: BR Id: 5081 - Nome: Bandeirante - Estado: SC, País: BR Id: 5082 - Nome: Barra Bonita - Estado: SC, País: BR Id: 5083 - Nome: Barra do Ibiraquera - Estado: SC, País: BR Id: 5084 - Nome: Barra do Saí - Estado: SC, País: BR Id: 5085 - Nome: Barra Velha - Estado: SC, País: BR Id: 5086 - Nome: Bela Vista do Toldo - Estado: SC, País: BR Id: 5087 - Nome: Belmonte - Estado: SC, País: BR Id: 5088 - Nome: Benedito Novo - Estado: SC, País: BR Id: 5089 - Nome: Biguaçu - Estado: SC, País: BR Id: 5090 - Nome: Blumenau - Estado: SC, País: BR Id: 5091 - Nome: Bocaina do Sul - Estado: SC, País: BR Id: 5092 - Nome: Bombinhas - Estado: SC, País: BR Id: 5093 - Nome: Bom Jardim da Serra - Estado: SC, País: BR Id: 5095 - Nome: Bom Jesus - Estado: SC, País: BR Id: 5094 - Nome: Bom Jesus do Oeste - Estado: SC, País: BR Id: 5096 - Nome: Bom Retiro - Estado: SC, País: BR Id: 5097 - Nome: Bom Sucesso - Estado: SC, País: BR Id: 5098 - Nome: Botuverá - Estado: SC, País: BR Id: 5099 - Nome: Braço do Norte - Estado: SC, País: BR Id: 5100 - Nome: Braço do Trombudo - Estado: SC, País: BR Id: 5101 - Nome: Brunópolis - Estado: SC, País: BR Id: 5102 - Nome: Brusque - Estado: SC, País: BR Id: 5103 - Nome: Caçador - Estado: SC, País: BR Id: 5104 - Nome: Caibi - Estado: SC, País: BR Id: 5105 - Nome: Calmon - Estado: SC, País: BR Id: 5106 - Nome: Camboriú - Estado: SC, País: BR Id: 5107 - Nome: Campina da Alegria - Estado: SC, País: BR Id: 5108 - Nome: Campo Alegre - Estado: SC, País: BR Id: 5109 - Nome: Campo Belo do Sul - Estado: SC, País: BR Id: 5110 - Nome: Campo Erê - Estado: SC, País: BR Id: 5111 - Nome: Campos Novos - Estado: SC, País: BR Id: 5112 - Nome: Canelinha - Estado: SC, País: BR Id: 5113 - Nome: Canoinhas - Estado: SC, País: BR Id: 5114 - Nome: Capão Alto - Estado: SC, País: BR Id: 5115 - Nome: Capinzal - Estado: SC, País: BR Id: 5116 - Nome: Capivari de Baixo - Estado: SC, País: BR Id: 5117 - Nome: Catanduvas - Estado: SC, País: BR Id: 5118 - Nome: Caxambu do Sul - Estado: SC, País: BR Id: 5119 - Nome: Celso Ramos - Estado: SC, País: BR Id: 4888 - Nome: Cerro Negro - Estado: SC, País: BR Id: 4889 - Nome: Chapadão do Lageado - Estado: SC, País: BR Id: 4890 - Nome: Chapecó - Estado: SC, País: BR Id: 4891 - Nome: Cocal do Sul - Estado: SC, País: BR Id: 4892 - Nome: Concórdia - Estado: SC, País: BR Id: 4893 - Nome: Cordilheira Alta - Estado: SC, País: BR Id: 4894 - Nome: Coronel Freitas - Estado: SC, País: BR Id: 4895 - Nome: Coronel Martins - Estado: SC, País: BR Id: 4896 - Nome: Correia Pinto - Estado: SC, País: BR Id: 4897 - Nome: Corupá - Estado: SC, País: BR Id: 4898 - Nome: Criciúma - Estado: SC, País: BR Id: 4899 - Nome: Cunha Porã - Estado: SC, País: BR Id: 4900 - Nome: Cunhataí - Estado: SC, País: BR Id: 4901 - Nome: Curitibanos - Estado: SC, País: BR Id: 4902 - Nome: Descanso - Estado: SC, País: BR Id: 4903 - Nome: Dionísio Cerqueira - Estado: SC, País: BR Id: 4904 - Nome: Dona Emma - Estado: SC, País: BR Id: 4905 - Nome: Doutor Pedrinho - Estado: SC, País: BR Id: 4906 - Nome: Enseada de Brito - Estado: SC, País: BR Id: 4907 - Nome: Entre Rios - Estado: SC, País: BR Id: 4909 - Nome: Ermo - Estado: SC, País: BR Id: 4912 - Nome: Erval Velho - Estado: SC, País: BR Id: 4913 - Nome: Faxinal dos Guedes - Estado: SC, País: BR Id: 4914 - Nome: Flor do Sertão - Estado: SC, País: BR Id: 4915 - Nome: Florianópolis - Estado: SC, País: BR Id: 4916 - Nome: Formosa do Sul - Estado: SC, País: BR Id: 4918 - Nome: Forquilhinha - Estado: SC, País: BR Id: 4919 - Nome: Fraiburgo - Estado: SC, País: BR Id: 4920 - Nome: Frei Rogério - Estado: SC, País: BR Id: 4921 - Nome: Galvão - Estado: SC, País: BR Id: 4922 - Nome: Garopaba - Estado: SC, País: BR Id: 4923 - Nome: Garuva - Estado: SC, País: BR Id: 4924 - Nome: Gaspar - Estado: SC, País: BR Id: 4925 - Nome: Governador Celso Ramos - Estado: SC, País: BR Id: 4927 - Nome: Grão Pará - Estado: SC, País: BR Id: 4928 - Nome: Gravatal - Estado: SC, País: BR Id: 4929 - Nome: Guabiruba - Estado: SC, País: BR Id: 4930 - Nome: Guaraciaba - Estado: SC, País: BR Id: 4931 - Nome: Guaramirim - Estado: SC, País: BR Id: 4932 - Nome: Guarda do Embaú - Estado: SC, País: BR Id: 4933 - Nome: Guarujá do Sul - Estado: SC, País: BR Id: 4935 - Nome: Guatá - Estado: SC, País: BR Id: 4934 - Nome: Guatambú - Estado: SC, País: BR Id: 4936 - Nome: Herval d'Oeste - Estado: SC, País: BR Id: 4937 - Nome: Ibiam - Estado: SC, País: BR Id: 4938 - Nome: Ibicaré - Estado: SC, País: BR Id: 4939 - Nome: Ibirama - Estado: SC, País: BR Id: 4940 - Nome: Içara - Estado: SC, País: BR Id: 4941 - Nome: Ilhota - Estado: SC, País: BR Id: 4942 - Nome: Imaruí - Estado: SC, País: BR Id: 4943 - Nome: Imbituba - Estado: SC, País: BR Id: 4944 - Nome: Imbuia - Estado: SC, País: BR Id: 4945 - Nome: Indaial - Estado: SC, País: BR Id: 4946 - Nome: Iomerê - Estado: SC, País: BR Id: 4947 - Nome: Ipira - Estado: SC, País: BR Id: 4948 - Nome: Ipoméia - Estado: SC, País: BR Id: 4949 - Nome: Iporã do Oeste - Estado: SC, País: BR Id: 4950 - Nome: Ipuaçu - Estado: SC, País: BR Id: 4951 - Nome: Ipumirim - Estado: SC, País: BR Id: 4952 - Nome: Iraceminha - Estado: SC, País: BR Id: 4953 - Nome: Irani - Estado: SC, País: BR Id: 4954 - Nome: Irati - Estado: SC, País: BR Id: 4955 - Nome: Irineópolis - Estado: SC, País: BR Id: 4962 - Nome: Itá - Estado: SC, País: BR Id: 4956 - Nome: Itaiópolis - Estado: SC, País: BR Id: 4957 - Nome: Itajaí - Estado: SC, País: BR Id: 4958 - Nome: Itapema - Estado: SC, País: BR Id: 4959 - Nome: Itapiranga - Estado: SC, País: BR Id: 4960 - Nome: Itapoá - Estado: SC, País: BR Id: 4961 - Nome: Itapocu - Estado: SC, País: BR Id: 4963 - Nome: Ituporanga - Estado: SC, País: BR Id: 4964 - Nome: Jaborá - Estado: SC, País: BR Id: 4965 - Nome: Jacinto Machado - Estado: SC, País: BR Id: 4966 - Nome: Jaguaruna - Estado: SC, País: BR Id: 4967 - Nome: Jaraguá do Sul - Estado: SC, País: BR Id: 4968 - Nome: Jardinópolis - Estado: SC, País: BR Id: 4969 - Nome: Joaçaba - Estado: SC, País: BR Id: 4970 - Nome: Joinville - Estado: SC, País: BR Id: 4971 - Nome: José Boiteux - Estado: SC, País: BR Id: 4972 - Nome: Jupiá - Estado: SC, País: BR Id: 4974 - Nome: Lacerdópolis - Estado: SC, País: BR Id: 4975 - Nome: Lages - Estado: SC, País: BR Id: 4976 - Nome: Laguna - Estado: SC, País: BR Id: 4977 - Nome: Lajeado Grande - Estado: SC, País: BR Id: 4978 - Nome: Laurentino - Estado: SC, País: BR Id: 4979 - Nome: Lauro Muller - Estado: SC, País: BR Id: 4980 - Nome: Lebon Régis - Estado: SC, País: BR Id: 4981 - Nome: Leoberto Leal - Estado: SC, País: BR Id: 4982 - Nome: Lindóia do Sul - Estado: SC, País: BR Id: 4983 - Nome: Lontras - Estado: SC, País: BR Id: 4984 - Nome: Luiz Alves - Estado: SC, País: BR Id: 4985 - Nome: Luzerna - Estado: SC, País: BR Id: 4986 - Nome: Macieira - Estado: SC, País: BR Id: 4987 - Nome: Mafra - Estado: SC, País: BR Id: 4988 - Nome: Major Gercino - Estado: SC, País: BR Id: 4989 - Nome: Major Vieira - Estado: SC, País: BR Id: 4990 - Nome: Maracajá - Estado: SC, País: BR Id: 4991 - Nome: Maravilha - Estado: SC, País: BR Id: 4992 - Nome: Marema - Estado: SC, País: BR Id: 4993 - Nome: Massaranduba - Estado: SC, País: BR Id: 4994 - Nome: Matos Costa - Estado: SC, País: BR Id: 4995 - Nome: Meleiro - Estado: SC, País: BR Id: 4996 - Nome: Mirim Doce - Estado: SC, País: BR Id: 4997 - Nome: Modelo - Estado: SC, País: BR Id: 4998 - Nome: Mondaí - Estado: SC, País: BR Id: 4999 - Nome: Monte Carlo - Estado: SC, País: BR Id: 5000 - Nome: Monte Castelo - Estado: SC, País: BR Id: 5001 - Nome: Morro da Fumaça - Estado: SC, País: BR Id: 5002 - Nome: Morro Grande - Estado: SC, País: BR Id: 5003 - Nome: Navegantes - Estado: SC, País: BR Id: 5004 - Nome: Nova Erechim - Estado: SC, País: BR Id: 5005 - Nome: Nova Itaberaba - Estado: SC, País: BR Id: 5006 - Nome: Nova Trento - Estado: SC, País: BR Id: 5007 - Nome: Nova Veneza - Estado: SC, País: BR Id: 4678 - Nome: Novo Horizonte - Estado: SC, País: BR Id: 4679 - Nome: Orleans - Estado: SC, País: BR Id: 4680 - Nome: Otacílio Costa - Estado: SC, País: BR Id: 4681 - Nome: Ouro - Estado: SC, País: BR Id: 4682 - Nome: Ouro Verde - Estado: SC, País: BR Id: 4683 - Nome: Paial - Estado: SC, País: BR Id: 4648 - Nome: Painel - Estado: SC, País: BR Id: 4756 - Nome: Palhoça - Estado: SC, País: BR Id: 4757 - Nome: Palma Sola - Estado: SC, País: BR Id: 4758 - Nome: Palmeira - Estado: SC, País: BR Id: 4759 - Nome: Palmitos - Estado: SC, País: BR Id: 4760 - Nome: Papanduva - Estado: SC, País: BR Id: 4761 - Nome: Paraíso - Estado: SC, País: BR Id: 4762 - Nome: Passo de Torres - Estado: SC, País: BR Id: 4763 - Nome: Passos Maia - Estado: SC, País: BR Id: 4764 - Nome: Paulo Lopes - Estado: SC, País: BR Id: 4765 - Nome: Pedras Grandes - Estado: SC, País: BR Id: 4766 - Nome: Penha - Estado: SC, País: BR Id: 4767 - Nome: Peritiba - Estado: SC, País: BR Id: 4768 - Nome: Petrolândia - Estado: SC, País: BR Id: 4770 - Nome: Pinhalzinho - Estado: SC, País: BR Id: 4771 - Nome: Pinheiro Preto - Estado: SC, País: BR Id: 4772 - Nome: Piratuba - Estado: SC, País: BR Id: 4773 - Nome: Planalto Alegre - Estado: SC, País: BR Id: 4774 - Nome: Pomerode - Estado: SC, País: BR Id: 4776 - Nome: Ponte Alta - Estado: SC, País: BR Id: 4775 - Nome: Ponte Alta do Norte - Estado: SC, País: BR Id: 4777 - Nome: Ponte Serrada - Estado: SC, País: BR Id: 4778 - Nome: Porto Belo - Estado: SC, País: BR Id: 4779 - Nome: Porto União - Estado: SC, País: BR Id: 4780 - Nome: Pouso Redondo - Estado: SC, País: BR Id: 4781 - Nome: Praia do Santinho - Estado: SC, País: BR Id: 4782 - Nome: Praia Grande - Estado: SC, País: BR Id: 4783 - Nome: Presidente Castelo Branco - Estado: SC, País: BR Id: 4784 - Nome: Presidente Getúlio - Estado: SC, País: BR Id: 4785 - Nome: Presidente Nereu - Estado: SC, País: BR Id: 4811 - Nome: Princesa - Estado: SC, País: BR Id: 4812 - Nome: Quilombo - Estado: SC, País: BR Id: 4813 - Nome: Rancho Queimado - Estado: SC, País: BR Id: 4814 - Nome: Rio das Antas - Estado: SC, País: BR Id: 4815 - Nome: Rio do Campo - Estado: SC, País: BR Id: 4816 - Nome: Rio d'Oeste - Estado: SC, País: BR Id: 4817 - Nome: Rio dos Cedros - Estado: SC, País: BR Id: 4818 - Nome: Rio do Sul - Estado: SC, País: BR Id: 4819 - Nome: Rio Fortuna - Estado: SC, País: BR Id: 4820 - Nome: Rio Negrinho - Estado: SC, País: BR Id: 4821 - Nome: Rio Rufino - Estado: SC, País: BR Id: 4822 - Nome: Riqueza - Estado: SC, País: BR Id: 4823 - Nome: Rodeio - Estado: SC, País: BR Id: 4824 - Nome: Romelândia - Estado: SC, País: BR Id: 4825 - Nome: Salete - Estado: SC, País: BR Id: 4826 - Nome: Saltinho - Estado: SC, País: BR Id: 4827 - Nome: Salto Veloso - Estado: SC, País: BR Id: 4828 - Nome: Sangão - Estado: SC, País: BR Id: 4829 - Nome: Santa Cecília - Estado: SC, País: BR Id: 4830 - Nome: Santa Helena - Estado: SC, País: BR Id: 4831 - Nome: Santa Rosa de Lima - Estado: SC, País: BR Id: 4832 - Nome: Santa Rosa do Sul - Estado: SC, País: BR Id: 4834 - Nome: Santa Terezinha - Estado: SC, País: BR Id: 4833 - Nome: Santa Terezinha do Progresso - Estado: SC, País: BR Id: 4835 - Nome: Santiago do Sul - Estado: SC, País: BR Id: 4836 - Nome: Santo Amaro da Imperatriz - Estado: SC, País: BR Id: 4837 - Nome: São Bento do Sul - Estado: SC, País: BR Id: 4838 - Nome: São Bernardino - Estado: SC, País: BR Id: 4839 - Nome: São Bonifácio - Estado: SC, País: BR Id: 4840 - Nome: São Carlos - Estado: SC, País: BR Id: 4841 - Nome: São Cristovão do Sul - Estado: SC, País: BR Id: 4842 - Nome: São Domingos - Estado: SC, País: BR Id: 4843 - Nome: São Francisco do Sul - Estado: SC, País: BR Id: 4844 - Nome: São João Batista - Estado: SC, País: BR Id: 4845 - Nome: São João do Itaperiú - Estado: SC, País: BR Id: 4846 - Nome: São João do Oeste - Estado: SC, País: BR Id: 4847 - Nome: São João do Sul - Estado: SC, País: BR Id: 4848 - Nome: São Joaquim - Estado: SC, País: BR Id: 4851 - Nome: São José - Estado: SC, País: BR Id: 4849 - Nome: São José do Cedro - Estado: SC, País: BR Id: 4850 - Nome: São José do Cerrito - Estado: SC, País: BR Id: 4852 - Nome: São Lourenço d'Oeste - Estado: SC, País: BR Id: 4853 - Nome: São Ludgero - Estado: SC, País: BR Id: 4854 - Nome: São Martinho - Estado: SC, País: BR Id: 4855 - Nome: São Miguel da Boa Vista - Estado: SC, País: BR Id: 4856 - Nome: São Miguel do Oeste - Estado: SC, País: BR Id: 4857 - Nome: São Pedro de Alcântara - Estado: SC, País: BR Id: 4858 - Nome: Saudades - Estado: SC, País: BR Id: 85793 - Nome: SBCH - Estado: SC, País: BR Id: 74832 - Nome: SBFL - Estado: SC, País: BR Id: 74833 - Nome: SBJV - Estado: SC, País: BR Id: 85285 - Nome: SBNF - Estado: SC, País: BR Id: 4859 - Nome: Schroeder - Estado: SC, País: BR Id: 4860 - Nome: Seara - Estado: SC, País: BR Id: 4861 - Nome: Serra Alta - Estado: SC, País: BR Id: 4862 - Nome: Siderópolis - Estado: SC, País: BR Id: 4863 - Nome: Sombrio - Estado: SC, País: BR Id: 4864 - Nome: Sul Brasil - Estado: SC, País: BR Id: 4865 - Nome: Taió - Estado: SC, País: BR Id: 4866 - Nome: Tangará - Estado: SC, País: BR Id: 4867 - Nome: Tigrinhos - Estado: SC, País: BR Id: 4868 - Nome: Tijucas - Estado: SC, País: BR Id: 4869 - Nome: Timbé do Sul - Estado: SC, País: BR Id: 4871 - Nome: Timbó - Estado: SC, País: BR Id: 4870 - Nome: Timbó Grande - Estado: SC, País: BR Id: 4872 - Nome: Três Barras - Estado: SC, País: BR Id: 4875 - Nome: Treviso - Estado: SC, País: BR Id: 4878 - Nome: Treze de Maio - Estado: SC, País: BR Id: 4879 - Nome: Treze Tílias - Estado: SC, País: BR Id: 4880 - Nome: Trombudo Central - Estado: SC, País: BR Id: 4881 - Nome: Tubarão - Estado: SC, País: BR Id: 4882 - Nome: Tunápolis - Estado: SC, País: BR Id: 4883 - Nome: Turvo - Estado: SC, País: BR Id: 4884 - Nome: União do Oeste - Estado: SC, País: BR Id: 4885 - Nome: Urubici - Estado: SC, País: BR Id: 4886 - Nome: Urupema - Estado: SC, País: BR Id: 4887 - Nome: Urussanga - Estado: SC, País: BR Id: 4482 - Nome: Vargeão - Estado: SC, País: BR Id: 4484 - Nome: Vargem - Estado: SC, País: BR Id: 4483 - Nome: Vargem Bonita - Estado: SC, País: BR Id: 4485 - Nome: Vidal Ramos - Estado: SC, País: BR Id: 4486 - Nome: Videira - Estado: SC, País: BR Id: 4487 - Nome: Vitor Meireles - Estado: SC, País: BR Id: 4488 - Nome: Witmarsum - Estado: SC, País: BR Id: 4489 - Nome: Xanxerê - Estado: SC, País: BR Id: 4490 - Nome: Xavantina - Estado: SC, País: BR Id: 4491 - Nome: Xaxim - Estado: SC, País: BR Id: 4492 - Nome: Zortéa - Estado: SC, País: BR ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/log/io.txt ================================================ 2022-03-13T22:55:49.667759 : Erro ao salvar tempo 2022-03-13T22:55:49.667759 : #0 salvarTempo (package:climatempo/log.dart:36:3) #1 _delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:300:17) #2 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_erros/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/bin/climatempo.dart ================================================ import 'dart:async'; import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/log.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) { runZonedGuarded(() { executar(args); }, (e, s) { print(e); print(s); salvarErro(e, s); }); } Future executar(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); if (comando['salvar']) await salvarCidadesIsolate(cidades); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); if (comando['salvar']) await salvarTempoIsolate(tempo); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/log.dart ================================================ import 'dart:async'; import 'dart:io'; import 'dart:isolate'; import 'package:climatempo/model/clima_tempo.dart'; import 'model/cidade.dart'; Future _validarDiretorio() async { final dir = Directory('log'); if (!(await dir.exists())) { await dir.create(); } } Future salvarTempoIsolate(ClimaTempo climaTempo) async { final isolate = await Isolate.spawn(salvarTempo, climaTempo); _registrarCallbackFinalizacao(isolate); } Future salvarTempo(ClimaTempo climaTempo) async { runZonedGuarded(() async { await _validarDiretorio(); final file = File('log/${climaTempo.cidade.id}.txt'); await file.writeAsString('===\n$climaTempo', mode: FileMode.append); }, (e, s) { print(e); print(s); salvarErro(e, s, fileName: 'io.txt'); }); } void _registrarCallbackFinalizacao(Isolate isolate) { final receivePort = ReceivePort(); receivePort.listen((mensagem) { print(mensagem); receivePort.close(); }); isolate.addOnExitListener(receivePort.sendPort, response: 'Arquivo salvo com sucesso!'); } Future salvarCidadesIsolate(List cidades) async { final isolate = await Isolate.spawn(salvarCidades, cidades); _registrarCallbackFinalizacao(isolate); } Future salvarCidades(List cidades) async { runZonedGuarded(() async { await _validarDiretorio(); final file = File('log/cidades.txt'); final sink = file.openWrite(mode: FileMode.write); cidades.forEach((c) => sink.writeln(c)); await sink.flush(); await sink.close(); }, (e, s) { print(e); print(s); salvarErro(e, s, fileName: 'io.txt'); }); } Future salvarErro(Object erro, StackTrace stackTrace, {String? fileName}) async { await _validarDiretorio(); final data = DateTime.now(); final ano = data.year; final mes = _doisDigitos(data.month); final dia = _doisDigitos(data.day); final fileDir = 'log/${fileName ?? '$dia$mes$ano.txt'}'; final file = File(fileDir); await file.writeAsString('${data.toIso8601String()} : $erro\n', mode: FileMode.append); await file.writeAsString('${data.toIso8601String()} : $stackTrace', mode: FileMode.append); } String _doisDigitos(int numero) { if (numero >= 10) return '$numero'; return '0$numero'; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/13032022.txt ================================================ 2022-03-13T22:18:37.172126 : {"error":true,"detail":"Invalid token"} 2022-03-13T22:18:37.172126 : #0 climaAtual (package:climatempo/api.dart:34:35) #1 registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10) #2 executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19) 2022-03-13T22:18:54.065327 : {"error":true,"detail":"Invalid token"} 2022-03-13T22:18:54.065327 : #0 climaAtual (package:climatempo/api.dart:34:35) #1 registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10) #2 executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19) ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/4915.txt ================================================ === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:45:02.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 22:18:07.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 === Cidade: Florianópolis, SC - BR 2022-03-13 22:18:07.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/cidades.txt ================================================ Id: 5049 - Nome: Abdon Batista - Estado: SC, País: BR Id: 5050 - Nome: Abelardo Luz - Estado: SC, País: BR Id: 5051 - Nome: Agrolândia - Estado: SC, País: BR Id: 5052 - Nome: Agronômica - Estado: SC, País: BR Id: 5053 - Nome: Água Doce - Estado: SC, País: BR Id: 5054 - Nome: Águas Brancas - Estado: SC, País: BR Id: 5055 - Nome: Águas de Chapecó - Estado: SC, País: BR Id: 5056 - Nome: Águas Frias - Estado: SC, País: BR Id: 5057 - Nome: Águas Mornas - Estado: SC, País: BR Id: 5058 - Nome: Alfredo Wagner - Estado: SC, País: BR Id: 5059 - Nome: Alto Bela Vista - Estado: SC, País: BR Id: 5060 - Nome: Anchieta - Estado: SC, País: BR Id: 5061 - Nome: Angelina - Estado: SC, País: BR Id: 5062 - Nome: Anita Garibaldi - Estado: SC, País: BR Id: 5063 - Nome: Anitápolis - Estado: SC, País: BR Id: 5064 - Nome: Anta Gorda - Estado: SC, País: BR Id: 5065 - Nome: Antônio Carlos - Estado: SC, País: BR Id: 5066 - Nome: Apiúna - Estado: SC, País: BR Id: 5067 - Nome: Arabutã - Estado: SC, País: BR Id: 5068 - Nome: Araquari - Estado: SC, País: BR Id: 5069 - Nome: Araranguá - Estado: SC, País: BR Id: 5070 - Nome: Armazém - Estado: SC, País: BR Id: 5071 - Nome: Arroio Trinta - Estado: SC, País: BR Id: 5072 - Nome: Arvoredo - Estado: SC, País: BR Id: 5073 - Nome: Ascurra - Estado: SC, País: BR Id: 5074 - Nome: Atalanta - Estado: SC, País: BR Id: 5075 - Nome: Aurora - Estado: SC, País: BR Id: 5076 - Nome: Balneário Arroio do Silva - Estado: SC, País: BR Id: 5077 - Nome: Balneário Barra do Sul - Estado: SC, País: BR Id: 5078 - Nome: Balneário Camboriú - Estado: SC, País: BR Id: 5080 - Nome: Balneário Gaivota - Estado: SC, País: BR Id: 4769 - Nome: Balneário Piçarras - Estado: SC, País: BR Id: 5081 - Nome: Bandeirante - Estado: SC, País: BR Id: 5082 - Nome: Barra Bonita - Estado: SC, País: BR Id: 5083 - Nome: Barra do Ibiraquera - Estado: SC, País: BR Id: 5084 - Nome: Barra do Saí - Estado: SC, País: BR Id: 5085 - Nome: Barra Velha - Estado: SC, País: BR Id: 5086 - Nome: Bela Vista do Toldo - Estado: SC, País: BR Id: 5087 - Nome: Belmonte - Estado: SC, País: BR Id: 5088 - Nome: Benedito Novo - Estado: SC, País: BR Id: 5089 - Nome: Biguaçu - Estado: SC, País: BR Id: 5090 - Nome: Blumenau - Estado: SC, País: BR Id: 5091 - Nome: Bocaina do Sul - Estado: SC, País: BR Id: 5092 - Nome: Bombinhas - Estado: SC, País: BR Id: 5093 - Nome: Bom Jardim da Serra - Estado: SC, País: BR Id: 5095 - Nome: Bom Jesus - Estado: SC, País: BR Id: 5094 - Nome: Bom Jesus do Oeste - Estado: SC, País: BR Id: 5096 - Nome: Bom Retiro - Estado: SC, País: BR Id: 5097 - Nome: Bom Sucesso - Estado: SC, País: BR Id: 5098 - Nome: Botuverá - Estado: SC, País: BR Id: 5099 - Nome: Braço do Norte - Estado: SC, País: BR Id: 5100 - Nome: Braço do Trombudo - Estado: SC, País: BR Id: 5101 - Nome: Brunópolis - Estado: SC, País: BR Id: 5102 - Nome: Brusque - Estado: SC, País: BR Id: 5103 - Nome: Caçador - Estado: SC, País: BR Id: 5104 - Nome: Caibi - Estado: SC, País: BR Id: 5105 - Nome: Calmon - Estado: SC, País: BR Id: 5106 - Nome: Camboriú - Estado: SC, País: BR Id: 5107 - Nome: Campina da Alegria - Estado: SC, País: BR Id: 5108 - Nome: Campo Alegre - Estado: SC, País: BR Id: 5109 - Nome: Campo Belo do Sul - Estado: SC, País: BR Id: 5110 - Nome: Campo Erê - Estado: SC, País: BR Id: 5111 - Nome: Campos Novos - Estado: SC, País: BR Id: 5112 - Nome: Canelinha - Estado: SC, País: BR Id: 5113 - Nome: Canoinhas - Estado: SC, País: BR Id: 5114 - Nome: Capão Alto - Estado: SC, País: BR Id: 5115 - Nome: Capinzal - Estado: SC, País: BR Id: 5116 - Nome: Capivari de Baixo - Estado: SC, País: BR Id: 5117 - Nome: Catanduvas - Estado: SC, País: BR Id: 5118 - Nome: Caxambu do Sul - Estado: SC, País: BR Id: 5119 - Nome: Celso Ramos - Estado: SC, País: BR Id: 4888 - Nome: Cerro Negro - Estado: SC, País: BR Id: 4889 - Nome: Chapadão do Lageado - Estado: SC, País: BR Id: 4890 - Nome: Chapecó - Estado: SC, País: BR Id: 4891 - Nome: Cocal do Sul - Estado: SC, País: BR Id: 4892 - Nome: Concórdia - Estado: SC, País: BR Id: 4893 - Nome: Cordilheira Alta - Estado: SC, País: BR Id: 4894 - Nome: Coronel Freitas - Estado: SC, País: BR Id: 4895 - Nome: Coronel Martins - Estado: SC, País: BR Id: 4896 - Nome: Correia Pinto - Estado: SC, País: BR Id: 4897 - Nome: Corupá - Estado: SC, País: BR Id: 4898 - Nome: Criciúma - Estado: SC, País: BR Id: 4899 - Nome: Cunha Porã - Estado: SC, País: BR Id: 4900 - Nome: Cunhataí - Estado: SC, País: BR Id: 4901 - Nome: Curitibanos - Estado: SC, País: BR Id: 4902 - Nome: Descanso - Estado: SC, País: BR Id: 4903 - Nome: Dionísio Cerqueira - Estado: SC, País: BR Id: 4904 - Nome: Dona Emma - Estado: SC, País: BR Id: 4905 - Nome: Doutor Pedrinho - Estado: SC, País: BR Id: 4906 - Nome: Enseada de Brito - Estado: SC, País: BR Id: 4907 - Nome: Entre Rios - Estado: SC, País: BR Id: 4909 - Nome: Ermo - Estado: SC, País: BR Id: 4912 - Nome: Erval Velho - Estado: SC, País: BR Id: 4913 - Nome: Faxinal dos Guedes - Estado: SC, País: BR Id: 4914 - Nome: Flor do Sertão - Estado: SC, País: BR Id: 4915 - Nome: Florianópolis - Estado: SC, País: BR Id: 4916 - Nome: Formosa do Sul - Estado: SC, País: BR Id: 4918 - Nome: Forquilhinha - Estado: SC, País: BR Id: 4919 - Nome: Fraiburgo - Estado: SC, País: BR Id: 4920 - Nome: Frei Rogério - Estado: SC, País: BR Id: 4921 - Nome: Galvão - Estado: SC, País: BR Id: 4922 - Nome: Garopaba - Estado: SC, País: BR Id: 4923 - Nome: Garuva - Estado: SC, País: BR Id: 4924 - Nome: Gaspar - Estado: SC, País: BR Id: 4925 - Nome: Governador Celso Ramos - Estado: SC, País: BR Id: 4927 - Nome: Grão Pará - Estado: SC, País: BR Id: 4928 - Nome: Gravatal - Estado: SC, País: BR Id: 4929 - Nome: Guabiruba - Estado: SC, País: BR Id: 4930 - Nome: Guaraciaba - Estado: SC, País: BR Id: 4931 - Nome: Guaramirim - Estado: SC, País: BR Id: 4932 - Nome: Guarda do Embaú - Estado: SC, País: BR Id: 4933 - Nome: Guarujá do Sul - Estado: SC, País: BR Id: 4935 - Nome: Guatá - Estado: SC, País: BR Id: 4934 - Nome: Guatambú - Estado: SC, País: BR Id: 4936 - Nome: Herval d'Oeste - Estado: SC, País: BR Id: 4937 - Nome: Ibiam - Estado: SC, País: BR Id: 4938 - Nome: Ibicaré - Estado: SC, País: BR Id: 4939 - Nome: Ibirama - Estado: SC, País: BR Id: 4940 - Nome: Içara - Estado: SC, País: BR Id: 4941 - Nome: Ilhota - Estado: SC, País: BR Id: 4942 - Nome: Imaruí - Estado: SC, País: BR Id: 4943 - Nome: Imbituba - Estado: SC, País: BR Id: 4944 - Nome: Imbuia - Estado: SC, País: BR Id: 4945 - Nome: Indaial - Estado: SC, País: BR Id: 4946 - Nome: Iomerê - Estado: SC, País: BR Id: 4947 - Nome: Ipira - Estado: SC, País: BR Id: 4948 - Nome: Ipoméia - Estado: SC, País: BR Id: 4949 - Nome: Iporã do Oeste - Estado: SC, País: BR Id: 4950 - Nome: Ipuaçu - Estado: SC, País: BR Id: 4951 - Nome: Ipumirim - Estado: SC, País: BR Id: 4952 - Nome: Iraceminha - Estado: SC, País: BR Id: 4953 - Nome: Irani - Estado: SC, País: BR Id: 4954 - Nome: Irati - Estado: SC, País: BR Id: 4955 - Nome: Irineópolis - Estado: SC, País: BR Id: 4962 - Nome: Itá - Estado: SC, País: BR Id: 4956 - Nome: Itaiópolis - Estado: SC, País: BR Id: 4957 - Nome: Itajaí - Estado: SC, País: BR Id: 4958 - Nome: Itapema - Estado: SC, País: BR Id: 4959 - Nome: Itapiranga - Estado: SC, País: BR Id: 4960 - Nome: Itapoá - Estado: SC, País: BR Id: 4961 - Nome: Itapocu - Estado: SC, País: BR Id: 4963 - Nome: Ituporanga - Estado: SC, País: BR Id: 4964 - Nome: Jaborá - Estado: SC, País: BR Id: 4965 - Nome: Jacinto Machado - Estado: SC, País: BR Id: 4966 - Nome: Jaguaruna - Estado: SC, País: BR Id: 4967 - Nome: Jaraguá do Sul - Estado: SC, País: BR Id: 4968 - Nome: Jardinópolis - Estado: SC, País: BR Id: 4969 - Nome: Joaçaba - Estado: SC, País: BR Id: 4970 - Nome: Joinville - Estado: SC, País: BR Id: 4971 - Nome: José Boiteux - Estado: SC, País: BR Id: 4972 - Nome: Jupiá - Estado: SC, País: BR Id: 4974 - Nome: Lacerdópolis - Estado: SC, País: BR Id: 4975 - Nome: Lages - Estado: SC, País: BR Id: 4976 - Nome: Laguna - Estado: SC, País: BR Id: 4977 - Nome: Lajeado Grande - Estado: SC, País: BR Id: 4978 - Nome: Laurentino - Estado: SC, País: BR Id: 4979 - Nome: Lauro Muller - Estado: SC, País: BR Id: 4980 - Nome: Lebon Régis - Estado: SC, País: BR Id: 4981 - Nome: Leoberto Leal - Estado: SC, País: BR Id: 4982 - Nome: Lindóia do Sul - Estado: SC, País: BR Id: 4983 - Nome: Lontras - Estado: SC, País: BR Id: 4984 - Nome: Luiz Alves - Estado: SC, País: BR Id: 4985 - Nome: Luzerna - Estado: SC, País: BR Id: 4986 - Nome: Macieira - Estado: SC, País: BR Id: 4987 - Nome: Mafra - Estado: SC, País: BR Id: 4988 - Nome: Major Gercino - Estado: SC, País: BR Id: 4989 - Nome: Major Vieira - Estado: SC, País: BR Id: 4990 - Nome: Maracajá - Estado: SC, País: BR Id: 4991 - Nome: Maravilha - Estado: SC, País: BR Id: 4992 - Nome: Marema - Estado: SC, País: BR Id: 4993 - Nome: Massaranduba - Estado: SC, País: BR Id: 4994 - Nome: Matos Costa - Estado: SC, País: BR Id: 4995 - Nome: Meleiro - Estado: SC, País: BR Id: 4996 - Nome: Mirim Doce - Estado: SC, País: BR Id: 4997 - Nome: Modelo - Estado: SC, País: BR Id: 4998 - Nome: Mondaí - Estado: SC, País: BR Id: 4999 - Nome: Monte Carlo - Estado: SC, País: BR Id: 5000 - Nome: Monte Castelo - Estado: SC, País: BR Id: 5001 - Nome: Morro da Fumaça - Estado: SC, País: BR Id: 5002 - Nome: Morro Grande - Estado: SC, País: BR Id: 5003 - Nome: Navegantes - Estado: SC, País: BR Id: 5004 - Nome: Nova Erechim - Estado: SC, País: BR Id: 5005 - Nome: Nova Itaberaba - Estado: SC, País: BR Id: 5006 - Nome: Nova Trento - Estado: SC, País: BR Id: 5007 - Nome: Nova Veneza - Estado: SC, País: BR Id: 4678 - Nome: Novo Horizonte - Estado: SC, País: BR Id: 4679 - Nome: Orleans - Estado: SC, País: BR Id: 4680 - Nome: Otacílio Costa - Estado: SC, País: BR Id: 4681 - Nome: Ouro - Estado: SC, País: BR Id: 4682 - Nome: Ouro Verde - Estado: SC, País: BR Id: 4683 - Nome: Paial - Estado: SC, País: BR Id: 4648 - Nome: Painel - Estado: SC, País: BR Id: 4756 - Nome: Palhoça - Estado: SC, País: BR Id: 4757 - Nome: Palma Sola - Estado: SC, País: BR Id: 4758 - Nome: Palmeira - Estado: SC, País: BR Id: 4759 - Nome: Palmitos - Estado: SC, País: BR Id: 4760 - Nome: Papanduva - Estado: SC, País: BR Id: 4761 - Nome: Paraíso - Estado: SC, País: BR Id: 4762 - Nome: Passo de Torres - Estado: SC, País: BR Id: 4763 - Nome: Passos Maia - Estado: SC, País: BR Id: 4764 - Nome: Paulo Lopes - Estado: SC, País: BR Id: 4765 - Nome: Pedras Grandes - Estado: SC, País: BR Id: 4766 - Nome: Penha - Estado: SC, País: BR Id: 4767 - Nome: Peritiba - Estado: SC, País: BR Id: 4768 - Nome: Petrolândia - Estado: SC, País: BR Id: 4770 - Nome: Pinhalzinho - Estado: SC, País: BR Id: 4771 - Nome: Pinheiro Preto - Estado: SC, País: BR Id: 4772 - Nome: Piratuba - Estado: SC, País: BR Id: 4773 - Nome: Planalto Alegre - Estado: SC, País: BR Id: 4774 - Nome: Pomerode - Estado: SC, País: BR Id: 4776 - Nome: Ponte Alta - Estado: SC, País: BR Id: 4775 - Nome: Ponte Alta do Norte - Estado: SC, País: BR Id: 4777 - Nome: Ponte Serrada - Estado: SC, País: BR Id: 4778 - Nome: Porto Belo - Estado: SC, País: BR Id: 4779 - Nome: Porto União - Estado: SC, País: BR Id: 4780 - Nome: Pouso Redondo - Estado: SC, País: BR Id: 4781 - Nome: Praia do Santinho - Estado: SC, País: BR Id: 4782 - Nome: Praia Grande - Estado: SC, País: BR Id: 4783 - Nome: Presidente Castelo Branco - Estado: SC, País: BR Id: 4784 - Nome: Presidente Getúlio - Estado: SC, País: BR Id: 4785 - Nome: Presidente Nereu - Estado: SC, País: BR Id: 4811 - Nome: Princesa - Estado: SC, País: BR Id: 4812 - Nome: Quilombo - Estado: SC, País: BR Id: 4813 - Nome: Rancho Queimado - Estado: SC, País: BR Id: 4814 - Nome: Rio das Antas - Estado: SC, País: BR Id: 4815 - Nome: Rio do Campo - Estado: SC, País: BR Id: 4816 - Nome: Rio d'Oeste - Estado: SC, País: BR Id: 4817 - Nome: Rio dos Cedros - Estado: SC, País: BR Id: 4818 - Nome: Rio do Sul - Estado: SC, País: BR Id: 4819 - Nome: Rio Fortuna - Estado: SC, País: BR Id: 4820 - Nome: Rio Negrinho - Estado: SC, País: BR Id: 4821 - Nome: Rio Rufino - Estado: SC, País: BR Id: 4822 - Nome: Riqueza - Estado: SC, País: BR Id: 4823 - Nome: Rodeio - Estado: SC, País: BR Id: 4824 - Nome: Romelândia - Estado: SC, País: BR Id: 4825 - Nome: Salete - Estado: SC, País: BR Id: 4826 - Nome: Saltinho - Estado: SC, País: BR Id: 4827 - Nome: Salto Veloso - Estado: SC, País: BR Id: 4828 - Nome: Sangão - Estado: SC, País: BR Id: 4829 - Nome: Santa Cecília - Estado: SC, País: BR Id: 4830 - Nome: Santa Helena - Estado: SC, País: BR Id: 4831 - Nome: Santa Rosa de Lima - Estado: SC, País: BR Id: 4832 - Nome: Santa Rosa do Sul - Estado: SC, País: BR Id: 4834 - Nome: Santa Terezinha - Estado: SC, País: BR Id: 4833 - Nome: Santa Terezinha do Progresso - Estado: SC, País: BR Id: 4835 - Nome: Santiago do Sul - Estado: SC, País: BR Id: 4836 - Nome: Santo Amaro da Imperatriz - Estado: SC, País: BR Id: 4837 - Nome: São Bento do Sul - Estado: SC, País: BR Id: 4838 - Nome: São Bernardino - Estado: SC, País: BR Id: 4839 - Nome: São Bonifácio - Estado: SC, País: BR Id: 4840 - Nome: São Carlos - Estado: SC, País: BR Id: 4841 - Nome: São Cristovão do Sul - Estado: SC, País: BR Id: 4842 - Nome: São Domingos - Estado: SC, País: BR Id: 4843 - Nome: São Francisco do Sul - Estado: SC, País: BR Id: 4844 - Nome: São João Batista - Estado: SC, País: BR Id: 4845 - Nome: São João do Itaperiú - Estado: SC, País: BR Id: 4846 - Nome: São João do Oeste - Estado: SC, País: BR Id: 4847 - Nome: São João do Sul - Estado: SC, País: BR Id: 4848 - Nome: São Joaquim - Estado: SC, País: BR Id: 4851 - Nome: São José - Estado: SC, País: BR Id: 4849 - Nome: São José do Cedro - Estado: SC, País: BR Id: 4850 - Nome: São José do Cerrito - Estado: SC, País: BR Id: 4852 - Nome: São Lourenço d'Oeste - Estado: SC, País: BR Id: 4853 - Nome: São Ludgero - Estado: SC, País: BR Id: 4854 - Nome: São Martinho - Estado: SC, País: BR Id: 4855 - Nome: São Miguel da Boa Vista - Estado: SC, País: BR Id: 4856 - Nome: São Miguel do Oeste - Estado: SC, País: BR Id: 4857 - Nome: São Pedro de Alcântara - Estado: SC, País: BR Id: 4858 - Nome: Saudades - Estado: SC, País: BR Id: 85793 - Nome: SBCH - Estado: SC, País: BR Id: 74832 - Nome: SBFL - Estado: SC, País: BR Id: 74833 - Nome: SBJV - Estado: SC, País: BR Id: 85285 - Nome: SBNF - Estado: SC, País: BR Id: 4859 - Nome: Schroeder - Estado: SC, País: BR Id: 4860 - Nome: Seara - Estado: SC, País: BR Id: 4861 - Nome: Serra Alta - Estado: SC, País: BR Id: 4862 - Nome: Siderópolis - Estado: SC, País: BR Id: 4863 - Nome: Sombrio - Estado: SC, País: BR Id: 4864 - Nome: Sul Brasil - Estado: SC, País: BR Id: 4865 - Nome: Taió - Estado: SC, País: BR Id: 4866 - Nome: Tangará - Estado: SC, País: BR Id: 4867 - Nome: Tigrinhos - Estado: SC, País: BR Id: 4868 - Nome: Tijucas - Estado: SC, País: BR Id: 4869 - Nome: Timbé do Sul - Estado: SC, País: BR Id: 4871 - Nome: Timbó - Estado: SC, País: BR Id: 4870 - Nome: Timbó Grande - Estado: SC, País: BR Id: 4872 - Nome: Três Barras - Estado: SC, País: BR Id: 4875 - Nome: Treviso - Estado: SC, País: BR Id: 4878 - Nome: Treze de Maio - Estado: SC, País: BR Id: 4879 - Nome: Treze Tílias - Estado: SC, País: BR Id: 4880 - Nome: Trombudo Central - Estado: SC, País: BR Id: 4881 - Nome: Tubarão - Estado: SC, País: BR Id: 4882 - Nome: Tunápolis - Estado: SC, País: BR Id: 4883 - Nome: Turvo - Estado: SC, País: BR Id: 4884 - Nome: União do Oeste - Estado: SC, País: BR Id: 4885 - Nome: Urubici - Estado: SC, País: BR Id: 4886 - Nome: Urupema - Estado: SC, País: BR Id: 4887 - Nome: Urussanga - Estado: SC, País: BR Id: 4482 - Nome: Vargeão - Estado: SC, País: BR Id: 4484 - Nome: Vargem - Estado: SC, País: BR Id: 4483 - Nome: Vargem Bonita - Estado: SC, País: BR Id: 4485 - Nome: Vidal Ramos - Estado: SC, País: BR Id: 4486 - Nome: Videira - Estado: SC, País: BR Id: 4487 - Nome: Vitor Meireles - Estado: SC, País: BR Id: 4488 - Nome: Witmarsum - Estado: SC, País: BR Id: 4489 - Nome: Xanxerê - Estado: SC, País: BR Id: 4490 - Nome: Xavantina - Estado: SC, País: BR Id: 4491 - Nome: Xaxim - Estado: SC, País: BR Id: 4492 - Nome: Zortéa - Estado: SC, País: BR ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/log/io.txt ================================================ 2022-03-13T22:35:58.922853 : Erro ao salvar arquivo de cidades 2022-03-13T22:35:58.922853 : #0 salvarCidades. (package:climatempo/log.dart:44:5) #1 salvarCidades. (package:climatempo/log.dart:43:19) #2 _rootRun (dart:async/zone.dart:1426:13) #3 _CustomZone.run (dart:async/zone.dart:1328:19) #4 _runZoned (dart:async/zone.dart:1861:10) #5 runZonedGuarded (dart:async/zone.dart:1849:12) #6 salvarCidades (package:climatempo/log.dart:43:3) #7 _delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:300:17) #8 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) 2022-03-13T22:36:54.582977 : Erro ao salvar o tempo 2022-03-13T22:36:54.582977 : #0 salvarTempo. (package:climatempo/log.dart:23:5) #1 salvarTempo. (package:climatempo/log.dart:22:19) #2 _rootRun (dart:async/zone.dart:1426:13) #3 _CustomZone.run (dart:async/zone.dart:1328:19) #4 _runZoned (dart:async/zone.dart:1861:10) #5 runZonedGuarded (dart:async/zone.dart:1849:12) #6 salvarTempo (package:climatempo/log.dart:22:3) #7 _delayEntrypointInvocation. (dart:isolate-patch/isolate_patch.dart:300:17) #8 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:192:12) ================================================ FILE: code/pt_Br/e_com_voce/15_climatempo_isolate_zone/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/na_pratica/03_strings_palindromo/main.dart ================================================ import 'dart:io'; void main() { print("------ Palíndromo ------"); print("> Informe sua frase:"); var frase = stdin.readLineSync()?.replaceAll(' ', '').toLowerCase(); print(frase?.toUpperCase()); var fraseContrario = frase?.split('').reversed.join(); print("\n$frase -> $fraseContrario \n"); if (frase == fraseContrario) { print('É um palíndromo!! o/'); } else { print('Não é um palíndromo!!'); } print("------------------------"); } ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/README.md ================================================ An absolute bare-bones web app. ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/lib/src/partida.dart ================================================ import 'dart:math'; import 'package:jogo/src/resultado.dart'; const pedra = 'Pedra'; const papel = 'Papel'; const tesoura = 'Tesoura'; const lagarto = 'Lagarto'; const spock = 'Spock'; const opcoes = [pedra, papel, tesoura, lagarto, spock]; class Partida { final regras = >{}; void criarRegra(String vencedor, {required String acao, required String perdedor}) { if (!regras.containsKey(vencedor)) { regras[vencedor] = {}; } regras[vencedor]![acao] = perdedor; } String escolherPc() { final index = Random().nextInt(5); return opcoes[index]; } Resumo iniciar({required String humano}) { final pc = escolherPc(); if (humano == pc) { return Resumo(Resultado.empate, '$humano empata com $pc'); } if (regras[humano]!.containsValue(pc)) { final entry = regras[humano]!.entries.firstWhere((e) => e.value == pc); return Resumo( Resultado.vitoria, '$humano ${entry.key} ${entry.value}'); } final entry = regras[pc]!.entries.firstWhere((e) => e.value == humano); return Resumo(Resultado.derrota, '$pc ${entry.key} ${entry.value}'); } } Partida configurarPartida() { return Partida() ..criarRegra(tesoura, acao: 'corta', perdedor: papel) ..criarRegra(tesoura, acao: 'decapita', perdedor: lagarto) ..criarRegra(papel, acao: 'cobre', perdedor: pedra) ..criarRegra(papel, acao: 'refuta', perdedor: spock) ..criarRegra(pedra, acao: 'esmaga', perdedor: lagarto) ..criarRegra(pedra, acao: 'quebra', perdedor: tesoura) ..criarRegra(lagarto, acao: 'envenena', perdedor: spock) ..criarRegra(lagarto, acao: 'come', perdedor: papel) ..criarRegra(spock, acao: 'esmaga', perdedor: tesoura) ..criarRegra(spock, acao: 'vaporiza', perdedor: pedra); } ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/lib/src/resultado.dart ================================================ enum Resultado { empate(classeCss: 'empatou', mensagem: 'Empatou..'), vitoria(classeCss: 'venceu', mensagem: 'Você ganhou :D'), derrota(classeCss: 'perdeu', mensagem: 'Você perdeu :/'); const Resultado({required this.classeCss, required this.mensagem}); final String mensagem; final String classeCss; } class Resumo { Resumo(this.resultado, this.mensagem); final Resultado resultado; final String mensagem; } ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/pubspec.yaml ================================================ name: jogo description: An absolute bare-bones web app. version: 1.0.0 # repository: https://github.com/my_org/my_repo environment: sdk: ^3.5.1 # Add regular dependencies here. dependencies: web: ^1.1.0 dev_dependencies: build_runner: ^2.4.8 build_web_compilers: ^4.0.9 lints: ^4.0.0 ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/index.html ================================================ Pedra, Papel, Tesoura, Lagarto e Spock

Vamos jogar!

Escolha um:

================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/main.dart ================================================ import 'dart:html'; import 'package:web/web.dart' as web; import 'package:jogo/src/partida.dart'; import 'package:jogo/src/resultado.dart'; late web.HTMLDivElement divOpcoes; late web.HTMLDivElement divResultado; bool jogando = true; late Resumo resumo; void main() { inicializarReferencias(); final partida = configurarPartida(); for (final opcao in opcoes) { divOpcoes.append( web.HTMLImageElement() ..className = 'opcao' ..src = 'images/$opcao.png' ..height = 120 ..onClick.listen( (web.MouseEvent e) { if (jogando) { resumo = partida.iniciar(humano: opcao); jogando = false; mostrarResultado(resumo); } }, ), ); } } void mostrarResultado(Resumo resumo) { divResultado.append( web.HTMLSpanElement() ..className = resumo.resultado.classeCss ..text = resumo.resultado.mensagem, ); adicionarEspaco(); divResultado.append(web.HTMLSpanElement()..text = resumo.mensagem); adicionarEspaco(); divResultado.append( web.HTMLButtonElement() ..text = 'Jogar novamente!' ..onClick.listen(jogarNovamente), ); } void adicionarEspaco() { divResultado.append(web.HTMLBRElement()); divResultado.append(web.HTMLBRElement()); } void jogarNovamente(web.MouseEvent e) { jogando = true; while(divResultado.firstChild != null) { divResultado.removeChild(divResultado.firstChild!); } } void inicializarReferencias() { divOpcoes = web.document.querySelector('#opcoes') as web.HTMLDivElement; divResultado = web.document.querySelector('#resultado') as web.HTMLDivElement; } ================================================ FILE: code/pt_Br/na_pratica/04_pedra_papel_tesoura_lagarto_spock/web/styles.css ================================================ @import url(https://fonts.googleapis.com/css?family=Roboto); html, body { width: 100%; height: 100%; margin: 0; padding: 0; font-family: 'Roboto', sans-serif; } h2, h4 { text-align: center; } #opcoes { text-align: center; } .opcao { padding: 10px; } #resultado { text-align: center; margin: 20px; } .venceu { background-color: #FFFFFF; padding: 5px 10px; border: 2px solid #73D973; border-radius: 5px; font-weight: bold; color: #73D973; } .perdeu { background-color: #FFFFFF; padding: 5px 10px; border: 2px solid #FF6F6F; border-radius: 5px; font-weight: bold; color: #FF6F6F; } .empatou { background-color: #FFFFFF; padding: 5px 10px; border: 2px solid #E06FFF; border-radius: 5px; font-weight: bold; color: #E06FFF; } button { background-color: #FFFFFF; border: 2px solid #008CBA; border-radius: 5px; padding: 5px 10px; cursor: pointer; color: #008CBA; } button:hover { background-color: #008CBA; color: white; } .clicavel:hover { cursor: pointer; } ================================================ FILE: code/pt_Br/na_pratica/06_logger_library/lib/log/log.dart ================================================ library logger; import 'dart:io'; part 'printer.dart'; enum _Cores { verde('\x1b[32m'), vermelho('\x1b[31m'), azul('\x1b[36m'); const _Cores(this.ansi); final String ansi; } const _resetarCor = '\x1b[m'; enum Nivel { info, warning, error } class Logger { const Logger({ required this.nivel, this.printer = const Printer(), }); final Printer printer; final Nivel nivel; void info(Object object) { if (_habilitado(Nivel.info)) printer._log(_Cores.verde, '[INFO] $object'); } void warning(Object object) { if (_habilitado(Nivel.warning)) printer._log(_Cores.azul, '[WARNING] $object'); } void error(Object object) { if (_habilitado(Nivel.error)) printer._log(_Cores.vermelho, '[ERROR] $object'); } bool _habilitado(Nivel nivelHabilitado) => nivelHabilitado.index >= nivel.index; } ================================================ FILE: code/pt_Br/na_pratica/06_logger_library/lib/log/printer.dart ================================================ part of 'log.dart'; class Printer { const Printer({this.inicio = '', this.fim = ''}); final String inicio; final String fim; void _log(_Cores cor, Object object) { stdout.writeln( '${cor.ansi}' '$inicio$object$fim' '$_resetarCor', ); } } ================================================ FILE: code/pt_Br/na_pratica/06_logger_library/lib/main.dart ================================================ import 'log/log.dart'; void main() { const logger = Logger( nivel: Nivel.warning, printer: Printer(inicio: 'Customizado: {', fim: '}'), ); logger.error('Este é um erro'); logger.warning('Este é um warning'); logger.info('Esta é uma info'); } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build outputs. build/ # Omit committing pubspec.lock for library packages; see # https://dart.dev/guides/libraries/private-files#pubspeclock. pubspec.lock ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/README.md ================================================ Um package para facilitar a criação de logs nas aplicações. ## Utilização A utilização do `logger` é muito simples: ```dart import 'package:logger/logger.dart'; void main() { const logger = Logger( nivel: Nivel.warning, printer: Printer(inicio: 'Customizado: {', fim: '}'), ); logger.error('Este é um erro'); logger.warning('Este é um warning'); logger.info('Esta é uma info'); } ``` ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/__404error.html ================================================ logger - Dart API docs
menu
logger

404: Something's gone wrong :-(

You've tried to visit a page that doesn't exist. Luckily this site has other pages.

If you were looking for something specific, try searching:

logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/categories.json ================================================ [] ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/index.html ================================================ logger - Dart API docs
menu
logger

Um package para facilitar a criação de logs nas aplicações.

Utilização

A utilização do logger é muito simples:

import 'package:logger/logger.dart';

void main() {
  const logger = Logger(
    nivel: Nivel.warning,
    printer: Printer(inicio: 'Customizado: {', fim: '}'),
  );
  logger.error('Este é um erro');
  logger.warning('Este é um warning');
  logger.info('Esta é uma info');
}

Libraries

logger
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/index.json ================================================ [{"name":"logger","qualifiedName":"logger","href":"logger/logger-library.html","kind":9,"overriddenDepth":0,"packageRank":0,"desc":""},{"name":"Cores","qualifiedName":"logger.Cores","href":"logger/Cores.html","kind":5,"overriddenDepth":0,"packageRank":0,"desc":"Enum com as cores utilizadas para personalizar a fonte de log no terminal.","enclosedBy":{"name":"logger","kind":9,"href":"logger/logger-library.html"}},{"name":"Cores","qualifiedName":"logger.Cores.Cores","href":"logger/Cores/Cores.html","kind":2,"overriddenDepth":0,"packageRank":0,"desc":"","enclosedBy":{"name":"Cores","kind":5,"href":"logger/Cores.html"}},{"name":"ansi","qualifiedName":"logger.Cores.ansi","href":"logger/Cores/ansi.html","kind":16,"overriddenDepth":0,"packageRank":0,"desc":"","enclosedBy":{"name":"Cores","kind":5,"href":"logger/Cores.html"}},{"name":"values","qualifiedName":"logger.Cores.values","href":"logger/Cores/values-constant.html","kind":1,"overriddenDepth":0,"packageRank":0,"desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"Cores","kind":5,"href":"logger/Cores.html"}},{"name":"Logger","qualifiedName":"logger.Logger","href":"logger/Logger-class.html","kind":3,"overriddenDepth":0,"packageRank":0,"desc":"Controla a impressão de logs, feitas através do printer.\nImprime logs de acordo com o nivel informado.","enclosedBy":{"name":"logger","kind":9,"href":"logger/logger-library.html"}},{"name":"Logger","qualifiedName":"logger.Logger.Logger","href":"logger/Logger/Logger.html","kind":2,"overriddenDepth":0,"packageRank":0,"desc":"","enclosedBy":{"name":"Logger","kind":3,"href":"logger/Logger-class.html"}},{"name":"error","qualifiedName":"logger.Logger.error","href":"logger/Logger/error.html","kind":10,"overriddenDepth":0,"packageRank":0,"desc":"Imprime logs de Nivel.error com a cor Cores.vermelho.","enclosedBy":{"name":"Logger","kind":3,"href":"logger/Logger-class.html"}},{"name":"info","qualifiedName":"logger.Logger.info","href":"logger/Logger/info.html","kind":10,"overriddenDepth":0,"packageRank":0,"desc":"Imprime logs de Nivel.info com a cor Cores.verde.","enclosedBy":{"name":"Logger","kind":3,"href":"logger/Logger-class.html"}},{"name":"nivel","qualifiedName":"logger.Logger.nivel","href":"logger/Logger/nivel.html","kind":16,"overriddenDepth":0,"packageRank":0,"desc":"Permite definir o nivel dos logs impressos.","enclosedBy":{"name":"Logger","kind":3,"href":"logger/Logger-class.html"}},{"name":"printer","qualifiedName":"logger.Logger.printer","href":"logger/Logger/printer.html","kind":16,"overriddenDepth":0,"packageRank":0,"desc":"Impressora responsável por imprimir o log de acordo com a plataforma.","enclosedBy":{"name":"Logger","kind":3,"href":"logger/Logger-class.html"}},{"name":"warning","qualifiedName":"logger.Logger.warning","href":"logger/Logger/warning.html","kind":10,"overriddenDepth":0,"packageRank":0,"desc":"Imprime logs de Nivel.warning com a cor Cores.azul.","enclosedBy":{"name":"Logger","kind":3,"href":"logger/Logger-class.html"}},{"name":"Nivel","qualifiedName":"logger.Nivel","href":"logger/Nivel.html","kind":5,"overriddenDepth":0,"packageRank":0,"desc":"Controla o Nivel permitido do log para ser impresso, quanto mais crítico\nmais restrito é, e menos níveis são impressos.\nAbaixo as opções ordenadas pelo menos crítico:","enclosedBy":{"name":"logger","kind":9,"href":"logger/logger-library.html"}},{"name":"Nivel","qualifiedName":"logger.Nivel.Nivel","href":"logger/Nivel/Nivel.html","kind":2,"overriddenDepth":0,"packageRank":0,"desc":"","enclosedBy":{"name":"Nivel","kind":5,"href":"logger/Nivel.html"}},{"name":"values","qualifiedName":"logger.Nivel.values","href":"logger/Nivel/values-constant.html","kind":1,"overriddenDepth":0,"packageRank":0,"desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"Nivel","kind":5,"href":"logger/Nivel.html"}},{"name":"Printer","qualifiedName":"logger.Printer","href":"logger/Printer-class.html","kind":3,"overriddenDepth":0,"packageRank":0,"desc":"Uma impressora de logs utilizada por Logger que funciona em todas\nas plataformas.","enclosedBy":{"name":"logger","kind":9,"href":"logger/logger-library.html"}},{"name":"Printer","qualifiedName":"logger.Printer.Printer","href":"logger/Printer/Printer.html","kind":2,"overriddenDepth":0,"packageRank":0,"desc":"","enclosedBy":{"name":"Printer","kind":3,"href":"logger/Printer-class.html"}},{"name":"fim","qualifiedName":"logger.Printer.fim","href":"logger/Printer/fim.html","kind":16,"overriddenDepth":0,"packageRank":0,"desc":"Utilizado para personalizar o término de cada linha impressa no log.\nPor padrão não contém um valor.","enclosedBy":{"name":"Printer","kind":3,"href":"logger/Printer-class.html"}},{"name":"inicio","qualifiedName":"logger.Printer.inicio","href":"logger/Printer/inicio.html","kind":16,"overriddenDepth":0,"packageRank":0,"desc":"Utilizado para personalizar o início de cada linha impressa no log.\nPor padrão não contém um valor.","enclosedBy":{"name":"Printer","kind":3,"href":"logger/Printer-class.html"}},{"name":"log","qualifiedName":"logger.Printer.log","href":"logger/Printer/log.html","kind":10,"overriddenDepth":0,"packageRank":0,"desc":"Imprime o object de log de acordo com a plataforma utilizada.\nÉ possível personalizar a cor do texto impresso.","enclosedBy":{"name":"Printer","kind":3,"href":"logger/Printer-class.html"}},{"name":"resetarCor","qualifiedName":"logger.resetarCor","href":"logger/resetarCor-constant.html","kind":19,"overriddenDepth":0,"packageRank":0,"desc":"Código ANSI utilizado para resetar a cor da fonte no terminal.","enclosedBy":{"name":"logger","kind":9,"href":"logger/logger-library.html"}}] ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/Cores.html ================================================ Cores constructor - Cores - logger library - Dart API
menu
Cores

Cores constructor

const Cores(
  1. String ansi
)

Implementation

const Cores(this.ansi);
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/ansi.html ================================================ ansi property - Cores enum - logger library - Dart API
menu
ansi

ansi property

String ansi
final

Implementation

final String ansi;
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/toString.html ================================================ toString method - Cores extension - logger library - Dart API
toString

toString method Null safety

String toString()
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores/values-constant.html ================================================ values constant - Cores enum - logger library - Dart API
menu
values

values constant

List<Cores> const values

A constant List of the values in this enum, in order of their declaration.

logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores-enum-sidebar.html ================================================
  1. Constructors
  2. Cores
  3. Values
  4. verde
  5. vermelho
  6. azul
  7. Properties
  8. ansi
  9. hashCode
  10. index
  11. runtimeType
  12. Methods
  13. noSuchMethod
  14. toString
  15. Operators
  16. operator ==
  17. Constants
  18. values
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Cores.html ================================================ Cores enum - logger library - Dart API
menu
Cores

Cores enum

Enum com as cores utilizadas para personalizar a fonte de log no terminal.

Inheritance

Constructors

Cores(String ansi)
const

Values

verde → const Cores
const Cores('\x1b[32m')
vermelho → const Cores
const Cores('\x1b[31m')
azul → const Cores
const Cores('\x1b[36m')

Properties

ansi String
final
hashCode int
The hash code for this object.
no setterinherited
index int
A numeric identifier for the enumerated value.
no setterinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited

Constants

values → const List<Cores>
A constant List of the values in this enum, in order of their declaration.
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/Logger.html ================================================ Logger constructor - Logger - logger library - Dart API
menu
Logger

Logger constructor

const Logger({
  1. Printer printer = const Printer(),
  2. required Nivel nivel,
})

Implementation

const Logger({
  this.printer = const Printer(),
  required this.nivel,
});
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/error.html ================================================ error method - Logger class - logger library - Dart API
menu
error

error method

void error(
  1. Object object
)

Imprime logs de Nivel.error com a cor Cores.vermelho.

Implementation

void error(Object object) {
  if (_habilitado(Nivel.error)) {
    printer.log(Cores.vermelho, '[ERROR] $object');
  }
}
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/info.html ================================================ info method - Logger class - logger library - Dart API
menu
info

info method

void info(
  1. Object object
)

Imprime logs de Nivel.info com a cor Cores.verde.

Implementation

void info(Object object) {
  if (_habilitado(Nivel.info)) printer.log(Cores.verde, '[INFO] $object');
}
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/nivel.html ================================================ nivel property - Logger class - logger library - Dart API
menu
nivel

nivel property

Nivel nivel
final

Permite definir o nivel dos logs impressos.

Implementation

final Nivel nivel;
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/printer.html ================================================ printer property - Logger class - logger library - Dart API
menu
printer

printer property

Printer printer
final

Impressora responsável por imprimir o log de acordo com a plataforma.

Implementation

final Printer printer;
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger/warning.html ================================================ warning method - Logger class - logger library - Dart API
menu
warning

warning method

void warning(
  1. Object object
)

Imprime logs de Nivel.warning com a cor Cores.azul.

Implementation

void warning(Object object) {
  if (_habilitado(Nivel.warning)) {
    printer.log(Cores.azul, '[WARNING] $object');
  }
}
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger-class-sidebar.html ================================================
  1. Constructors
  2. Logger
  3. Properties
  4. hashCode
  5. nivel
  6. printer
  7. runtimeType
  8. Methods
  9. error
  10. info
  11. noSuchMethod
  12. toString
  13. warning
  14. Operators
  15. operator ==
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Logger-class.html ================================================ Logger class - logger library - Dart API
menu
Logger

Logger class

Controla a impressão de logs, feitas através do printer. Imprime logs de acordo com o nivel informado.

Constructors

Logger({Printer printer = const Printer(), required Nivel nivel})
const

Properties

hashCode int
The hash code for this object.
no setterinherited
nivel Nivel
Permite definir o nivel dos logs impressos.
final
printer Printer
Impressora responsável por imprimir o log de acordo com a plataforma.
final
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

error(Object object) → void
Imprime logs de Nivel.error com a cor Cores.vermelho.
info(Object object) → void
Imprime logs de Nivel.info com a cor Cores.verde.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited
warning(Object object) → void
Imprime logs de Nivel.warning com a cor Cores.azul.

Operators

operator ==(Object other) bool
The equality operator.
inherited
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel/Nivel.html ================================================ Nivel constructor - Nivel - logger library - Dart API
menu
Nivel

Nivel constructor

const Nivel()
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel/toString.html ================================================ toString method - Nivel extension - logger library - Dart API
toString

toString method Null safety

String toString()
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel/values-constant.html ================================================ values constant - Nivel enum - logger library - Dart API
menu
values

values constant

List<Nivel> const values

A constant List of the values in this enum, in order of their declaration.

logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel-enum-sidebar.html ================================================
  1. Constructors
  2. Nivel
  3. Values
  4. info
  5. warning
  6. error
  7. Properties
  8. hashCode
  9. index
  10. runtimeType
  11. Methods
  12. noSuchMethod
  13. toString
  14. Operators
  15. operator ==
  16. Constants
  17. values
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Nivel.html ================================================ Nivel enum - logger library - Dart API
menu
Nivel

Nivel enum

Controla o Nivel permitido do log para ser impresso, quanto mais crítico mais restrito é, e menos níveis são impressos. Abaixo as opções ordenadas pelo menos crítico:

Inheritance

Constructors

Nivel()
const

Values

info → const Nivel
warning → const Nivel
error → const Nivel

Properties

hashCode int
The hash code for this object.
no setterinherited
index int
A numeric identifier for the enumerated value.
no setterinherited
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited

Constants

values → const List<Nivel>
A constant List of the values in this enum, in order of their declaration.
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/Printer.html ================================================ Printer constructor - Printer - logger library - Dart API
menu
Printer

Printer constructor

const Printer({
  1. String inicio = '',
  2. String fim = '',
})

Implementation

const Printer({this.inicio = '', this.fim = ''});
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/fim.html ================================================ fim property - Printer class - logger library - Dart API
menu
fim

fim property

String fim
final

Utilizado para personalizar o término de cada linha impressa no log. Por padrão não contém um valor.

Implementation

final String fim;
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/inicio.html ================================================ inicio property - Printer class - logger library - Dart API
menu
inicio

inicio property

String inicio
final

Utilizado para personalizar o início de cada linha impressa no log. Por padrão não contém um valor.

Implementation

final String inicio;
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer/log.html ================================================ log method - Printer class - logger library - Dart API
menu
log

log method

void log(
  1. Cores cor,
  2. Object object
)

Imprime o object de log de acordo com a plataforma utilizada. É possível personalizar a cor do texto impresso.

Implementation

void log(Cores cor, Object object) {
  printer.log(
    '${cor.ansi}'
    '$inicio$object$fim'
    '$resetarCor',
  );
}
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer-class-sidebar.html ================================================
  1. Constructors
  2. Printer
  3. Properties
  4. fim
  5. hashCode
  6. inicio
  7. runtimeType
  8. Methods
  9. log
  10. noSuchMethod
  11. toString
  12. Operators
  13. operator ==
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/Printer-class.html ================================================ Printer class - logger library - Dart API
menu
Printer

Printer class

Uma impressora de logs utilizada por Logger que funciona em todas as plataformas.

Constructors

Printer({String inicio = '', String fim = ''})
const

Properties

fim String
Utilizado para personalizar o término de cada linha impressa no log. Por padrão não contém um valor.
final
hashCode int
The hash code for this object.
no setterinherited
inicio String
Utilizado para personalizar o início de cada linha impressa no log. Por padrão não contém um valor.
final
runtimeType Type
A representation of the runtime type of the object.
no setterinherited

Methods

log(Cores cor, Object object) → void
Imprime o object de log de acordo com a plataforma utilizada. É possível personalizar a cor do texto impresso.
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
toString() String
A string representation of this object.
inherited

Operators

operator ==(Object other) bool
The equality operator.
inherited
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/ansiCores-constant.html ================================================ ansiCores constant - logger library - Dart API
ansiCores

ansiCores top-level constant Null safety

Map<Cores, String> const ansiCores

Map com o código ANSI utilizado para personalizar as cores de fonte no terminal.

Implementation

const ansiCores = {
  Cores.vermelho: '\x1b[31m',
  Cores.verde: '\x1b[32m',
  Cores.azul: '\x1b[36m',
};
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/logger-library-sidebar.html ================================================
  1. Classes
  2. Logger
  3. Printer
  4. Enums
  5. Cores
  6. Nivel
  7. Constants
  8. resetarCor
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/logger-library.html ================================================ logger library - Dart API
menu
logger

logger library

Classes

Logger
Controla a impressão de logs, feitas através do printer. Imprime logs de acordo com o nivel informado.
Printer
Uma impressora de logs utilizada por Logger que funciona em todas as plataformas.

Enums

Cores
Enum com as cores utilizadas para personalizar a fonte de log no terminal.
Nivel
Controla o Nivel permitido do log para ser impresso, quanto mais crítico mais restrito é, e menos níveis são impressos. Abaixo as opções ordenadas pelo menos crítico:

Constants

resetarCor → const String
Código ANSI utilizado para resetar a cor da fonte no terminal.
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/logger/resetarCor-constant.html ================================================ resetarCor constant - logger library - Dart API
menu
resetarCor

resetarCor top-level constant

String const resetarCor

Código ANSI utilizado para resetar a cor da fonte no terminal.

Implementation

const resetarCor = '\x1b[m';
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/search.html ================================================ logger - Dart API docs
menu
logger
logger 1.0.0
================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/docs.dart.js ================================================ (function dartProgram(){function copyProperties(a,b){var s=Object.keys(a) for(var r=0;r=0)return true if(typeof version=="function"&&version.length==0){var q=version() if(/^\d+\.\d+\.\d+\.\d+$/.test(q))return true}}catch(p){}return false}() function inherit(a,b){a.prototype.constructor=a a.prototype["$i"+a.name]=a if(b!=null){if(z){Object.setPrototypeOf(a.prototype,b.prototype) return}var s=Object.create(b.prototype) copyProperties(a.prototype,s) a.prototype=s}}function inheritMany(a,b){for(var s=0;s4294967295)throw A.a(A.H(a,0,4294967295,"length",null)) return J.hS(new Array(a),b)}, hR(a,b){if(a<0)throw A.a(A.a_("Length must be a non-negative integer: "+a,null)) return A.h(new Array(a),b.i("o<0>"))}, eX(a,b){if(a<0)throw A.a(A.a_("Length must be a non-negative integer: "+a,null)) return A.h(new Array(a),b.i("o<0>"))}, hS(a,b){return J.eg(A.h(a,b.i("o<0>")))}, eg(a){a.fixed$length=Array return a}, eY(a){a.fixed$length=Array a.immutable$list=Array return a}, hT(a,b){return J.hu(a,b)}, X(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.aP.prototype return J.bI.prototype}if(typeof a=="string")return J.ai.prototype if(a==null)return J.aQ.prototype if(typeof a=="boolean")return J.bH.prototype if(Array.isArray(a))return J.o.prototype if(typeof a!="object"){if(typeof a=="function")return J.a1.prototype if(typeof a=="symbol")return J.aU.prototype if(typeof a=="bigint")return J.aS.prototype return a}if(a instanceof A.l)return a return J.eG(a)}, ao(a){if(typeof a=="string")return J.ai.prototype if(a==null)return a if(Array.isArray(a))return J.o.prototype if(typeof a!="object"){if(typeof a=="function")return J.a1.prototype if(typeof a=="symbol")return J.aU.prototype if(typeof a=="bigint")return J.aS.prototype return a}if(a instanceof A.l)return a return J.eG(a)}, e_(a){if(a==null)return a if(Array.isArray(a))return J.o.prototype if(typeof a!="object"){if(typeof a=="function")return J.a1.prototype if(typeof a=="symbol")return J.aU.prototype if(typeof a=="bigint")return J.aS.prototype return a}if(a instanceof A.l)return a return J.eG(a)}, jJ(a){if(typeof a=="number")return J.aR.prototype if(typeof a=="string")return J.ai.prototype if(a==null)return a if(!(a instanceof A.l))return J.ax.prototype return a}, F(a,b){if(a==null)return b==null if(typeof a!="object")return b!=null&&a===b return J.X(a).F(a,b)}, hr(a,b){if(typeof b==="number")if(Array.isArray(a)||typeof a=="string"||A.h4(a,a[v.dispatchPropertyName]))if(b>>>0===b&&b>>0===b&&b").b(a))return new A.b9(a,b.i("@<0>").A(c).i("b9<1,2>")) return new A.af(a,b.i("@<0>").A(c).i("af<1,2>"))}, e0(a){var s,r=a^48 if(r<=9)return r s=a|32 if(97<=s&&s<=102)return s-87 return-1}, a6(a,b){a=a+b&536870911 a=a+((a&524287)<<10)&536870911 return a^a>>>6}, en(a){a=a+((a&67108863)<<3)&536870911 a^=a>>>11 return a+((a&16383)<<15)&536870911}, cn(a,b,c){return a}, eI(a){var s,r for(s=$.ap.length,r=0;r").A(d).i("aM<1,2>")) return new A.aj(a,b,c.i("@<0>").A(d).i("aj<1,2>"))}, eV(){return new A.b5("No element")}, a8:function a8(){}, bA:function bA(a,b){this.a=a this.$ti=b}, af:function af(a,b){this.a=a this.$ti=b}, b9:function b9(a,b){this.a=a this.$ti=b}, b8:function b8(){}, M:function M(a,b){this.a=a this.$ti=b}, aV:function aV(a){this.a=a}, bB:function bB(a){this.a=a}, cR:function cR(){}, c:function c(){}, J:function J(){}, au:function au(a,b,c){var _=this _.a=a _.b=b _.c=0 _.d=null _.$ti=c}, aj:function aj(a,b,c){this.a=a this.b=b this.$ti=c}, aM:function aM(a,b,c){this.a=a this.b=b this.$ti=c}, av:function av(a,b,c){var _=this _.a=null _.b=a _.c=b _.$ti=c}, ak:function ak(a,b,c){this.a=a this.b=b this.$ti=c}, aO:function aO(){}, c1:function c1(){}, ay:function ay(){}, a5:function a5(a){this.a=a}, bp:function bp(){}, hG(){throw A.a(A.T("Cannot modify unmodifiable Map"))}, h9(a){var s=v.mangledGlobalNames[a] if(s!=null)return s return"minified:"+a}, h4(a,b){var s if(b!=null){s=b.x if(s!=null)return s}return t.p.b(a)}, i(a){var s if(typeof a=="string")return a if(typeof a=="number"){if(a!==0)return""+a}else if(!0===a)return"true" else if(!1===a)return"false" else if(a==null)return"null" s=J.aq(a) return s}, bY(a){var s,r=$.f2 if(r==null)r=$.f2=Symbol("identityHashCode") s=a[r] if(s==null){s=Math.random()*0x3fffffff|0 a[r]=s}return s}, f3(a,b){var s,r,q,p,o,n=null,m=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a) if(m==null)return n s=m[3] if(b==null){if(s!=null)return parseInt(a,10) if(m[2]!=null)return parseInt(a,16) return n}if(b<2||b>36)throw A.a(A.H(b,2,36,"radix",n)) if(b===10&&s!=null)return parseInt(a,10) if(b<10||s==null){r=b<=10?47+b:86+b q=m[1] for(p=q.length,o=0;or)return n}return parseInt(a,b)}, cQ(a){return A.i0(a)}, i0(a){var s,r,q,p if(a instanceof A.l)return A.C(A.aG(a),null) s=J.X(a) if(s===B.I||s===B.K||t.o.b(a)){r=B.l(a) if(r!=="Object"&&r!=="")return r q=a.constructor if(typeof q=="function"){p=q.name if(typeof p=="string"&&p!=="Object"&&p!=="")return p}}return A.C(A.aG(a),null)}, f4(a){if(a==null||typeof a=="number"||A.ez(a))return J.aq(a) if(typeof a=="string")return JSON.stringify(a) if(a instanceof A.ag)return a.h(0) if(a instanceof A.bf)return a.aH(!0) return"Instance of '"+A.cQ(a)+"'"}, i3(a,b,c){var s,r,q,p if(c<=500&&b===0&&c===a.length)return String.fromCharCode.apply(null,a) for(s=b,r="";s>>0,s&1023|56320)}}throw A.a(A.H(a,0,1114111,null,null))}, a3(a,b,c){var s,r,q={} q.a=0 s=[] r=[] q.a=b.length B.b.aI(s,b) q.b="" if(c!=null&&c.a!==0)c.C(0,new A.cP(q,r,s)) return J.hx(a,new A.cD(B.ac,0,s,r,0))}, i1(a,b,c){var s,r,q if(Array.isArray(b))s=c==null||c.a===0 else s=!1 if(s){r=b.length if(r===0){if(!!a.$0)return a.$0()}else if(r===1){if(!!a.$1)return a.$1(b[0])}else if(r===2){if(!!a.$2)return a.$2(b[0],b[1])}else if(r===3){if(!!a.$3)return a.$3(b[0],b[1],b[2])}else if(r===4){if(!!a.$4)return a.$4(b[0],b[1],b[2],b[3])}else if(r===5)if(!!a.$5)return a.$5(b[0],b[1],b[2],b[3],b[4]) q=a[""+"$"+r] if(q!=null)return q.apply(a,b)}return A.i_(a,b,c)}, i_(a,b,c){var s,r,q,p,o,n,m,l,k,j,i,h,g=Array.isArray(b)?b:A.bL(b,!0,t.z),f=g.length,e=a.$R if(fn)return A.a3(a,g,null) if(fe)return A.a3(a,g,c) if(g===b)g=A.bL(g,!0,t.z) l=Object.keys(q) if(c==null)for(r=l.length,k=0;k=s)return A.eU(b,s,a,r) return A.i4(b,r)}, jG(a,b,c){if(a>c)return A.H(a,0,c,"start",null) if(b!=null)if(bc)return A.H(b,a,c,"end",null) return new A.G(!0,b,"end",null)}, jz(a){return new A.G(!0,a,null,null)}, a(a){return A.h3(new Error(),a)}, h3(a,b){var s if(b==null)b=new A.R() a.dartException=b s=A.k5 if("defineProperty" in Object){Object.defineProperty(a,"message",{get:s}) a.name=""}else a.toString=s return a}, k5(){return J.aq(this.dartException)}, aH(a){throw A.a(a)}, h8(a,b){throw A.h3(b,a)}, co(a){throw A.a(A.as(a))}, S(a){var s,r,q,p,o,n a=A.k_(a.replace(String({}),"$receiver$")) s=a.match(/\\\$[a-zA-Z]+\\\$/g) if(s==null)s=A.h([],t.s) r=s.indexOf("\\$arguments\\$") q=s.indexOf("\\$argumentsExpr\\$") p=s.indexOf("\\$expr\\$") o=s.indexOf("\\$method\\$") n=s.indexOf("\\$receiver\\$") return new A.cU(a.replace(new RegExp("\\\\\\$arguments\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$argumentsExpr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$expr\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$method\\\\\\$","g"),"((?:x|[^x])*)").replace(new RegExp("\\\\\\$receiver\\\\\\$","g"),"((?:x|[^x])*)"),r,q,p,o,n)}, cV(a){return function($expr$){var $argumentsExpr$="$arguments$" try{$expr$.$method$($argumentsExpr$)}catch(s){return s.message}}(a)}, fd(a){return function($expr$){try{$expr$.$method$}catch(s){return s.message}}(a)}, ei(a,b){var s=b==null,r=s?null:b.method return new A.bJ(a,r,s?null:b.receiver)}, ae(a){if(a==null)return new A.cO(a) if(a instanceof A.aN)return A.ad(a,a.a) if(typeof a!=="object")return a if("dartException" in a)return A.ad(a,a.dartException) return A.jy(a)}, ad(a,b){if(t.Q.b(b))if(b.$thrownJsError==null)b.$thrownJsError=a return b}, jy(a){var s,r,q,p,o,n,m,l,k,j,i,h,g if(!("message" in a))return a s=a.message if("number" in a&&typeof a.number=="number"){r=a.number q=r&65535 if((B.c.V(r,16)&8191)===10)switch(q){case 438:return A.ad(a,A.ei(A.i(s)+" (Error "+q+")",null)) case 445:case 5007:A.i(s) return A.ad(a,new A.b1())}}if(a instanceof TypeError){p=$.ha() o=$.hb() n=$.hc() m=$.hd() l=$.hg() k=$.hh() j=$.hf() $.he() i=$.hj() h=$.hi() g=p.D(s) if(g!=null)return A.ad(a,A.ei(s,g)) else{g=o.D(s) if(g!=null){g.method="call" return A.ad(a,A.ei(s,g))}else if(n.D(s)!=null||m.D(s)!=null||l.D(s)!=null||k.D(s)!=null||j.D(s)!=null||m.D(s)!=null||i.D(s)!=null||h.D(s)!=null)return A.ad(a,new A.b1())}return A.ad(a,new A.c0(typeof s=="string"?s:""))}if(a instanceof RangeError){if(typeof s=="string"&&s.indexOf("call stack")!==-1)return new A.b4() s=function(b){try{return String(b)}catch(f){}return null}(a) return A.ad(a,new A.G(!1,null,null,typeof s=="string"?s.replace(/^RangeError:\s*/,""):s))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof s=="string"&&s==="too much recursion")return new A.b4() return a}, ac(a){var s if(a instanceof A.aN)return a.b if(a==null)return new A.bg(a) s=a.$cachedTrace if(s!=null)return s s=new A.bg(a) if(typeof a==="object")a.$cachedTrace=s return s}, h5(a){if(a==null)return J.Z(a) if(typeof a=="object")return A.bY(a) return J.Z(a)}, jI(a,b){var s,r,q,p=a.length for(s=0;s=0}, k_(a){if(/[[\]{}()*+?.\\^$|]/.test(a))return a.replace(/[[\]{}()*+?.\\^$|]/g,"\\$&") return a}, fX(a){return a}, k3(a,b,c,d){var s,r,q,p=new A.d3(b,a,0),o=t.F,n=0,m="" for(;p.m();){s=p.d if(s==null)s=o.a(s) r=s.b q=r.index m=m+A.i(A.fX(B.a.j(a,n,q)))+A.i(c.$1(s)) n=q+r[0].length}p=m+A.i(A.fX(B.a.K(a,n))) return p.charCodeAt(0)==0?p:p}, cg:function cg(a,b){this.a=a this.b=b}, aL:function aL(a,b){this.a=a this.$ti=b}, aK:function aK(){}, ah:function ah(a,b,c){this.a=a this.b=b this.$ti=c}, cD:function cD(a,b,c,d,e){var _=this _.a=a _.c=b _.d=c _.e=d _.f=e}, cP:function cP(a,b,c){this.a=a this.b=b this.c=c}, cU:function cU(a,b,c,d,e,f){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f}, b1:function b1(){}, bJ:function bJ(a,b,c){this.a=a this.b=b this.c=c}, c0:function c0(a){this.a=a}, cO:function cO(a){this.a=a}, aN:function aN(a,b){this.a=a this.b=b}, bg:function bg(a){this.a=a this.b=null}, ag:function ag(){}, cs:function cs(){}, ct:function ct(){}, cT:function cT(){}, cS:function cS(){}, aJ:function aJ(a,b){this.a=a this.b=b}, c8:function c8(a){this.a=a}, bZ:function bZ(a){this.a=a}, dp:function dp(){}, N:function N(a){var _=this _.a=0 _.f=_.e=_.d=_.c=_.b=null _.r=0 _.$ti=a}, cG:function cG(a){this.a=a}, cJ:function cJ(a,b){this.a=a this.b=b this.c=null}, O:function O(a,b){this.a=a this.$ti=b}, bK:function bK(a,b){var _=this _.a=a _.b=b _.d=_.c=null}, e1:function e1(a){this.a=a}, e2:function e2(a){this.a=a}, e3:function e3(a){this.a=a}, bf:function bf(){}, cf:function cf(){}, cE:function cE(a,b){var _=this _.a=a _.b=b _.d=_.c=null}, ce:function ce(a){this.b=a}, d3:function d3(a,b,c){var _=this _.a=a _.b=b _.c=c _.d=null}, j0(a){return a}, hX(a){return new Int8Array(a)}, hY(a){return new Uint8Array(a)}, V(a,b,c){if(a>>>0!==a||a>=c)throw A.a(A.eF(b,a))}, iX(a,b,c){var s if(!(a>>>0!==a))s=b>>>0!==b||a>b||b>c else s=!0 if(s)throw A.a(A.jG(a,b,c)) return b}, bM:function bM(){}, aZ:function aZ(){}, bN:function bN(){}, aw:function aw(){}, aX:function aX(){}, aY:function aY(){}, bO:function bO(){}, bP:function bP(){}, bQ:function bQ(){}, bR:function bR(){}, bS:function bS(){}, bT:function bT(){}, bU:function bU(){}, b_:function b_(){}, b0:function b0(){}, bb:function bb(){}, bc:function bc(){}, bd:function bd(){}, be:function be(){}, f7(a,b){var s=b.c return s==null?b.c=A.er(a,b.x,!0):s}, em(a,b){var s=b.c return s==null?b.c=A.bj(a,"a0",[b.x]):s}, f8(a){var s=a.w if(s===6||s===7||s===8)return A.f8(a.x) return s===12||s===13}, i5(a){return a.as}, bt(a){return A.ck(v.typeUniverse,a,!1)}, aa(a1,a2,a3,a4){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0=a2.w switch(a0){case 5:case 1:case 2:case 3:case 4:return a2 case 6:s=a2.x r=A.aa(a1,s,a3,a4) if(r===s)return a2 return A.fs(a1,r,!0) case 7:s=a2.x r=A.aa(a1,s,a3,a4) if(r===s)return a2 return A.er(a1,r,!0) case 8:s=a2.x r=A.aa(a1,s,a3,a4) if(r===s)return a2 return A.fq(a1,r,!0) case 9:q=a2.y p=A.aD(a1,q,a3,a4) if(p===q)return a2 return A.bj(a1,a2.x,p) case 10:o=a2.x n=A.aa(a1,o,a3,a4) m=a2.y l=A.aD(a1,m,a3,a4) if(n===o&&l===m)return a2 return A.ep(a1,n,l) case 11:k=a2.x j=a2.y i=A.aD(a1,j,a3,a4) if(i===j)return a2 return A.fr(a1,k,i) case 12:h=a2.x g=A.aa(a1,h,a3,a4) f=a2.y e=A.jv(a1,f,a3,a4) if(g===h&&e===f)return a2 return A.fp(a1,g,e) case 13:d=a2.y a4+=d.length c=A.aD(a1,d,a3,a4) o=a2.x n=A.aa(a1,o,a3,a4) if(c===d&&n===o)return a2 return A.eq(a1,n,c,!0) case 14:b=a2.x if(b") for(r=1;r=0)p+=" "+r[q];++q}return p+"})"}, fN(a3,a4,a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2=", " if(a5!=null){s=a5.length if(a4==null){a4=A.h([],t.s) r=null}else r=a4.length q=a4.length for(p=s;p>0;--p)a4.push("T"+(q+p)) for(o=t.X,n=t._,m="<",l="",p=0;p0){a0+=a1+"[" for(a1="",p=0;p0){a0+=a1+"{" for(a1="",p=0;p "+a}, C(a,b){var s,r,q,p,o,n,m=a.w if(m===5)return"erased" if(m===2)return"dynamic" if(m===3)return"void" if(m===1)return"Never" if(m===4)return"any" if(m===6)return A.C(a.x,b) if(m===7){s=a.x r=A.C(s,b) q=s.w return(q===12||q===13?"("+r+")":r)+"?"}if(m===8)return"FutureOr<"+A.C(a.x,b)+">" if(m===9){p=A.jx(a.x) o=a.y return o.length>0?p+("<"+A.fU(o,b)+">"):p}if(m===11)return A.jp(a,b) if(m===12)return A.fN(a,b,null) if(m===13)return A.fN(a.x,b,a.y) if(m===14){n=a.x return b[b.length-1-n]}return"?"}, jx(a){var s=v.mangledGlobalNames[a] if(s!=null)return s return"minified:"+a}, iz(a,b){var s=a.tR[b] for(;typeof s=="string";)s=a.tR[s] return s}, iy(a,b){var s,r,q,p,o,n=a.eT,m=n[b] if(m==null)return A.ck(a,b,!1) else if(typeof m=="number"){s=m r=A.bk(a,5,"#") q=A.dI(s) for(p=0;p0)p+="<"+A.bi(c)+">" s=a.eC.get(p) if(s!=null)return s r=new A.I(null,null) r.w=9 r.x=b r.y=c if(c.length>0)r.c=c[0] r.as=p q=A.U(a,r) a.eC.set(p,q) return q}, ep(a,b,c){var s,r,q,p,o,n if(b.w===10){s=b.x r=b.y.concat(c)}else{r=c s=b}q=s.as+(";<"+A.bi(r)+">") p=a.eC.get(q) if(p!=null)return p o=new A.I(null,null) o.w=10 o.x=s o.y=r o.as=q n=A.U(a,o) a.eC.set(q,n) return n}, fr(a,b,c){var s,r,q="+"+(b+"("+A.bi(c)+")"),p=a.eC.get(q) if(p!=null)return p s=new A.I(null,null) s.w=11 s.x=b s.y=c s.as=q r=A.U(a,s) a.eC.set(q,r) return r}, fp(a,b,c){var s,r,q,p,o,n=b.as,m=c.a,l=m.length,k=c.b,j=k.length,i=c.c,h=i.length,g="("+A.bi(m) if(j>0){s=l>0?",":"" g+=s+"["+A.bi(k)+"]"}if(h>0){s=l>0?",":"" g+=s+"{"+A.iq(i)+"}"}r=n+(g+")") q=a.eC.get(r) if(q!=null)return q p=new A.I(null,null) p.w=12 p.x=b p.y=c p.as=r o=A.U(a,p) a.eC.set(r,o) return o}, eq(a,b,c,d){var s,r=b.as+("<"+A.bi(c)+">"),q=a.eC.get(r) if(q!=null)return q s=A.is(a,b,c,r,d) a.eC.set(r,s) return s}, is(a,b,c,d,e){var s,r,q,p,o,n,m,l if(e){s=c.length r=A.dI(s) for(q=0,p=0;p0){n=A.aa(a,b,r,0) m=A.aD(a,c,r,0) return A.eq(a,n,m,c!==m)}}l=new A.I(null,null) l.w=13 l.x=b l.y=c l.as=d return A.U(a,l)}, fl(a,b,c,d){return{u:a,e:b,r:c,s:[],p:0,n:d}}, fn(a){var s,r,q,p,o,n,m,l=a.r,k=a.s for(s=l.length,r=0;r=48&&q<=57)r=A.ii(r+1,q,l,k) else if((((q|32)>>>0)-97&65535)<26||q===95||q===36||q===124)r=A.fm(a,r,l,k,!1) else if(q===46)r=A.fm(a,r,l,k,!0) else{++r switch(q){case 44:break case 58:k.push(!1) break case 33:k.push(!0) break case 59:k.push(A.a9(a.u,a.e,k.pop())) break case 94:k.push(A.iv(a.u,k.pop())) break case 35:k.push(A.bk(a.u,5,"#")) break case 64:k.push(A.bk(a.u,2,"@")) break case 126:k.push(A.bk(a.u,3,"~")) break case 60:k.push(a.p) a.p=k.length break case 62:A.ik(a,k) break case 38:A.ij(a,k) break case 42:p=a.u k.push(A.fs(p,A.a9(p,a.e,k.pop()),a.n)) break case 63:p=a.u k.push(A.er(p,A.a9(p,a.e,k.pop()),a.n)) break case 47:p=a.u k.push(A.fq(p,A.a9(p,a.e,k.pop()),a.n)) break case 40:k.push(-3) k.push(a.p) a.p=k.length break case 41:A.ih(a,k) break case 91:k.push(a.p) a.p=k.length break case 93:o=k.splice(a.p) A.fo(a.u,a.e,o) a.p=k.pop() k.push(o) k.push(-1) break case 123:k.push(a.p) a.p=k.length break case 125:o=k.splice(a.p) A.im(a.u,a.e,o) a.p=k.pop() k.push(o) k.push(-2) break case 43:n=l.indexOf("(",r) k.push(l.substring(r,n)) k.push(-4) k.push(a.p) a.p=k.length r=n+1 break default:throw"Bad character "+q}}}m=k.pop() return A.a9(a.u,a.e,m)}, ii(a,b,c,d){var s,r,q=b-48 for(s=c.length;a=48&&r<=57))break q=q*10+(r-48)}d.push(q) return a}, fm(a,b,c,d,e){var s,r,q,p,o,n,m=b+1 for(s=c.length;m>>0)-97&65535)<26||r===95||r===36||r===124))q=r>=48&&r<=57 else q=!0 if(!q)break}}p=c.substring(b,m) if(e){s=a.u o=a.e if(o.w===10)o=o.x n=A.iz(s,o.x)[p] if(n==null)A.aH('No "'+p+'" in "'+A.i5(o)+'"') d.push(A.bl(s,o,n))}else d.push(p) return m}, ik(a,b){var s,r=a.u,q=A.fk(a,b),p=b.pop() if(typeof p=="string")b.push(A.bj(r,p,q)) else{s=A.a9(r,a.e,p) switch(s.w){case 12:b.push(A.eq(r,s,q,a.n)) break default:b.push(A.ep(r,s,q)) break}}}, ih(a,b){var s,r,q,p,o,n=null,m=a.u,l=b.pop() if(typeof l=="number")switch(l){case-1:s=b.pop() r=n break case-2:r=b.pop() s=n break default:b.push(l) r=n s=r break}else{b.push(l) r=n s=r}q=A.fk(a,b) l=b.pop() switch(l){case-3:l=b.pop() if(s==null)s=m.sEA if(r==null)r=m.sEA p=A.a9(m,a.e,l) o=new A.cb() o.a=q o.b=s o.c=r b.push(A.fp(m,p,o)) return case-4:b.push(A.fr(m,b.pop(),q)) return default:throw A.a(A.by("Unexpected state under `()`: "+A.i(l)))}}, ij(a,b){var s=b.pop() if(0===s){b.push(A.bk(a.u,1,"0&")) return}if(1===s){b.push(A.bk(a.u,4,"1&")) return}throw A.a(A.by("Unexpected extended operation "+A.i(s)))}, fk(a,b){var s=b.splice(a.p) A.fo(a.u,a.e,s) a.p=b.pop() return s}, a9(a,b,c){if(typeof c=="string")return A.bj(a,c,a.sEA) else if(typeof c=="number"){b.toString return A.il(a,b,c)}else return c}, fo(a,b,c){var s,r=c.length for(s=0;sn)return!1 m=n-o l=s.b k=r.b j=l.length i=k.length if(o+j=d)return!1 a1=f[b] b+=3 if(a00?new Array(q):v.typeUniverse.sEA for(o=0;o0?new Array(a):v.typeUniverse.sEA}, I:function I(a,b){var _=this _.a=a _.b=b _.r=_.f=_.d=_.c=null _.w=0 _.as=_.Q=_.z=_.y=_.x=null}, cb:function cb(){this.c=this.b=this.a=null}, dA:function dA(a){this.a=a}, ca:function ca(){}, bh:function bh(a){this.a=a}, ib(){var s,r,q={} if(self.scheduleImmediate!=null)return A.jA() if(self.MutationObserver!=null&&self.document!=null){s=self.document.createElement("div") r=self.document.createElement("span") q.a=null new self.MutationObserver(A.aF(new A.d5(q),1)).observe(s,{childList:true}) return new A.d4(q,s,r)}else if(self.setImmediate!=null)return A.jB() return A.jC()}, ic(a){self.scheduleImmediate(A.aF(new A.d6(a),0))}, id(a){self.setImmediate(A.aF(new A.d7(a),0))}, ie(a){A.io(0,a)}, io(a,b){var s=new A.dy() s.bf(a,b) return s}, fS(a){return new A.c5(new A.v($.r,a.i("v<0>")),a.i("c5<0>"))}, fK(a,b){a.$2(0,null) b.b=!0 return b.a}, fH(a,b){A.iV(a,b)}, fJ(a,b){b.ae(a)}, fI(a,b){b.af(A.ae(a),A.ac(a))}, iV(a,b){var s,r,q=new A.dK(b),p=new A.dL(b) if(a instanceof A.v)a.aG(q,p,t.z) else{s=t.z if(a instanceof A.v)a.au(q,p,s) else{r=new A.v($.r,t.e) r.a=8 r.c=a r.aG(q,p,s)}}}, fZ(a){var s=function(b,c){return function(d,e){while(true){try{b(d,e) break}catch(r){e=r d=c}}}}(a,1) return $.r.b1(new A.dY(s))}, cp(a,b){var s=A.cn(a,"error",t.K) return new A.bz(s,b==null?A.eN(a):b)}, eN(a){var s if(t.Q.b(a)){s=a.gR() if(s!=null)return s}return B.H}, fj(a,b){var s,r for(;s=a.a,(s&4)!==0;)a=a.c if(a===b){b.S(new A.G(!0,a,null,"Cannot complete a future with itself"),A.f9()) return}s|=b.a&1 a.a=s if((s&24)!==0){r=b.ab() b.T(a) A.ba(b,r)}else{r=b.c b.aE(a) a.aa(r)}}, ig(a,b){var s,r,q={},p=q.a=a for(;s=p.a,(s&4)!==0;){p=p.c q.a=p}if(p===b){b.S(new A.G(!0,p,null,"Cannot complete a future with itself"),A.f9()) return}if((s&24)===0){r=b.c b.aE(p) q.a.aa(r) return}if((s&16)===0&&b.c==null){b.T(p) return}b.a^=2 A.aC(null,null,b.b,new A.dd(q,b))}, ba(a,b){var s,r,q,p,o,n,m,l,k,j,i,h,g={},f=g.a=a for(;!0;){s={} r=f.a q=(r&16)===0 p=!q if(b==null){if(p&&(r&1)===0){f=f.c A.eB(f.a,f.b)}return}s.a=b o=b.a for(f=b;o!=null;f=o,o=n){f.a=null A.ba(g.a,f) s.a=o n=o.a}r=g.a m=r.c s.b=p s.c=m if(q){l=f.c l=(l&1)!==0||(l&15)===8}else l=!0 if(l){k=f.b.b if(p){r=r.b===k r=!(r||r)}else r=!1 if(r){A.eB(m.a,m.b) return}j=$.r if(j!==k)$.r=k else j=null f=f.c if((f&15)===8)new A.dk(s,g,p).$0() else if(q){if((f&1)!==0)new A.dj(s,m).$0()}else if((f&2)!==0)new A.di(g,s).$0() if(j!=null)$.r=j f=s.c if(f instanceof A.v){r=s.a.$ti r=r.i("a0<2>").b(f)||!r.y[1].b(f)}else r=!1 if(r){i=s.a.b if((f.a&24)!==0){h=i.c i.c=null b=i.U(h) i.a=f.a&30|i.a&1 i.c=f.c g.a=f continue}else A.fj(f,i) return}}i=s.a.b h=i.c i.c=null b=i.U(h) f=s.b r=s.c if(!f){i.a=8 i.c=r}else{i.a=i.a&1|16 i.c=r}g.a=i f=i}}, jq(a,b){if(t.C.b(a))return b.b1(a) if(t.v.b(a))return a throw A.a(A.eM(a,"onError",u.c))}, jn(){var s,r for(s=$.aB;s!=null;s=$.aB){$.bs=null r=s.b $.aB=r if(r==null)$.br=null s.a.$0()}}, ju(){$.eA=!0 try{A.jn()}finally{$.bs=null $.eA=!1 if($.aB!=null)$.eL().$1(A.h0())}}, fW(a){var s=new A.c6(a),r=$.br if(r==null){$.aB=$.br=s if(!$.eA)$.eL().$1(A.h0())}else $.br=r.b=s}, jt(a){var s,r,q,p=$.aB if(p==null){A.fW(a) $.bs=$.br return}s=new A.c6(a) r=$.bs if(r==null){s.b=p $.aB=$.bs=s}else{q=r.b s.b=q $.bs=r.b=s if(q==null)$.br=s}}, k0(a){var s=null,r=$.r if(B.d===r){A.aC(s,s,B.d,a) return}A.aC(s,s,r,r.aJ(a))}, kb(a){A.cn(a,"stream",t.K) return new A.ci()}, eB(a,b){A.jt(new A.dW(a,b))}, fT(a,b,c,d){var s,r=$.r if(r===c)return d.$0() $.r=c s=r try{r=d.$0() return r}finally{$.r=s}}, js(a,b,c,d,e){var s,r=$.r if(r===c)return d.$1(e) $.r=c s=r try{r=d.$1(e) return r}finally{$.r=s}}, jr(a,b,c,d,e,f){var s,r=$.r if(r===c)return d.$2(e,f) $.r=c s=r try{r=d.$2(e,f) return r}finally{$.r=s}}, aC(a,b,c,d){if(B.d!==c)d=c.aJ(d) A.fW(d)}, d5:function d5(a){this.a=a}, d4:function d4(a,b,c){this.a=a this.b=b this.c=c}, d6:function d6(a){this.a=a}, d7:function d7(a){this.a=a}, dy:function dy(){}, dz:function dz(a,b){this.a=a this.b=b}, c5:function c5(a,b){this.a=a this.b=!1 this.$ti=b}, dK:function dK(a){this.a=a}, dL:function dL(a){this.a=a}, dY:function dY(a){this.a=a}, bz:function bz(a,b){this.a=a this.b=b}, c7:function c7(){}, b7:function b7(a,b){this.a=a this.$ti=b}, az:function az(a,b,c,d,e){var _=this _.a=null _.b=a _.c=b _.d=c _.e=d _.$ti=e}, v:function v(a,b){var _=this _.a=0 _.b=a _.c=null _.$ti=b}, da:function da(a,b){this.a=a this.b=b}, dh:function dh(a,b){this.a=a this.b=b}, de:function de(a){this.a=a}, df:function df(a){this.a=a}, dg:function dg(a,b,c){this.a=a this.b=b this.c=c}, dd:function dd(a,b){this.a=a this.b=b}, dc:function dc(a,b){this.a=a this.b=b}, db:function db(a,b,c){this.a=a this.b=b this.c=c}, dk:function dk(a,b,c){this.a=a this.b=b this.c=c}, dl:function dl(a){this.a=a}, dj:function dj(a,b){this.a=a this.b=b}, di:function di(a,b){this.a=a this.b=b}, c6:function c6(a){this.a=a this.b=null}, ci:function ci(){}, dJ:function dJ(){}, dW:function dW(a,b){this.a=a this.b=b}, dq:function dq(){}, dr:function dr(a,b){this.a=a this.b=b}, f_(a,b,c){return A.jI(a,new A.N(b.i("@<0>").A(c).i("N<1,2>")))}, ej(a,b){return new A.N(a.i("@<0>").A(b).i("N<1,2>"))}, ek(a){var s,r={} if(A.eI(a))return"{...}" s=new A.y("") try{$.ap.push(a) s.a+="{" r.a=!0 a.C(0,new A.cK(r,s)) s.a+="}"}finally{$.ap.pop()}r=s.a return r.charCodeAt(0)==0?r:r}, e:function e(){}, P:function P(){}, cK:function cK(a,b){this.a=a this.b=b}, cl:function cl(){}, aW:function aW(){}, a7:function a7(a,b){this.a=a this.$ti=b}, bm:function bm(){}, jo(a,b){var s,r,q,p=null try{p=JSON.parse(a)}catch(r){s=A.ae(r) q=A.z(String(s),null,null) throw A.a(q)}q=A.dM(p) return q}, dM(a){var s if(a==null)return null if(typeof a!="object")return a if(!Array.isArray(a))return new A.cc(a,Object.create(null)) for(s=0;s")) for(s=J.L(a);s.m();)r.push(s.gp()) if(b)return r return J.eg(r)}, bL(a,b,c){var s=A.hU(a,c) return s}, hU(a,b){var s,r if(Array.isArray(a))return A.h(a.slice(0),b.i("o<0>")) s=A.h([],b.i("o<0>")) for(r=J.L(a);r.m();)s.push(r.gp()) return s}, fc(a,b,c){var s,r A.f5(b,"start") if(c!=null){s=c-b if(s<0)throw A.a(A.H(c,b,null,"end",null)) if(s===0)return""}r=A.i6(a,b,c) return r}, i6(a,b,c){var s=a.length if(b>=s)return"" return A.i3(a,b,c==null||c>s?s:c)}, f6(a,b){return new A.cE(a,A.eZ(a,!1,b,!1,!1,!1))}, fb(a,b,c){var s=J.L(b) if(!s.m())return a if(c.length===0){do a+=A.i(s.gp()) while(s.m())}else{a+=A.i(s.gp()) for(;s.m();)a=a+c+A.i(s.gp())}return a}, f1(a,b){return new A.bV(a,b.gbN(),b.gbQ(),b.gbO())}, fA(a,b,c,d){var s,r,q,p,o,n="0123456789ABCDEF" if(c===B.e){s=$.hl() s=s.b.test(b)}else s=!1 if(s)return b r=B.G.I(b) for(s=r.length,q=0,p="";q>>4]&1<<(o&15))!==0)p+=A.Q(o) else p=d&&o===32?p+"+":p+"%"+n[o>>>4&15]+n[o&15]}return p.charCodeAt(0)==0?p:p}, iH(a){var s,r,q if(!$.hm())return A.iI(a) s=new URLSearchParams() a.C(0,new A.dD(s)) r=s.toString() q=r.length if(q>0&&r[q-1]==="=")r=B.a.j(r,0,q-1) return r.replace(/=&|\*|%7E/g,b=>b==="=&"?"&":b==="*"?"%2A":"~")}, f9(){return A.ac(new Error())}, at(a){if(typeof a=="number"||A.ez(a)||a==null)return J.aq(a) if(typeof a=="string")return JSON.stringify(a) return A.f4(a)}, hI(a,b){A.cn(a,"error",t.K) A.cn(b,"stackTrace",t.l) A.hH(a,b)}, by(a){return new A.bx(a)}, a_(a,b){return new A.G(!1,null,b,a)}, eM(a,b,c){return new A.G(!0,a,b,c)}, i4(a,b){return new A.b2(null,null,!0,a,b,"Value not in range")}, H(a,b,c,d,e){return new A.b2(b,c,!0,a,d,"Invalid value")}, b3(a,b,c){if(0>a||a>c)throw A.a(A.H(a,0,c,"start",null)) if(b!=null){if(a>b||b>c)throw A.a(A.H(b,a,c,"end",null)) return b}return c}, f5(a,b){if(a<0)throw A.a(A.H(a,0,null,b,null)) return a}, eU(a,b,c,d){return new A.bF(b,!0,a,d,"Index out of range")}, T(a){return new A.c2(a)}, fe(a){return new A.c_(a)}, fa(a){return new A.b5(a)}, as(a){return new A.bD(a)}, z(a,b,c){return new A.cw(a,b,c)}, hP(a,b,c){var s,r if(A.eI(a)){if(b==="("&&c===")")return"(...)" return b+"..."+c}s=A.h([],t.s) $.ap.push(a) try{A.jl(a,s)}finally{$.ap.pop()}r=A.fb(b,s,", ")+c return r.charCodeAt(0)==0?r:r}, eW(a,b,c){var s,r if(A.eI(a))return b+"..."+c s=new A.y(b) $.ap.push(a) try{r=s r.a=A.fb(r.a,a,", ")}finally{$.ap.pop()}s.a+=c r=s.a return r.charCodeAt(0)==0?r:r}, jl(a,b){var s,r,q,p,o,n,m,l=a.gB(a),k=0,j=0 while(!0){if(!(k<80||j<3))break if(!l.m())return s=A.i(l.gp()) b.push(s) k+=s.length+2;++j}if(!l.m()){if(j<=5)return r=b.pop() q=b.pop()}else{p=l.gp();++j if(!l.m()){if(j<=4){b.push(A.i(p)) return}r=A.i(p) q=b.pop() k+=r.length+2}else{o=l.gp();++j for(;l.m();p=o,o=n){n=l.gp();++j if(j>100){while(!0){if(!(k>75&&j>3))break k-=b.pop().length+2;--j}b.push("...") return}}q=A.i(p) r=A.i(o) k+=r.length+q.length+4}}if(j>b.length+2){k+=5 m="..."}else m=null while(!0){if(!(k>80&&b.length>3))break k-=b.pop().length+2 if(m==null){k+=5 m="..."}}if(m!=null)b.push(m) b.push(q) b.push(r)}, hZ(a,b,c,d){var s if(B.i===c){s=B.c.gn(a) b=J.Z(b) return A.en(A.a6(A.a6($.ee(),s),b))}if(B.i===d){s=B.c.gn(a) b=J.Z(b) c=J.Z(c) return A.en(A.a6(A.a6(A.a6($.ee(),s),b),c))}s=B.c.gn(a) b=J.Z(b) c=J.Z(c) d=J.Z(d) d=A.en(A.a6(A.a6(A.a6(A.a6($.ee(),s),b),c),d)) return d}, c4(a5){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0,a1,a2,a3=null,a4=a5.length if(a4>=5){s=((a5.charCodeAt(4)^58)*3|a5.charCodeAt(0)^100|a5.charCodeAt(1)^97|a5.charCodeAt(2)^116|a5.charCodeAt(3)^97)>>>0 if(s===0)return A.ff(a4=14)r[7]=a4 q=r[1] if(q>=0)if(A.fV(a5,0,q,20,r)===20)r[7]=q p=r[2]+1 o=r[3] n=r[4] m=r[5] l=r[6] if(lq+3){j=a3 k=!1}else{i=o>0 if(i&&o+1===n){j=a3 k=!1}else{if(!B.a.v(a5,"\\",n))if(p>0)h=B.a.v(a5,"\\",p-1)||B.a.v(a5,"\\",p-2) else h=!1 else h=!0 if(h){j=a3 k=!1}else{if(!(mn+2&&B.a.v(a5,"/..",m-3) else h=!0 if(h)j=a3 else if(q===4)if(B.a.v(a5,"file",0)){if(p<=0){if(!B.a.v(a5,"/",n)){g="file:///" s=3}else{g="file://" s=2}a5=g+B.a.j(a5,n,a4) m+=s l+=s a4=a5.length p=7 o=7 n=7}else if(n===m){++l f=m+1 a5=B.a.J(a5,n,m,"/");++a4 m=f}j="file"}else if(B.a.v(a5,"http",0)){if(i&&o+3===n&&B.a.v(a5,"80",o+1)){l-=3 e=n-3 m-=3 a5=B.a.J(a5,o,n,"") a4-=3 n=e}j="http"}else j=a3 else if(q===5&&B.a.v(a5,"https",0)){if(i&&o+4===n&&B.a.v(a5,"443",o+1)){l-=4 e=n-4 m-=4 a5=B.a.J(a5,o,n,"") a4-=3 n=e}j="https"}else j=a3 k=!h}}}else j=a3 if(k)return new A.ch(a40)j=A.iJ(a5,0,q) else{if(q===0)A.aA(a5,0,"Invalid empty scheme") j=""}if(p>0){d=q+3 c=d9)k.$2("invalid character",s)}else{if(q===3)k.$2(m,s) o=A.e8(B.a.j(a,r,s),null) if(o>255)k.$2(l,r) n=q+1 j[q]=o r=s+1 q=n}}if(q!==3)k.$2(m,c) o=A.e8(B.a.j(a,r,c),null) if(o>255)k.$2(l,r) j[q]=o return j}, fg(a,b,a0){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=null,d=new A.cY(a),c=new A.cZ(d,a) if(a.length<2)d.$2("address is too short",e) s=A.h([],t.t) for(r=b,q=r,p=!1,o=!1;r>>0) s.push((k[2]<<8|k[3])>>>0)}if(p){if(s.length>7)d.$2("an address with a wildcard must have less than 7 parts",e)}else if(s.length!==8)d.$2("an address without a wildcard must contain exactly 8 parts",e) j=new Uint8Array(16) for(l=s.length,i=9-l,r=0,h=0;r=b&&q=b&&s>>4]&1<<(p&15))!==0){if(q&&65<=p&&90>=p){if(i==null)i=new A.y("") if(r>>4]&1<<(o&15))!==0){if(p&&65<=o&&90>=o){if(q==null)q=new A.y("") if(r>>4]&1<<(o&15))!==0)A.aA(a,s,"Invalid character") else{if((o&64512)===55296&&s+1>>4]&1<<(q&15))!==0))A.aA(a,s,"Illegal scheme character") if(65<=q&&q<=90)r=!0}a=B.a.j(a,b,c) return A.iA(r?a.toLowerCase():a)}, iA(a){if(a==="http")return"http" if(a==="file")return"file" if(a==="https")return"https" if(a==="package")return"package" return a}, iK(a,b,c){return A.bo(a,b,c,B.a8,!1,!1)}, iF(a,b,c,d,e,f){var s,r=e==="file",q=r||f if(a==null)return r?"/":"" else s=A.bo(a,b,c,B.p,!0,!0) if(s.length===0){if(r)return"/"}else if(q&&!B.a.u(s,"/"))s="/"+s return A.iL(s,e,f)}, iL(a,b,c){var s=b.length===0 if(s&&!c&&!B.a.u(a,"/")&&!B.a.u(a,"\\"))return A.iN(a,!s||c) return A.iO(a)}, eu(a,b,c,d){if(a!=null){if(d!=null)throw A.a(A.a_("Both query and queryParameters specified",null)) return A.bo(a,b,c,B.f,!0,!1)}if(d==null)return null return A.iH(d)}, iI(a){var s={},r=new A.y("") s.a="" a.C(0,new A.dB(new A.dC(s,r))) s=r.a return s.charCodeAt(0)==0?s:s}, iD(a,b,c){return A.bo(a,b,c,B.f,!0,!1)}, ev(a,b,c){var s,r,q,p,o,n=b+2 if(n>=a.length)return"%" s=a.charCodeAt(b+1) r=a.charCodeAt(n) q=A.e0(s) p=A.e0(r) if(q<0||p<0)return"%" o=q*16+p if(o<127&&(B.h[B.c.V(o,4)]&1<<(o&15))!==0)return A.Q(c&&65<=o&&90>=o?(o|32)>>>0:o) if(s>=97||r>=97)return B.a.j(a,b,b+3).toUpperCase() return null}, et(a){var s,r,q,p,o,n="0123456789ABCDEF" if(a<128){s=new Uint8Array(3) s[0]=37 s[1]=n.charCodeAt(a>>>4) s[2]=n.charCodeAt(a&15)}else{if(a>2047)if(a>65535){r=240 q=4}else{r=224 q=3}else{r=192 q=2}s=new Uint8Array(3*q) for(p=0;--q,q>=0;r=128){o=B.c.bv(a,6*q)&63|r s[p]=37 s[p+1]=n.charCodeAt(o>>>4) s[p+2]=n.charCodeAt(o&15) p+=3}}return A.fc(s,0,null)}, bo(a,b,c,d,e,f){var s=A.fy(a,b,c,d,e,f) return s==null?B.a.j(a,b,c):s}, fy(a,b,c,d,e,f){var s,r,q,p,o,n,m,l,k,j,i=null for(s=!e,r=b,q=r,p=i;r>>4]&1<<(o&15))!==0)++r else{if(o===37){n=A.ev(a,r,!1) if(n==null){r+=3 continue}if("%"===n){n="%25" m=1}else m=3}else if(o===92&&f){n="/" m=1}else if(s&&o<=93&&(B.r[o>>>4]&1<<(o&15))!==0){A.aA(a,r,"Invalid character") m=i n=m}else{if((o&64512)===55296){l=r+1 if(l=2&&A.fw(a.charCodeAt(0)))for(s=1;s127||(B.o[r>>>4]&1<<(r&15))===0)break}return a}, iC(a,b){var s,r,q for(s=0,r=0;r<2;++r){q=a.charCodeAt(b+r) if(48<=q&&q<=57)s=s*16+q-48 else{q|=32 if(97<=q&&q<=102)s=s*16+q-87 else throw A.a(A.a_("Invalid URL encoding",null))}}return s}, ew(a,b,c,d,e){var s,r,q,p,o=b while(!0){if(!(o127)throw A.a(A.a_("Illegal percent encoding in URI",null)) if(r===37){if(o+3>q)throw A.a(A.a_("Truncated URI",null)) p.push(A.iC(a,o+1)) o+=2}else if(r===43)p.push(32) else p.push(r)}}return B.ap.I(p)}, fw(a){var s=a|32 return 97<=s&&s<=122}, ff(a,b,c){var s,r,q,p,o,n,m,l,k="Invalid MIME type",j=A.h([b-1],t.t) for(s=a.length,r=b,q=-1,p=null;rb)throw A.a(A.z(k,a,r)) for(;p!==44;){j.push(r);++r for(o=-1;r=0)j.push(o) else{n=B.b.ga_(j) if(p!==44||r!==n+7||!B.a.v(a,"base64",n+1))throw A.a(A.z("Expecting '='",a,r)) break}}j.push(r) m=r+1 if((j.length&1)===1)a=B.x.bP(a,m,s) else{l=A.fy(a,m,s,B.f,!0,!1) if(l!=null)a=B.a.J(a,m,s,l)}return new A.cW(a,j,c)}, j_(){var s,r,q,p,o,n="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~!$&'()*+,;=",m=".",l=":",k="/",j="\\",i="?",h="#",g="/\\",f=J.eX(22,t.D) for(s=0;s<22;++s)f[s]=new Uint8Array(96) r=new A.dP(f) q=new A.dQ() p=new A.dR() o=r.$2(0,225) q.$3(o,n,1) q.$3(o,m,14) q.$3(o,l,34) q.$3(o,k,3) q.$3(o,j,227) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(14,225) q.$3(o,n,1) q.$3(o,m,15) q.$3(o,l,34) q.$3(o,g,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(15,225) q.$3(o,n,1) q.$3(o,"%",225) q.$3(o,l,34) q.$3(o,k,9) q.$3(o,j,233) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(1,225) q.$3(o,n,1) q.$3(o,l,34) q.$3(o,k,10) q.$3(o,j,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(2,235) q.$3(o,n,139) q.$3(o,k,131) q.$3(o,j,131) q.$3(o,m,146) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(3,235) q.$3(o,n,11) q.$3(o,k,68) q.$3(o,j,68) q.$3(o,m,18) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(4,229) q.$3(o,n,5) p.$3(o,"AZ",229) q.$3(o,l,102) q.$3(o,"@",68) q.$3(o,"[",232) q.$3(o,k,138) q.$3(o,j,138) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(5,229) q.$3(o,n,5) p.$3(o,"AZ",229) q.$3(o,l,102) q.$3(o,"@",68) q.$3(o,k,138) q.$3(o,j,138) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(6,231) p.$3(o,"19",7) q.$3(o,"@",68) q.$3(o,k,138) q.$3(o,j,138) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(7,231) p.$3(o,"09",7) q.$3(o,"@",68) q.$3(o,k,138) q.$3(o,j,138) q.$3(o,i,172) q.$3(o,h,205) q.$3(r.$2(8,8),"]",5) o=r.$2(9,235) q.$3(o,n,11) q.$3(o,m,16) q.$3(o,g,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(16,235) q.$3(o,n,11) q.$3(o,m,17) q.$3(o,g,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(17,235) q.$3(o,n,11) q.$3(o,k,9) q.$3(o,j,233) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(10,235) q.$3(o,n,11) q.$3(o,m,18) q.$3(o,k,10) q.$3(o,j,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(18,235) q.$3(o,n,11) q.$3(o,m,19) q.$3(o,g,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(19,235) q.$3(o,n,11) q.$3(o,g,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(11,235) q.$3(o,n,11) q.$3(o,k,10) q.$3(o,j,234) q.$3(o,i,172) q.$3(o,h,205) o=r.$2(12,236) q.$3(o,n,12) q.$3(o,i,12) q.$3(o,h,205) o=r.$2(13,237) q.$3(o,n,13) q.$3(o,i,13) p.$3(r.$2(20,245),"az",21) o=r.$2(21,245) p.$3(o,"az",21) p.$3(o,"09",21) q.$3(o,"+-.",21) return f}, fV(a,b,c,d,e){var s,r,q,p,o=$.hq() for(s=b;s95?31:q] d=p&31 e[p>>>5]=s}return d}, cM:function cM(a,b){this.a=a this.b=b}, dD:function dD(a){this.a=a}, d8:function d8(){}, k:function k(){}, bx:function bx(a){this.a=a}, R:function R(){}, G:function G(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, b2:function b2(a,b,c,d,e,f){var _=this _.e=a _.f=b _.a=c _.b=d _.c=e _.d=f}, bF:function bF(a,b,c,d,e){var _=this _.f=a _.a=b _.b=c _.c=d _.d=e}, bV:function bV(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, c2:function c2(a){this.a=a}, c_:function c_(a){this.a=a}, b5:function b5(a){this.a=a}, bD:function bD(a){this.a=a}, bW:function bW(){}, b4:function b4(){}, d9:function d9(a){this.a=a}, cw:function cw(a,b,c){this.a=a this.b=b this.c=c}, n:function n(){}, u:function u(){}, l:function l(){}, cj:function cj(){}, y:function y(a){this.a=a}, d_:function d_(a){this.a=a}, cX:function cX(a){this.a=a}, cY:function cY(a){this.a=a}, cZ:function cZ(a,b){this.a=a this.b=b}, bn:function bn(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f _.r=g _.z=_.y=_.w=$}, dC:function dC(a,b){this.a=a this.b=b}, dB:function dB(a){this.a=a}, cW:function cW(a,b,c){this.a=a this.b=b this.c=c}, dP:function dP(a){this.a=a}, dQ:function dQ(){}, dR:function dR(){}, ch:function ch(a,b,c,d,e,f,g,h){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f _.r=g _.w=h _.x=null}, c9:function c9(a,b,c,d,e,f,g){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f _.r=g _.z=_.y=_.w=$}, iY(a){var s,r=a.$dart_jsFunction if(r!=null)return r s=function(b,c){return function(){return b(c,Array.prototype.slice.apply(arguments))}}(A.iW,a) s[$.eK()]=a a.$dart_jsFunction=s return s}, iW(a,b){return A.i1(a,b,null)}, ab(a){if(typeof a=="function")return a else return A.iY(a)}, eb(a,b){var s=new A.v($.r,b.i("v<0>")),r=new A.b7(s,b.i("b7<0>")) a.then(A.aF(new A.ec(r),1),A.aF(new A.ed(r),1)) return s}, ec:function ec(a){this.a=a}, ed:function ed(a){this.a=a}, cN:function cN(a){this.a=a}, m:function m(a,b){this.a=a this.b=b}, hL(a){var s,r,q,p,o,n,m,l,k="enclosedBy" if(a.k(0,k)!=null){s=t.a.a(a.k(0,k)) r=new A.cu(A.fG(s.k(0,"name")),B.q[A.fE(s.k(0,"kind"))],A.fG(s.k(0,"href")))}else r=null q=a.k(0,"name") p=a.k(0,"qualifiedName") o=A.fF(a.k(0,"packageRank")) if(o==null)o=0 n=a.k(0,"href") m=B.q[A.fE(a.k(0,"kind"))] l=A.fF(a.k(0,"overriddenDepth")) if(l==null)l=0 return new A.w(q,p,o,m,n,l,a.k(0,"desc"),r)}, A:function A(a,b){this.a=a this.b=b}, cz:function cz(a){this.a=a}, cC:function cC(a,b){this.a=a this.b=b}, cA:function cA(){}, cB:function cB(){}, w:function w(a,b,c,d,e,f,g,h){var _=this _.a=a _.b=b _.c=c _.d=d _.e=e _.f=f _.r=g _.w=h}, cu:function cu(a,b,c){this.a=a this.b=b this.c=c}, jN(){var s=self,r=s.document.getElementById("search-box"),q=s.document.getElementById("search-body"),p=s.document.getElementById("search-sidebar") A.eb(s.window.fetch($.bw()+"index.json"),t.m).ar(new A.e5(new A.e6(r,q,p),r,q,p),t.P)}, eo(a){var s=A.h([],t.O),r=A.h([],t.M) return new A.ds(a,A.c4(self.window.location.href),s,r)}, iZ(a,b){var s,r,q,p,o,n,m,l,k=self,j=k.document.createElement("div"),i=b.e if(i==null)i="" j.setAttribute("data-href",i) j.classList.add("tt-suggestion") s=k.document.createElement("span") s.classList.add("tt-suggestion-title") s.innerHTML=A.ex(b.a+" "+b.d.h(0).toLowerCase(),a) j.appendChild(s) r=b.w i=r!=null if(i){q=k.document.createElement("span") q.classList.add("tt-suggestion-container") q.innerHTML="(in "+A.ex(r.a,a)+")" j.appendChild(q)}p=b.r if(p!=null&&p.length!==0){o=k.document.createElement("blockquote") o.classList.add("one-line-description") q=k.document.createElement("textarea") q.innerHTML=p o.setAttribute("title",q.value) o.innerHTML=A.ex(p,a) j.appendChild(o)}q=t.g j.addEventListener("mousedown",q.a(A.ab(new A.dN()))) j.addEventListener("click",q.a(A.ab(new A.dO(b)))) if(i){i=r.a q=r.b.h(0) n=r.c m=k.document.createElement("div") m.classList.add("tt-container") l=k.document.createElement("p") l.textContent="Results from " l.classList.add("tt-container-text") k=k.document.createElement("a") k.setAttribute("href",n) k.innerHTML=i+" "+q l.appendChild(k) m.appendChild(l) A.jm(m,j)}return j}, jm(a,b){var s,r=a.innerHTML if(r.length===0)return s=$.bq.k(0,r) if(s!=null)s.appendChild(b) else{a.appendChild(b) $.bq.q(0,r,a)}}, ex(a,b){return A.k3(a,A.f6(b,!1),new A.dS(),null)}, dT:function dT(){}, e6:function e6(a,b,c){this.a=a this.b=b this.c=c}, e5:function e5(a,b,c,d){var _=this _.a=a _.b=b _.c=c _.d=d}, ds:function ds(a,b,c,d){var _=this _.a=a _.b=b _.e=_.d=_.c=$ _.f=null _.r="" _.w=c _.x=d _.y=-1}, dt:function dt(a){this.a=a}, du:function du(a,b){this.a=a this.b=b}, dv:function dv(a,b){this.a=a this.b=b}, dw:function dw(a,b){this.a=a this.b=b}, dx:function dx(a,b){this.a=a this.b=b}, dN:function dN(){}, dO:function dO(a){this.a=a}, dS:function dS(){}, j6(){var s=self,r=s.document.getElementById("sidenav-left-toggle"),q=s.document.querySelector(".sidebar-offcanvas-left"),p=s.document.getElementById("overlay-under-drawer"),o=t.g.a(A.ab(new A.dU(q,p))) if(p!=null)p.addEventListener("click",o) if(r!=null)r.addEventListener("click",o)}, j5(){var s,r,q,p,o=self,n=o.document.body if(n==null)return s=n.getAttribute("data-using-base-href") if(s==null)return if(s!=="true"){r=n.getAttribute("data-base-href") if(r==null)return q=r}else q="" p=o.document.getElementById("dartdoc-main-content") if(p==null)return A.fR(q,p.getAttribute("data-above-sidebar"),o.document.getElementById("dartdoc-sidebar-left-content")) A.fR(q,p.getAttribute("data-below-sidebar"),o.document.getElementById("dartdoc-sidebar-right"))}, fR(a,b,c){if(b==null||b.length===0||c==null)return A.eb(self.window.fetch(a+A.i(b)),t.m).ar(new A.dV(c,a),t.P)}, fY(a,b){var s,r,q,p if(b.nodeName.toLowerCase()==="a"){s=b.getAttribute("href") if(s!=null)if(!A.c4(s).gaX())b.href=a+s}r=b.childNodes for(q=0;q").A(b).i("M<1,2>"))}, ad(a,b){if(!!a.fixed$length)A.aH(A.T("add")) a.push(b)}, aI(a,b){var s if(!!a.fixed$length)A.aH(A.T("addAll")) if(Array.isArray(b)){this.bg(a,b) return}for(s=J.L(b);s.m();)a.push(s.gp())}, bg(a,b){var s,r=b.length if(r===0)return if(a===b)throw A.a(A.as(a)) for(s=0;ss)throw A.a(A.H(b,0,s,"start",null)) if(cs)throw A.a(A.H(c,b,s,"end",null)) if(b===c)return A.h([],A.am(a)) return A.h(a.slice(b,c),A.am(a))}, gbF(a){if(a.length>0)return a[0] throw A.a(A.eV())}, ga_(a){var s=a.length if(s>0)return a[s-1] throw A.a(A.eV())}, bc(a,b){var s,r,q,p,o if(!!a.immutable$list)A.aH(A.T("sort")) s=a.length if(s<2)return if(b==null)b=J.ja() if(s===2){r=a[0] q=a[1] if(b.$2(r,q)>0){a[0]=q a[1]=r}return}if(A.am(a).c.b(null)){for(p=0,o=0;o0)this.bt(a,p)}, bt(a,b){var s,r=a.length for(;s=r-1,r>0;r=s)if(a[s]===null){a[s]=void 0;--b if(b===0)break}}, h(a){return A.eW(a,"[","]")}, gB(a){return new J.ar(a,a.length,A.am(a).i("ar<1>"))}, gn(a){return A.bY(a)}, gl(a){return a.length}, k(a,b){if(!(b>=0&&b=0&&b=p){r.d=null return!1}r.d=q[s] r.c=s+1 return!0}} J.aR.prototype={ aL(a,b){var s if(ab)return 1 else if(a===b){if(a===0){s=this.gam(b) if(this.gam(a)===s)return 0 if(this.gam(a))return-1 return 1}return 0}else if(isNaN(a)){if(isNaN(b))return 0 return 1}else return-1}, gam(a){return a===0?1/a<0:a<0}, h(a){if(a===0&&1/a<0)return"-0.0" else return""+a}, gn(a){var s,r,q,p,o=a|0 if(a===o)return o&536870911 s=Math.abs(a) r=Math.log(s)/0.6931471805599453|0 q=Math.pow(2,r) p=s<1?s/q:q/s return((p*9007199254740992|0)+(p*3542243181176521|0))*599197+r*1259&536870911}, a1(a,b){var s=a%b if(s===0)return 0 if(s>0)return s return s+b}, bw(a,b){return(a|0)===a?a/b|0:this.bx(a,b)}, bx(a,b){var s=a/b if(s>=-2147483648&&s<=2147483647)return s|0 if(s>0){if(s!==1/0)return Math.floor(s)}else if(s>-1/0)return Math.ceil(s) throw A.a(A.T("Result of truncating division is "+A.i(s)+": "+A.i(a)+" ~/ "+b))}, V(a,b){var s if(a>0)s=this.aF(a,b) else{s=b>31?31:b s=a>>s>>>0}return s}, bv(a,b){if(0>b)throw A.a(A.jz(b)) return this.aF(a,b)}, aF(a,b){return b>31?0:a>>>b}, gt(a){return A.an(t.H)}, $it:1} J.aP.prototype={ gt(a){return A.an(t.S)}, $ij:1, $ib:1} J.bI.prototype={ gt(a){return A.an(t.i)}, $ij:1} J.ai.prototype={ b6(a,b){return a+b}, J(a,b,c,d){var s=A.b3(b,c,a.length) return a.substring(0,b)+d+a.substring(s)}, v(a,b,c){var s if(c<0||c>a.length)throw A.a(A.H(c,0,a.length,null,null)) s=c+b.length if(s>a.length)return!1 return b===a.substring(c,s)}, u(a,b){return this.v(a,b,0)}, j(a,b,c){return a.substring(b,A.b3(b,c,a.length))}, K(a,b){return this.j(a,b,null)}, b9(a,b){var s,r if(0>=b)return"" if(b===1||a.length===0)return a if(b!==b>>>0)throw A.a(B.F) for(s=a,r="";!0;){if((b&1)===1)r=s+r b=b>>>1 if(b===0)break s+=s}return r}, Z(a,b,c){var s if(c<0||c>a.length)throw A.a(A.H(c,0,a.length,null,null)) s=a.indexOf(b,c) return s}, aU(a,b){return this.Z(a,b,0)}, ag(a,b){return A.k2(a,b,0)}, aL(a,b){var s if(a===b)s=0 else s=a>6}r=r+((r&67108863)<<3)&536870911 r^=r>>11 return r+((r&16383)<<15)&536870911}, gt(a){return A.an(t.N)}, gl(a){return a.length}, $ij:1, $id:1} A.a8.prototype={ gB(a){var s=A.E(this) return new A.bA(J.L(this.gN()),s.i("@<1>").A(s.y[1]).i("bA<1,2>"))}, gl(a){return J.aI(this.gN())}, E(a,b){return A.E(this).y[1].a(J.ef(this.gN(),b))}, h(a){return J.aq(this.gN())}} A.bA.prototype={ m(){return this.a.m()}, gp(){return this.$ti.y[1].a(this.a.gp())}} A.af.prototype={ gN(){return this.a}} A.b9.prototype={$ic:1} A.b8.prototype={ k(a,b){return this.$ti.y[1].a(J.hr(this.a,b))}, q(a,b,c){J.hs(this.a,b,this.$ti.c.a(c))}, $ic:1, $if:1} A.M.prototype={ X(a,b){return new A.M(this.a,this.$ti.i("@<1>").A(b).i("M<1,2>"))}, gN(){return this.a}} A.aV.prototype={ h(a){return"LateInitializationError: "+this.a}} A.bB.prototype={ gl(a){return this.a.length}, k(a,b){return this.a.charCodeAt(b)}} A.cR.prototype={} A.c.prototype={} A.J.prototype={ gB(a){var s=this return new A.au(s,s.gl(s),A.E(s).i("au"))}} A.au.prototype={ gp(){var s=this.d return s==null?this.$ti.c.a(s):s}, m(){var s,r=this,q=r.a,p=J.ao(q),o=p.gl(q) if(r.b!==o)throw A.a(A.as(q)) s=r.c if(s>=o){r.d=null return!1}r.d=p.E(q,s);++r.c return!0}} A.aj.prototype={ gB(a){var s=A.E(this) return new A.av(J.L(this.a),this.b,s.i("@<1>").A(s.y[1]).i("av<1,2>"))}, gl(a){return J.aI(this.a)}, E(a,b){return this.b.$1(J.ef(this.a,b))}} A.aM.prototype={$ic:1} A.av.prototype={ m(){var s=this,r=s.b if(r.m()){s.a=s.c.$1(r.gp()) return!0}s.a=null return!1}, gp(){var s=this.a return s==null?this.$ti.y[1].a(s):s}} A.ak.prototype={ gl(a){return J.aI(this.a)}, E(a,b){return this.b.$1(J.ef(this.a,b))}} A.aO.prototype={} A.c1.prototype={ q(a,b,c){throw A.a(A.T("Cannot modify an unmodifiable list"))}} A.ay.prototype={} A.a5.prototype={ gn(a){var s=this._hashCode if(s!=null)return s s=664597*B.a.gn(this.a)&536870911 this._hashCode=s return s}, h(a){return'Symbol("'+this.a+'")'}, F(a,b){if(b==null)return!1 return b instanceof A.a5&&this.a===b.a}, $ib6:1} A.bp.prototype={} A.cg.prototype={$r:"+item,matchPosition(1,2)",$s:1} A.aL.prototype={} A.aK.prototype={ h(a){return A.ek(this)}, q(a,b,c){A.hG()}, $ix:1} A.ah.prototype={ gl(a){return this.b.length}, gbq(){var s=this.$keys if(s==null){s=Object.keys(this.a) this.$keys=s}return s}, H(a){if("__proto__"===a)return!1 return this.a.hasOwnProperty(a)}, k(a,b){if(!this.H(b))return null return this.b[this.a[b]]}, C(a,b){var s,r,q=this.gbq(),p=this.b for(s=q.length,r=0;r>>0}, h(a){return"Closure '"+this.$_name+"' of "+("Instance of '"+A.cQ(this.a)+"'")}} A.c8.prototype={ h(a){return"Reading static variable '"+this.a+"' during its initialization"}} A.bZ.prototype={ h(a){return"RuntimeError: "+this.a}} A.dp.prototype={} A.N.prototype={ gl(a){return this.a}, gO(){return new A.O(this,A.E(this).i("O<1>"))}, gb5(){var s=A.E(this) return A.hW(new A.O(this,s.i("O<1>")),new A.cG(this),s.c,s.y[1])}, H(a){var s=this.b if(s==null)return!1 return s[a]!=null}, k(a,b){var s,r,q,p,o=null if(typeof b=="string"){s=this.b if(s==null)return o r=s[b] q=r==null?o:r.b return q}else if(typeof b=="number"&&(b&0x3fffffff)===b){p=this.c if(p==null)return o r=p[b] q=r==null?o:r.b return q}else return this.bL(b)}, bL(a){var s,r,q=this.d if(q==null)return null s=q[this.aV(a)] r=this.aW(s,a) if(r<0)return null return s[r].b}, q(a,b,c){var s,r,q,p,o,n,m=this if(typeof b=="string"){s=m.b m.av(s==null?m.b=m.a8():s,b,c)}else if(typeof b=="number"&&(b&0x3fffffff)===b){r=m.c m.av(r==null?m.c=m.a8():r,b,c)}else{q=m.d if(q==null)q=m.d=m.a8() p=m.aV(b) o=q[p] if(o==null)q[p]=[m.a9(b,c)] else{n=m.aW(o,b) if(n>=0)o[n].b=c else o.push(m.a9(b,c))}}}, Y(a){var s=this if(s.a>0){s.b=s.c=s.d=s.e=s.f=null s.a=0 s.aC()}}, C(a,b){var s=this,r=s.e,q=s.r for(;r!=null;){b.$2(r.a,r.b) if(q!==s.r)throw A.a(A.as(s)) r=r.c}}, av(a,b,c){var s=a[b] if(s==null)a[b]=this.a9(b,c) else s.b=c}, aC(){this.r=this.r+1&1073741823}, a9(a,b){var s=this,r=new A.cJ(a,b) if(s.e==null)s.e=s.f=r else s.f=s.f.c=r;++s.a s.aC() return r}, aV(a){return J.Z(a)&1073741823}, aW(a,b){var s,r if(a==null)return-1 s=a.length for(r=0;r"]=s delete s[""] return s}} A.cG.prototype={ $1(a){var s=this.a,r=s.k(0,a) return r==null?A.E(s).y[1].a(r):r}, $S(){return A.E(this.a).i("2(1)")}} A.cJ.prototype={} A.O.prototype={ gl(a){return this.a.a}, gB(a){var s=this.a,r=new A.bK(s,s.r) r.c=s.e return r}} A.bK.prototype={ gp(){return this.d}, m(){var s,r=this,q=r.a if(r.b!==q.r)throw A.a(A.as(q)) s=r.c if(s==null){r.d=null return!1}else{r.d=s.a r.c=s.c return!0}}} A.e1.prototype={ $1(a){return this.a(a)}, $S:10} A.e2.prototype={ $2(a,b){return this.a(a,b)}, $S:11} A.e3.prototype={ $1(a){return this.a(a)}, $S:12} A.bf.prototype={ h(a){return this.aH(!1)}, aH(a){var s,r,q,p,o,n=this.bo(),m=this.aB(),l=(a?""+"Record ":"")+"(" for(s=n.length,r="",q=0;q0;){--q;--s j[q]=r[s]}}return J.eY(A.hV(j,!1,k))}} A.cf.prototype={ aB(){return[this.a,this.b]}, F(a,b){if(b==null)return!1 return b instanceof A.cf&&this.$s===b.$s&&J.F(this.a,b.a)&&J.F(this.b,b.b)}, gn(a){return A.hZ(this.$s,this.a,this.b,B.i)}} A.cE.prototype={ h(a){return"RegExp/"+this.a+"/"+this.b.flags}, gbr(){var s=this,r=s.c if(r!=null)return r r=s.b return s.c=A.eZ(s.a,r.multiline,!r.ignoreCase,r.unicode,r.dotAll,!0)}, bn(a,b){var s,r=this.gbr() r.lastIndex=b s=r.exec(a) if(s==null)return null return new A.ce(s)}} A.ce.prototype={ gbD(){var s=this.b return s.index+s[0].length}, k(a,b){return this.b[b]}, $icL:1, $iel:1} A.d3.prototype={ gp(){var s=this.d return s==null?t.F.a(s):s}, m(){var s,r,q,p,o,n=this,m=n.b if(m==null)return!1 s=n.c r=m.length if(s<=r){q=n.a p=q.bn(m,s) if(p!=null){n.d=p o=p.gbD() if(p.b.index===o){if(q.b.unicode){s=n.c q=s+1 if(q=55296&&s<=56319){s=m.charCodeAt(q) s=s>=56320&&s<=57343}else s=!1}else s=!1}else s=!1 o=(s?o+1:o)+1}n.c=o return!0}}n.b=n.d=null return!1}} A.bM.prototype={ gt(a){return B.ad}, $ij:1} A.aZ.prototype={} A.bN.prototype={ gt(a){return B.ae}, $ij:1} A.aw.prototype={ gl(a){return a.length}, $iD:1} A.aX.prototype={ k(a,b){A.V(b,a,a.length) return a[b]}, q(a,b,c){A.V(b,a,a.length) a[b]=c}, $ic:1, $if:1} A.aY.prototype={ q(a,b,c){A.V(b,a,a.length) a[b]=c}, $ic:1, $if:1} A.bO.prototype={ gt(a){return B.af}, $ij:1} A.bP.prototype={ gt(a){return B.ag}, $ij:1} A.bQ.prototype={ gt(a){return B.ah}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1} A.bR.prototype={ gt(a){return B.ai}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1} A.bS.prototype={ gt(a){return B.aj}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1} A.bT.prototype={ gt(a){return B.al}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1} A.bU.prototype={ gt(a){return B.am}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1} A.b_.prototype={ gt(a){return B.an}, gl(a){return a.length}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1} A.b0.prototype={ gt(a){return B.ao}, gl(a){return a.length}, k(a,b){A.V(b,a,a.length) return a[b]}, $ij:1, $ial:1} A.bb.prototype={} A.bc.prototype={} A.bd.prototype={} A.be.prototype={} A.I.prototype={ i(a){return A.bl(v.typeUniverse,this,a)}, A(a){return A.ft(v.typeUniverse,this,a)}} A.cb.prototype={} A.dA.prototype={ h(a){return A.C(this.a,null)}} A.ca.prototype={ h(a){return this.a}} A.bh.prototype={$iR:1} A.d5.prototype={ $1(a){var s=this.a,r=s.a s.a=null r.$0()}, $S:5} A.d4.prototype={ $1(a){var s,r this.a.a=a s=this.b r=this.c s.firstChild?s.removeChild(r):s.appendChild(r)}, $S:13} A.d6.prototype={ $0(){this.a.$0()}, $S:6} A.d7.prototype={ $0(){this.a.$0()}, $S:6} A.dy.prototype={ bf(a,b){if(self.setTimeout!=null)self.setTimeout(A.aF(new A.dz(this,b),0),a) else throw A.a(A.T("`setTimeout()` not found."))}} A.dz.prototype={ $0(){this.b.$0()}, $S:0} A.c5.prototype={ ae(a){var s,r=this if(a==null)a=r.$ti.c.a(a) if(!r.b)r.a.aw(a) else{s=r.a if(r.$ti.i("a0<1>").b(a))s.az(a) else s.a4(a)}}, af(a,b){var s=this.a if(this.b)s.L(a,b) else s.S(a,b)}} A.dK.prototype={ $1(a){return this.a.$2(0,a)}, $S:3} A.dL.prototype={ $2(a,b){this.a.$2(1,new A.aN(a,b))}, $S:14} A.dY.prototype={ $2(a,b){this.a(a,b)}, $S:15} A.bz.prototype={ h(a){return A.i(this.a)}, $ik:1, gR(){return this.b}} A.c7.prototype={ af(a,b){var s A.cn(a,"error",t.K) s=this.a if((s.a&30)!==0)throw A.a(A.fa("Future already completed")) if(b==null)b=A.eN(a) s.S(a,b)}, aM(a){return this.af(a,null)}} A.b7.prototype={ ae(a){var s=this.a if((s.a&30)!==0)throw A.a(A.fa("Future already completed")) s.aw(a)}} A.az.prototype={ bM(a){if((this.c&15)!==6)return!0 return this.b.b.aq(this.d,a.a)}, bI(a){var s,r=this.e,q=null,p=a.a,o=this.b.b if(t.C.b(r))q=o.bU(r,p,a.b) else q=o.aq(r,p) try{p=q return p}catch(s){if(t.c.b(A.ae(s))){if((this.c&1)!==0)throw A.a(A.a_("The error handler of Future.then must return a value of the returned future's type","onError")) throw A.a(A.a_("The error handler of Future.catchError must return a value of the future's type","onError"))}else throw s}}} A.v.prototype={ aE(a){this.a=this.a&1|4 this.c=a}, au(a,b,c){var s,r,q=$.r if(q===B.d){if(b!=null&&!t.C.b(b)&&!t.v.b(b))throw A.a(A.eM(b,"onError",u.c))}else if(b!=null)b=A.jq(b,q) s=new A.v(q,c.i("v<0>")) r=b==null?1:3 this.a3(new A.az(s,r,a,b,this.$ti.i("@<1>").A(c).i("az<1,2>"))) return s}, ar(a,b){return this.au(a,null,b)}, aG(a,b,c){var s=new A.v($.r,c.i("v<0>")) this.a3(new A.az(s,19,a,b,this.$ti.i("@<1>").A(c).i("az<1,2>"))) return s}, bu(a){this.a=this.a&1|16 this.c=a}, T(a){this.a=a.a&30|this.a&1 this.c=a.c}, a3(a){var s=this,r=s.a if(r<=3){a.a=s.c s.c=a}else{if((r&4)!==0){r=s.c if((r.a&24)===0){r.a3(a) return}s.T(r)}A.aC(null,null,s.b,new A.da(s,a))}}, aa(a){var s,r,q,p,o,n=this,m={} m.a=a if(a==null)return s=n.a if(s<=3){r=n.c n.c=a if(r!=null){q=a.a for(p=a;q!=null;p=q,q=o)o=q.a p.a=r}}else{if((s&4)!==0){s=n.c if((s.a&24)===0){s.aa(a) return}n.T(s)}m.a=n.U(a) A.aC(null,null,n.b,new A.dh(m,n))}}, ab(){var s=this.c this.c=null return this.U(s)}, U(a){var s,r,q for(s=a,r=null;s!=null;r=s,s=q){q=s.a s.a=r}return r}, bi(a){var s,r,q,p=this p.a^=2 try{a.au(new A.de(p),new A.df(p),t.P)}catch(q){s=A.ae(q) r=A.ac(q) A.k0(new A.dg(p,s,r))}}, a4(a){var s=this,r=s.ab() s.a=8 s.c=a A.ba(s,r)}, L(a,b){var s=this.ab() this.bu(A.cp(a,b)) A.ba(this,s)}, aw(a){if(this.$ti.i("a0<1>").b(a)){this.az(a) return}this.bh(a)}, bh(a){this.a^=2 A.aC(null,null,this.b,new A.dc(this,a))}, az(a){if(this.$ti.b(a)){A.ig(a,this) return}this.bi(a)}, S(a,b){this.a^=2 A.aC(null,null,this.b,new A.db(this,a,b))}, $ia0:1} A.da.prototype={ $0(){A.ba(this.a,this.b)}, $S:0} A.dh.prototype={ $0(){A.ba(this.b,this.a.a)}, $S:0} A.de.prototype={ $1(a){var s,r,q,p=this.a p.a^=2 try{p.a4(p.$ti.c.a(a))}catch(q){s=A.ae(q) r=A.ac(q) p.L(s,r)}}, $S:5} A.df.prototype={ $2(a,b){this.a.L(a,b)}, $S:16} A.dg.prototype={ $0(){this.a.L(this.b,this.c)}, $S:0} A.dd.prototype={ $0(){A.fj(this.a.a,this.b)}, $S:0} A.dc.prototype={ $0(){this.a.a4(this.b)}, $S:0} A.db.prototype={ $0(){this.a.L(this.b,this.c)}, $S:0} A.dk.prototype={ $0(){var s,r,q,p,o,n,m=this,l=null try{q=m.a.a l=q.b.b.bS(q.d)}catch(p){s=A.ae(p) r=A.ac(p) q=m.c&&m.b.a.c.a===s o=m.a if(q)o.c=m.b.a.c else o.c=A.cp(s,r) o.b=!0 return}if(l instanceof A.v&&(l.a&24)!==0){if((l.a&16)!==0){q=m.a q.c=l.c q.b=!0}return}if(l instanceof A.v){n=m.b.a q=m.a q.c=l.ar(new A.dl(n),t.z) q.b=!1}}, $S:0} A.dl.prototype={ $1(a){return this.a}, $S:17} A.dj.prototype={ $0(){var s,r,q,p,o try{q=this.a p=q.a q.c=p.b.b.aq(p.d,this.b)}catch(o){s=A.ae(o) r=A.ac(o) q=this.a q.c=A.cp(s,r) q.b=!0}}, $S:0} A.di.prototype={ $0(){var s,r,q,p,o,n,m=this try{s=m.a.a.c p=m.b if(p.a.bM(s)&&p.a.e!=null){p.c=p.a.bI(s) p.b=!1}}catch(o){r=A.ae(o) q=A.ac(o) p=m.a.a.c n=m.b if(p.a===r)n.c=p else n.c=A.cp(r,q) n.b=!0}}, $S:0} A.c6.prototype={} A.ci.prototype={} A.dJ.prototype={} A.dW.prototype={ $0(){A.hI(this.a,this.b)}, $S:0} A.dq.prototype={ bW(a){var s,r,q try{if(B.d===$.r){a.$0() return}A.fT(null,null,this,a)}catch(q){s=A.ae(q) r=A.ac(q) A.eB(s,r)}}, aJ(a){return new A.dr(this,a)}, bT(a){if($.r===B.d)return a.$0() return A.fT(null,null,this,a)}, bS(a){return this.bT(a,t.z)}, bX(a,b){if($.r===B.d)return a.$1(b) return A.js(null,null,this,a,b)}, aq(a,b){var s=t.z return this.bX(a,b,s,s)}, bV(a,b,c){if($.r===B.d)return a.$2(b,c) return A.jr(null,null,this,a,b,c)}, bU(a,b,c){var s=t.z return this.bV(a,b,c,s,s,s)}, bR(a){return a}, b1(a){var s=t.z return this.bR(a,s,s,s)}} A.dr.prototype={ $0(){return this.a.bW(this.b)}, $S:0} A.e.prototype={ gB(a){return new A.au(a,this.gl(a),A.aG(a).i("au"))}, E(a,b){return this.k(a,b)}, X(a,b){return new A.M(a,A.aG(a).i("@").A(b).i("M<1,2>"))}, bE(a,b,c,d){var s A.b3(b,c,this.gl(a)) for(s=b;s"))}return new A.cd(this)}, q(a,b,c){var s,r,q=this if(q.b==null)q.c.q(0,b,c) else if(q.H(b)){s=q.b s[b]=c r=q.a if(r==null?s!=null:r!==s)r[b]=null}else q.by().q(0,b,c)}, H(a){if(this.b==null)return this.c.H(a) return Object.prototype.hasOwnProperty.call(this.a,a)}, C(a,b){var s,r,q,p,o=this if(o.b==null)return o.c.C(0,b) s=o.M() for(r=0;r"))}return s}} A.dG.prototype={ $0(){var s,r try{s=new TextDecoder("utf-8",{fatal:true}) return s}catch(r){}return null}, $S:7} A.dF.prototype={ $0(){var s,r try{s=new TextDecoder("utf-8",{fatal:false}) return s}catch(r){}return null}, $S:7} A.cq.prototype={ bP(a0,a1,a2){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a="Invalid base64 encoding length " a2=A.b3(a1,a2,a0.length) s=$.hk() for(r=a1,q=r,p=null,o=-1,n=-1,m=0;r=0){g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charCodeAt(f) if(g===k)continue k=g}else{if(f===-1){if(o<0){e=p==null?null:p.a.length if(e==null)e=0 o=e+(r-q) n=r}++m if(k===61)continue}k=g}if(f!==-2){if(p==null){p=new A.y("") e=p}else e=p e.a+=B.a.j(a0,q,r) d=A.Q(k) e.a+=d q=l continue}}throw A.a(A.z("Invalid base64 data",a0,r))}if(p!=null){e=B.a.j(a0,q,a2) e=p.a+=e d=e.length if(o>=0)A.eO(a0,n,a2,o,m,d) else{c=B.c.a1(d-1,4)+1 if(c===1)throw A.a(A.z(a,a0,a2)) for(;c<4;){e+="=" p.a=e;++c}}e=p.a return B.a.J(a0,a1,a2,e.charCodeAt(0)==0?e:e)}b=a2-a1 if(o>=0)A.eO(a0,n,a2,o,m,b) else{c=B.c.a1(b,4) if(c===1)throw A.a(A.z(a,a0,a2)) if(c>1)a0=B.a.J(a0,a2,a2,c===2?"==":"=")}return a0}} A.cr.prototype={} A.bC.prototype={} A.bE.prototype={} A.cv.prototype={} A.cy.prototype={ h(a){return"unknown"}} A.cx.prototype={ I(a){var s=this.bl(a,0,a.length) return s==null?a:s}, bl(a,b,c){var s,r,q,p for(s=b,r=null;s":q=">" break case"/":q="/" break default:q=null}if(q!=null){if(r==null)r=new A.y("") if(s>b)r.a+=B.a.j(a,b,s) r.a+=q b=s+1}}if(r==null)return null if(c>b){p=B.a.j(a,b,c) r.a+=p}p=r.a return p.charCodeAt(0)==0?p:p}} A.cH.prototype={ bA(a,b){var s=A.jo(a,this.gbC().a) return s}, gbC(){return B.L}} A.cI.prototype={} A.d0.prototype={} A.d2.prototype={ I(a){var s,r,q,p=A.b3(0,null,a.length) if(p===0)return new Uint8Array(0) s=p*3 r=new Uint8Array(s) q=new A.dH(r) if(q.bp(a,0,p)!==p)q.ac() return new Uint8Array(r.subarray(0,A.iX(0,q.b,s)))}} A.dH.prototype={ ac(){var s=this,r=s.c,q=s.b,p=s.b=q+1 r[q]=239 q=s.b=p+1 r[p]=191 s.b=q+1 r[q]=189}, bz(a,b){var s,r,q,p,o=this if((b&64512)===56320){s=65536+((a&1023)<<10)|b&1023 r=o.c q=o.b p=o.b=q+1 r[q]=s>>>18|240 q=o.b=p+1 r[p]=s>>>12&63|128 p=o.b=q+1 r[q]=s>>>6&63|128 o.b=p+1 r[p]=s&63|128 return!0}else{o.ac() return!1}}, bp(a,b,c){var s,r,q,p,o,n,m,l=this if(b!==c&&(a.charCodeAt(c-1)&64512)===55296)--c for(s=l.c,r=s.length,q=b;q=r)break l.b=o+1 s[o]=p}else{o=p&64512 if(o===55296){if(l.b+4>r)break n=q+1 if(l.bz(p,a.charCodeAt(n)))q=n}else if(o===56320){if(l.b+3>r)break l.ac()}else if(p<=2047){o=l.b m=o+1 if(m>=r)break l.b=m s[o]=p>>>6|192 l.b=m+1 s[m]=p&63|128}else{o=l.b if(o+2>=r)break m=l.b=o+1 s[o]=p>>>12|224 o=l.b=m+1 s[m]=p>>>6&63|128 l.b=o+1 s[o]=p&63|128}}}return q}} A.d1.prototype={ I(a){return new A.dE(this.a).bm(a,0,null,!0)}} A.dE.prototype={ bm(a,b,c,d){var s,r,q,p,o,n,m=this,l=A.b3(b,c,J.aI(a)) if(b===l)return"" if(a instanceof Uint8Array){s=a r=s q=0}else{r=A.iQ(a,b,l) l-=b q=b b=0}if(l-b>=15){p=m.a o=A.iP(p,r,b,l) if(o!=null){if(!p)return o if(o.indexOf("\ufffd")<0)return o}}o=m.a5(r,b,l,!0) p=m.b if((p&1)!==0){n=A.iR(p) m.b=0 throw A.a(A.z(n,a,q+m.c))}return o}, a5(a,b,c,d){var s,r,q=this if(c-b>1000){s=B.c.bw(b+c,2) r=q.a5(a,b,s,!1) if((q.b&1)!==0)return r return r+q.a5(a,s,c,d)}return q.bB(a,b,c,d)}, bB(a,b,c,d){var s,r,q,p,o,n,m,l=this,k=65533,j=l.b,i=l.c,h=new A.y(""),g=b+1,f=a[b] $label0$0:for(s=l.a;!0;){for(;!0;g=p){r="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFFFFFFFFFFFFFFFFGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHIHHHJEEBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBKCCCCCCCCCCCCDCLONNNMEEEEEEEEEEE".charCodeAt(f)&31 i=j<=32?f&61694>>>r:(f&63|i<<6)>>>0 j=" \x000:XECCCCCN:lDb \x000:XECCCCCNvlDb \x000:XECCCCCN:lDb AAAAA\x00\x00\x00\x00\x00AAAAA00000AAAAA:::::AAAAAGG000AAAAA00KKKAAAAAG::::AAAAA:IIIIAAAAA000\x800AAAAA\x00\x00\x00\x00 AAAAA".charCodeAt(j+r) if(j===0){q=A.Q(i) h.a+=q if(g===c)break $label0$0 break}else if((j&1)!==0){if(s)switch(j){case 69:case 67:q=A.Q(k) h.a+=q break case 65:q=A.Q(k) h.a+=q;--g break default:q=A.Q(k) q=h.a+=q h.a=q+A.Q(k) break}else{l.b=j l.c=g-1 return""}j=0}if(g===c)break $label0$0 p=g+1 f=a[g]}p=g+1 f=a[g] if(f<128){while(!0){if(!(p=128){o=n-1 p=n break}p=n}if(o-g<20)for(m=g;m32)if(s){s=A.Q(k) h.a+=s}else{l.b=77 l.c=c return""}l.b=j l.c=i s=h.a return s.charCodeAt(0)==0?s:s}} A.cM.prototype={ $2(a,b){var s=this.b,r=this.a,q=s.a+=r.a q+=a.a s.a=q s.a=q+": " q=A.at(b) s.a+=q r.a=", "}, $S:19} A.dD.prototype={ $2(a,b){var s,r if(typeof b=="string")this.a.set(a,b) else if(b==null)this.a.set(a,"") else for(s=J.L(b),r=this.a;s.m();){b=s.gp() if(typeof b=="string")r.append(a,b) else if(b==null)r.append(a,"") else A.iT(b)}}, $S:2} A.d8.prototype={ h(a){return this.aA()}} A.k.prototype={ gR(){return A.i2(this)}} A.bx.prototype={ h(a){var s=this.a if(s!=null)return"Assertion failed: "+A.at(s) return"Assertion failed"}} A.R.prototype={} A.G.prototype={ ga7(){return"Invalid argument"+(!this.a?"(s)":"")}, ga6(){return""}, h(a){var s=this,r=s.c,q=r==null?"":" ("+r+")",p=s.d,o=p==null?"":": "+p,n=s.ga7()+q+o if(!s.a)return n return n+s.ga6()+": "+A.at(s.gal())}, gal(){return this.b}} A.b2.prototype={ gal(){return this.b}, ga7(){return"RangeError"}, ga6(){var s,r=this.e,q=this.f if(r==null)s=q!=null?": Not less than or equal to "+A.i(q):"" else if(q==null)s=": Not greater than or equal to "+A.i(r) else if(q>r)s=": Not in inclusive range "+A.i(r)+".."+A.i(q) else s=qe.length else s=!1 if(s)f=null if(f==null){if(e.length>78)e=B.a.j(e,0,75)+"..." return g+"\n"+e}for(r=1,q=0,p=!1,o=0;o1?g+(" (at line "+r+", character "+(f-q+1)+")\n"):g+(" (at character "+(f+1)+")\n") m=e.length for(o=f;o78)if(f-q<75){l=q+75 k=q j="" i="..."}else{if(m-f<75){k=m-75 l=m i=""}else{k=f-36 l=f+36 i="..."}j="..."}else{l=m k=q j="" i=""}return g+j+B.a.j(e,k,l)+i+"\n"+B.a.b9(" ",f-k+j.length)+"^\n"}else return f!=null?g+(" (at offset "+A.i(f)+")"):g}} A.n.prototype={ X(a,b){return A.hA(this,A.E(this).i("n.E"),b)}, gl(a){var s,r=this.gB(this) for(s=0;r.m();)++s return s}, E(a,b){var s,r A.f5(b,"index") s=this.gB(this) for(r=b;s.m();){if(r===0)return s.gp();--r}throw A.a(A.eU(b,b-r,this,"index"))}, h(a){return A.hP(this,"(",")")}} A.u.prototype={ gn(a){return A.l.prototype.gn.call(this,0)}, h(a){return"null"}} A.l.prototype={$il:1, F(a,b){return this===b}, gn(a){return A.bY(this)}, h(a){return"Instance of '"+A.cQ(this)+"'"}, b_(a,b){throw A.a(A.f1(this,b))}, gt(a){return A.jL(this)}, toString(){return this.h(this)}} A.cj.prototype={ h(a){return""}, $ia4:1} A.y.prototype={ gl(a){return this.a.length}, h(a){var s=this.a return s.charCodeAt(0)==0?s:s}} A.d_.prototype={ $2(a,b){var s,r,q,p=B.a.aU(b,"=") if(p===-1){if(b!=="")a.q(0,A.ew(b,0,b.length,this.a,!0),"")}else if(p!==0){s=B.a.j(b,0,p) r=B.a.K(b,p+1) q=this.a a.q(0,A.ew(s,0,s.length,q,!0),A.ew(r,0,r.length,q,!0))}return a}, $S:20} A.cX.prototype={ $2(a,b){throw A.a(A.z("Illegal IPv4 address, "+a,this.a,b))}, $S:21} A.cY.prototype={ $2(a,b){throw A.a(A.z("Illegal IPv6 address, "+a,this.a,b))}, $S:22} A.cZ.prototype={ $2(a,b){var s if(b-a>4)this.a.$2("an IPv6 part can only contain a maximum of 4 hex digits",a) s=A.e8(B.a.j(this.b,a,b),16) if(s<0||s>65535)this.a.$2("each part must be in the range of `0x0..0xFFFF`",a) return s}, $S:23} A.bn.prototype={ gW(){var s,r,q,p,o=this,n=o.w if(n===$){s=o.a r=s.length!==0?""+s+":":"" q=o.c p=q==null if(!p||s==="file"){s=r+"//" r=o.b if(r.length!==0)s=s+r+"@" if(!p)s+=q r=o.d if(r!=null)s=s+":"+A.i(r)}else s=r s+=o.e r=o.f if(r!=null)s=s+"?"+r r=o.r if(r!=null)s=s+"#"+r n!==$&&A.bv() n=o.w=s.charCodeAt(0)==0?s:s}return n}, gn(a){var s,r=this,q=r.y if(q===$){s=B.a.gn(r.gW()) r.y!==$&&A.bv() r.y=s q=s}return q}, gao(){var s,r=this,q=r.z if(q===$){s=r.f s=A.fh(s==null?"":s) r.z!==$&&A.bv() q=r.z=new A.a7(s,t.h)}return q}, gb4(){return this.b}, gaj(){var s=this.c if(s==null)return"" if(B.a.u(s,"["))return B.a.j(s,1,s.length-1) return s}, ga0(){var s=this.d return s==null?A.fu(this.a):s}, gan(){var s=this.f return s==null?"":s}, gaO(){var s=this.r return s==null?"":s}, ap(a){var s,r,q,p,o=this,n=o.a,m=n==="file",l=o.b,k=o.d,j=o.c if(!(j!=null))j=l.length!==0||k!=null||m?"":null s=o.e if(!m)r=j!=null&&s.length!==0 else r=!0 if(r&&!B.a.u(s,"/"))s="/"+s q=s p=A.eu(null,0,0,a) return A.es(n,l,j,k,q,p,o.r)}, gaX(){if(this.a!==""){var s=this.r s=(s==null?"":s)===""}else s=!1 return s}, gaQ(){return this.c!=null}, gaT(){return this.f!=null}, gaR(){return this.r!=null}, h(a){return this.gW()}, F(a,b){var s,r,q=this if(b==null)return!1 if(q===b)return!0 if(t.R.b(b))if(q.a===b.ga2())if(q.c!=null===b.gaQ())if(q.b===b.gb4())if(q.gaj()===b.gaj())if(q.ga0()===b.ga0())if(q.e===b.gb0()){s=q.f r=s==null if(!r===b.gaT()){if(r)s="" if(s===b.gan()){s=q.r r=s==null if(!r===b.gaR()){if(r)s="" s=s===b.gaO()}else s=!1}else s=!1}else s=!1}else s=!1 else s=!1 else s=!1 else s=!1 else s=!1 else s=!1 else s=!1 return s}, $ic3:1, ga2(){return this.a}, gb0(){return this.e}} A.dC.prototype={ $2(a,b){var s=this.b,r=this.a s.a+=r.a r.a="&" r=A.fA(B.h,a,B.e,!0) r=s.a+=r if(b!=null&&b.length!==0){s.a=r+"=" r=A.fA(B.h,b,B.e,!0) s.a+=r}}, $S:24} A.dB.prototype={ $2(a,b){var s,r if(b==null||typeof b=="string")this.a.$2(a,b) else for(s=J.L(b),r=this.a;s.m();)r.$2(a,s.gp())}, $S:2} A.cW.prototype={ gb3(){var s,r,q,p,o=this,n=null,m=o.c if(m==null){m=o.a s=o.b[0]+1 r=B.a.Z(m,"?",s) q=m.length if(r>=0){p=A.bo(m,r+1,q,B.f,!1,!1) q=r}else p=n m=o.c=new A.c9("data","",n,n,A.bo(m,s,q,B.p,!1,!1),p,n)}return m}, h(a){var s=this.a return this.b[0]===-1?"data:"+s:s}} A.dP.prototype={ $2(a,b){var s=this.a[a] B.ab.bE(s,0,96,b) return s}, $S:25} A.dQ.prototype={ $3(a,b,c){var s,r for(s=b.length,r=0;r>>0]=c}, $S:8} A.ch.prototype={ gaQ(){return this.c>0}, gaS(){return this.c>0&&this.d+10&&this.r>=this.a.length}, ga2(){var s=this.w return s==null?this.w=this.bk():s}, bk(){var s,r=this,q=r.b if(q<=0)return"" s=q===4 if(s&&B.a.u(r.a,"http"))return"http" if(q===5&&B.a.u(r.a,"https"))return"https" if(s&&B.a.u(r.a,"file"))return"file" if(q===7&&B.a.u(r.a,"package"))return"package" return B.a.j(r.a,0,q)}, gb4(){var s=this.c,r=this.b+3 return s>r?B.a.j(this.a,r,s-1):""}, gaj(){var s=this.c return s>0?B.a.j(this.a,s,this.d):""}, ga0(){var s,r=this if(r.gaS())return A.e8(B.a.j(r.a,r.d+1,r.e),null) s=r.b if(s===4&&B.a.u(r.a,"http"))return 80 if(s===5&&B.a.u(r.a,"https"))return 443 return 0}, gb0(){return B.a.j(this.a,this.e,this.f)}, gan(){var s=this.f,r=this.r return s=this.r)return B.aa return new A.a7(A.fh(this.gan()),t.h)}, ap(a){var s,r,q,p,o,n=this,m=null,l=n.ga2(),k=l==="file",j=n.c,i=j>0?B.a.j(n.a,n.b+3,j):"",h=n.gaS()?n.ga0():m j=n.c if(j>0)s=B.a.j(n.a,j,n.d) else s=i.length!==0||h!=null||k?"":m j=n.a r=B.a.j(j,n.e,n.f) if(!k)q=s!=null&&r.length!==0 else q=!0 if(q&&!B.a.u(r,"/"))r="/"+r p=A.eu(m,0,0,a) q=n.r o=q1,n="dart:"+s,m=0;m") m=new A.cz(A.bL(new A.ak(o,A.k1(),n),!0,n.i("J.E"))) n=self l=A.c4(J.aq(n.window.location)).gao().k(0,"search") if(l!=null){k=m.aN(l) if(k.length!==0){j=B.b.gbF(k).e if(j!=null){n.window.location.assign($.bw()+j) s=1 break}}}n=p.b if(n!=null)A.eo(m).ak(n) n=p.c if(n!=null)A.eo(m).ak(n) n=p.d if(n!=null)A.eo(m).ak(n) case 1:return A.fJ(q,r)}}) return A.fK($async$$1,r)}, $S:9} A.ds.prototype={ gG(){var s,r=this,q=r.c if(q===$){s=self.document.createElement("div") s.setAttribute("role","listbox") s.setAttribute("aria-expanded","false") s.style.display="none" s.classList.add("tt-menu") s.appendChild(r.gaZ()) s.appendChild(r.gP()) r.c!==$&&A.bv() r.c=s q=s}return q}, gaZ(){var s,r=this.d if(r===$){s=self.document.createElement("div") s.classList.add("enter-search-message") this.d!==$&&A.bv() this.d=s r=s}return r}, gP(){var s,r=this.e if(r===$){s=self.document.createElement("div") s.classList.add("tt-search-results") this.e!==$&&A.bv() this.e=s r=s}return r}, ak(a){var s,r,q,p=this a.disabled=!1 a.setAttribute("placeholder","Search API Docs") s=self s.document.addEventListener("keydown",t.g.a(A.ab(new A.dt(a)))) r=s.document.createElement("div") r.classList.add("tt-wrapper") a.replaceWith(r) a.setAttribute("autocomplete","off") a.setAttribute("spellcheck","false") a.classList.add("tt-input") r.appendChild(a) r.appendChild(p.gG()) p.ba(a) if(J.hv(s.window.location.href,"search.html")){q=p.b.gao().k(0,"q") if(q==null)return q=B.k.I(q) $.eD=$.dX p.bK(q,!0) p.bb(q) p.ai() $.eD=10}}, bb(a){var s,r,q,p,o,n=self,m=n.document.getElementById("dartdoc-main-content") if(m==null)return m.textContent="" s=n.document.createElement("section") s.classList.add("search-summary") m.appendChild(s) s=n.document.createElement("h2") s.innerHTML="Search Results" m.appendChild(s) s=n.document.createElement("div") s.classList.add("search-summary") s.innerHTML=""+$.dX+' results for "'+a+'"' m.appendChild(s) if($.bq.a!==0)for(n=$.bq.gb5(),s=A.E(n),s=s.i("@<1>").A(s.y[1]),n=new A.av(J.L(n.a),n.b,s.i("av<1,2>")),s=s.y[1];n.m();){r=n.a if(r==null)r=s.a(r) m.appendChild(r)}else{q=n.document.createElement("div") q.classList.add("search-summary") q.innerHTML='There was not a match for "'+a+'". Want to try searching from additional Dart-related sites? ' p=A.c4("https://dart.dev/search?cx=011220921317074318178%3A_yy-tmb5t_i&ie=UTF-8&hl=en&q=").ap(A.f_(["q",a],t.N,t.z)) o=n.document.createElement("a") o.setAttribute("href",p.gW()) o.textContent="Search on dart.dev." q.appendChild(o) m.appendChild(q)}}, ai(){var s=this.gG() s.style.display="none" s.setAttribute("aria-expanded","false") return s}, b2(a,b,c){var s,r,q,p,o=this o.x=A.h([],t.M) s=o.w B.b.Y(s) $.bq.Y(0) o.gP().textContent="" r=b.length if(r===0){o.ai() return}for(q=0;q10?'Press "Enter" key to see all '+r+" results":"" o.gaZ().textContent=r}, bY(a,b){return this.b2(a,b,!1)}, ah(a,b,c){var s,r,q,p=this if(p.r===a&&!b)return if(a.length===0){p.bY("",A.h([],t.M)) return}s=p.a.aN(a) r=s.length $.dX=r q=$.eD if(r>q)s=B.b.bd(s,0,q) p.r=a p.b2(a,s,c)}, bK(a,b){return this.ah(a,!1,b)}, aP(a){return this.ah(a,!1,!1)}, bJ(a,b){return this.ah(a,b,!1)}, aK(a){var s,r=this r.y=-1 s=r.f if(s!=null){a.value=s r.f=null}r.ai()}, ba(a){var s=this,r=t.g a.addEventListener("focus",r.a(A.ab(new A.du(s,a)))) a.addEventListener("blur",r.a(A.ab(new A.dv(s,a)))) a.addEventListener("input",r.a(A.ab(new A.dw(s,a)))) a.addEventListener("keydown",r.a(A.ab(new A.dx(s,a))))}} A.dt.prototype={ $1(a){if(J.F(a.key,"/")&&!t.m.b(self.document.activeElement)){a.preventDefault() this.a.focus()}}, $S:1} A.du.prototype={ $1(a){this.a.bJ(this.b.value,!0)}, $S:1} A.dv.prototype={ $1(a){this.a.aK(this.b)}, $S:1} A.dw.prototype={ $1(a){this.a.aP(this.b.value)}, $S:1} A.dx.prototype={ $1(a){var s,r,q,p,o,n,m,l,k,j,i,h,g,f,e=this if(!J.F(a.type,"keydown"))return if(J.F(a.code,"Enter")){a.preventDefault() s=e.a r=s.y if(r!==-1){q=s.w[r].getAttribute("data-href") if(q!=null)self.window.location.assign($.bw()+q) return}else{p=B.k.I(s.r) o=A.c4($.bw()+"search.html").ap(A.f_(["q",p],t.N,t.z)) self.window.location.assign(o.gW()) return}}s=e.a r=s.w n=r.length-1 m=s.y if(J.F(a.code,"ArrowUp")){l=s.y if(l===-1)s.y=n else s.y=l-1}else if(J.F(a.code,"ArrowDown")){l=s.y if(l===n)s.y=-1 else s.y=l+1}else if(J.F(a.code,"Escape"))s.aK(e.b) else{if(s.f!=null){s.f=null s.aP(e.b.value)}return}l=m!==-1 if(l)r[m].classList.remove("tt-cursor") k=s.y if(k!==-1){j=r[k] j.classList.add("tt-cursor") r=s.y if(r===0)s.gG().scrollTop=0 else if(r===n)s.gG().scrollTop=s.gG().scrollHeight else{i=j.offsetTop h=s.gG().offsetHeight if(i"+A.i(a.k(0,0))+""}, $S:30} A.dU.prototype={ $1(a){var s=this.a if(s!=null)s.classList.toggle("active") s=this.b if(s!=null)s.classList.toggle("active")}, $S:1} A.dV.prototype={ $1(a){return this.b7(a)}, b7(a){var s=0,r=A.fS(t.P),q,p=this,o,n,m var $async$$1=A.fZ(function(b,c){if(b===1)return A.fI(c,r) while(true)switch(s){case 0:if(!J.F(a.status,200)){o=self.document.createElement("a") o.href="https://dart.dev/tools/dart-doc#troubleshoot" o.text="Failed to load sidebar. Visit dart.dev for help troubleshooting." p.a.appendChild(o) s=1 break}s=3 return A.fH(A.eb(a.text(),t.N),$async$$1) case 3:n=c m=self.document.createElement("div") m.innerHTML=n A.fY(p.b,m) p.a.appendChild(m) case 1:return A.fJ(q,r)}}) return A.fK($async$$1,r)}, $S:9} A.e7.prototype={ $0(){var s=this.a,r=this.b if(s.checked){r.setAttribute("class","dark-theme") s.setAttribute("value","dark-theme") self.window.localStorage.setItem("colorTheme","true")}else{r.setAttribute("class","light-theme") s.setAttribute("value","light-theme") self.window.localStorage.setItem("colorTheme","false")}}, $S:0} A.e4.prototype={ $1(a){this.a.$0()}, $S:1};(function aliases(){var s=J.a2.prototype s.be=s.h})();(function installTearOffs(){var s=hunkHelpers._static_2,r=hunkHelpers._static_1,q=hunkHelpers._static_0 s(J,"ja","hT",31) r(A,"jA","ic",4) r(A,"jB","id",4) r(A,"jC","ie",4) q(A,"h0","ju",0) r(A,"k1","hL",32)})();(function inheritance(){var s=hunkHelpers.mixin,r=hunkHelpers.inherit,q=hunkHelpers.inheritMany r(A.l,null) q(A.l,[A.eh,J.bG,J.ar,A.n,A.bA,A.k,A.e,A.cR,A.au,A.av,A.aO,A.c1,A.a5,A.bf,A.aW,A.aK,A.cD,A.ag,A.cU,A.cO,A.aN,A.bg,A.dp,A.P,A.cJ,A.bK,A.cE,A.ce,A.d3,A.I,A.cb,A.dA,A.dy,A.c5,A.bz,A.c7,A.az,A.v,A.c6,A.ci,A.dJ,A.cl,A.bC,A.bE,A.cy,A.dH,A.dE,A.d8,A.bW,A.b4,A.d9,A.cw,A.u,A.cj,A.y,A.bn,A.cW,A.ch,A.cN,A.cz,A.w,A.cu,A.ds]) q(J.bG,[J.bH,J.aQ,J.aT,J.aS,J.aU,J.aR,J.ai]) q(J.aT,[J.a2,J.o,A.bM,A.aZ]) q(J.a2,[J.bX,J.ax,J.a1]) r(J.cF,J.o) q(J.aR,[J.aP,J.bI]) q(A.n,[A.a8,A.c,A.aj]) q(A.a8,[A.af,A.bp]) r(A.b9,A.af) r(A.b8,A.bp) r(A.M,A.b8) q(A.k,[A.aV,A.R,A.bJ,A.c0,A.c8,A.bZ,A.ca,A.bx,A.G,A.bV,A.c2,A.c_,A.b5,A.bD]) r(A.ay,A.e) r(A.bB,A.ay) q(A.c,[A.J,A.O]) r(A.aM,A.aj) q(A.J,[A.ak,A.cd]) r(A.cf,A.bf) r(A.cg,A.cf) r(A.bm,A.aW) r(A.a7,A.bm) r(A.aL,A.a7) r(A.ah,A.aK) q(A.ag,[A.ct,A.cs,A.cT,A.cG,A.e1,A.e3,A.d5,A.d4,A.dK,A.de,A.dl,A.dQ,A.dR,A.ec,A.ed,A.cC,A.cB,A.e5,A.dt,A.du,A.dv,A.dw,A.dx,A.dN,A.dO,A.dS,A.dU,A.dV,A.e4]) q(A.ct,[A.cP,A.e2,A.dL,A.dY,A.df,A.cK,A.cM,A.dD,A.d_,A.cX,A.cY,A.cZ,A.dC,A.dB,A.dP,A.cA]) r(A.b1,A.R) q(A.cT,[A.cS,A.aJ]) q(A.P,[A.N,A.cc]) q(A.aZ,[A.bN,A.aw]) q(A.aw,[A.bb,A.bd]) r(A.bc,A.bb) r(A.aX,A.bc) r(A.be,A.bd) r(A.aY,A.be) q(A.aX,[A.bO,A.bP]) q(A.aY,[A.bQ,A.bR,A.bS,A.bT,A.bU,A.b_,A.b0]) r(A.bh,A.ca) q(A.cs,[A.d6,A.d7,A.dz,A.da,A.dh,A.dg,A.dd,A.dc,A.db,A.dk,A.dj,A.di,A.dW,A.dr,A.dG,A.dF,A.dT,A.e6,A.e7]) r(A.b7,A.c7) r(A.dq,A.dJ) q(A.bC,[A.cq,A.cv,A.cH]) q(A.bE,[A.cr,A.cx,A.cI,A.d2,A.d1]) r(A.d0,A.cv) q(A.G,[A.b2,A.bF]) r(A.c9,A.bn) q(A.d8,[A.m,A.A]) s(A.ay,A.c1) s(A.bp,A.e) s(A.bb,A.e) s(A.bc,A.aO) s(A.bd,A.e) s(A.be,A.aO) s(A.bm,A.cl)})() var v={typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{b:"int",t:"double",jY:"num",d:"String",jD:"bool",u:"Null",f:"List",l:"Object",x:"Map"},mangledNames:{},types:["~()","u(p)","~(d,@)","~(@)","~(~())","u(@)","u()","@()","~(al,d,b)","a0(p)","@(@)","@(@,d)","@(d)","u(~())","u(@,a4)","~(b,@)","u(l,a4)","v<@>(@)","~(l?,l?)","~(b6,@)","x(x,d)","~(d,b)","~(d,b?)","b(b,b)","~(d,d?)","al(@,@)","~(A)","b(+item,matchPosition(w,A),+item,matchPosition(w,A))","w(+item,matchPosition(w,A))","d()","d(cL)","b(@,@)","w(x)"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti"),rttc:{"2;item,matchPosition":(a,b)=>c=>c instanceof A.cg&&a.b(c.a)&&b.b(c.b)}} A.ix(v.typeUniverse,JSON.parse('{"bX":"a2","ax":"a2","a1":"a2","bH":{"j":[]},"aQ":{"u":[],"j":[]},"aT":{"p":[]},"a2":{"p":[]},"o":{"f":["1"],"c":["1"],"p":[]},"cF":{"o":["1"],"f":["1"],"c":["1"],"p":[]},"aR":{"t":[]},"aP":{"t":[],"b":[],"j":[]},"bI":{"t":[],"j":[]},"ai":{"d":[],"j":[]},"a8":{"n":["2"]},"af":{"a8":["1","2"],"n":["2"],"n.E":"2"},"b9":{"af":["1","2"],"a8":["1","2"],"c":["2"],"n":["2"],"n.E":"2"},"b8":{"e":["2"],"f":["2"],"a8":["1","2"],"c":["2"],"n":["2"]},"M":{"b8":["1","2"],"e":["2"],"f":["2"],"a8":["1","2"],"c":["2"],"n":["2"],"e.E":"2","n.E":"2"},"aV":{"k":[]},"bB":{"e":["b"],"f":["b"],"c":["b"],"e.E":"b"},"c":{"n":["1"]},"J":{"c":["1"],"n":["1"]},"aj":{"n":["2"],"n.E":"2"},"aM":{"aj":["1","2"],"c":["2"],"n":["2"],"n.E":"2"},"ak":{"J":["2"],"c":["2"],"n":["2"],"J.E":"2","n.E":"2"},"ay":{"e":["1"],"f":["1"],"c":["1"]},"a5":{"b6":[]},"aL":{"a7":["1","2"],"x":["1","2"]},"aK":{"x":["1","2"]},"ah":{"x":["1","2"]},"b1":{"R":[],"k":[]},"bJ":{"k":[]},"c0":{"k":[]},"bg":{"a4":[]},"c8":{"k":[]},"bZ":{"k":[]},"N":{"P":["1","2"],"x":["1","2"],"P.V":"2"},"O":{"c":["1"],"n":["1"],"n.E":"1"},"ce":{"el":[],"cL":[]},"bM":{"p":[],"j":[]},"aZ":{"p":[]},"bN":{"p":[],"j":[]},"aw":{"D":["1"],"p":[]},"aX":{"e":["t"],"f":["t"],"D":["t"],"c":["t"],"p":[]},"aY":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[]},"bO":{"e":["t"],"f":["t"],"D":["t"],"c":["t"],"p":[],"j":[],"e.E":"t"},"bP":{"e":["t"],"f":["t"],"D":["t"],"c":["t"],"p":[],"j":[],"e.E":"t"},"bQ":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"bR":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"bS":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"bT":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"bU":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"b_":{"e":["b"],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"b0":{"e":["b"],"al":[],"f":["b"],"D":["b"],"c":["b"],"p":[],"j":[],"e.E":"b"},"ca":{"k":[]},"bh":{"R":[],"k":[]},"v":{"a0":["1"]},"bz":{"k":[]},"b7":{"c7":["1"]},"e":{"f":["1"],"c":["1"]},"P":{"x":["1","2"]},"aW":{"x":["1","2"]},"a7":{"x":["1","2"]},"cc":{"P":["d","@"],"x":["d","@"],"P.V":"@"},"cd":{"J":["d"],"c":["d"],"n":["d"],"J.E":"d","n.E":"d"},"f":{"c":["1"]},"el":{"cL":[]},"bx":{"k":[]},"R":{"k":[]},"G":{"k":[]},"b2":{"k":[]},"bF":{"k":[]},"bV":{"k":[]},"c2":{"k":[]},"c_":{"k":[]},"b5":{"k":[]},"bD":{"k":[]},"bW":{"k":[]},"b4":{"k":[]},"cj":{"a4":[]},"bn":{"c3":[]},"ch":{"c3":[]},"c9":{"c3":[]},"hO":{"f":["b"],"c":["b"]},"al":{"f":["b"],"c":["b"]},"i9":{"f":["b"],"c":["b"]},"hM":{"f":["b"],"c":["b"]},"i7":{"f":["b"],"c":["b"]},"hN":{"f":["b"],"c":["b"]},"i8":{"f":["b"],"c":["b"]},"hJ":{"f":["t"],"c":["t"]},"hK":{"f":["t"],"c":["t"]}}')) A.iw(v.typeUniverse,JSON.parse('{"aO":1,"c1":1,"ay":1,"bp":2,"aK":2,"bK":1,"aw":1,"ci":1,"cl":2,"aW":2,"bm":2,"bC":2,"bE":2}')) var u={c:"Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type"} var t=(function rtii(){var s=A.bt return{Z:s("aL"),U:s("c<@>"),Q:s("k"),Y:s("k9"),M:s("o"),O:s("o

"),r:s("o<+item,matchPosition(w,A)>"),s:s("o"),b:s("o<@>"),t:s("o"),T:s("aQ"),m:s("p"),g:s("a1"),p:s("D<@>"),B:s("N"),j:s("f<@>"),a:s("x"),V:s("ak<+item,matchPosition(w,A),w>"),P:s("u"),K:s("l"),L:s("ka"),d:s("+()"),F:s("el"),l:s("a4"),N:s("d"),k:s("j"),c:s("R"),D:s("al"),o:s("ax"),h:s("a7"),R:s("c3"),e:s("v<@>"),y:s("jD"),i:s("t"),z:s("@"),v:s("@(l)"),C:s("@(l,a4)"),S:s("b"),A:s("0&*"),_:s("l*"),W:s("a0?"),X:s("l?"),H:s("jY")}})();(function constants(){var s=hunkHelpers.makeConstList B.I=J.bG.prototype B.b=J.o.prototype B.c=J.aP.prototype B.a=J.ai.prototype B.J=J.a1.prototype B.K=J.aT.prototype B.ab=A.b0.prototype B.w=J.bX.prototype B.j=J.ax.prototype B.at=new A.cr() B.x=new A.cq() B.au=new A.cy() B.k=new A.cx() B.l=function getTagFallback(o) { var s = Object.prototype.toString.call(o); return s.substring(8, s.length - 1); } B.y=function() { var toStringFunction = Object.prototype.toString; function getTag(o) { var s = toStringFunction.call(o); return s.substring(8, s.length - 1); } function getUnknownTag(object, tag) { if (/^HTML[A-Z].*Element$/.test(tag)) { var name = toStringFunction.call(object); if (name == "[object Object]") return null; return "HTMLElement"; } } function getUnknownTagGenericBrowser(object, tag) { if (object instanceof HTMLElement) return "HTMLElement"; return getUnknownTag(object, tag); } function prototypeForTag(tag) { if (typeof window == "undefined") return null; if (typeof window[tag] == "undefined") return null; var constructor = window[tag]; if (typeof constructor != "function") return null; return constructor.prototype; } function discriminator(tag) { return null; } var isBrowser = typeof HTMLElement == "function"; return { getTag: getTag, getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag, prototypeForTag: prototypeForTag, discriminator: discriminator }; } B.D=function(getTagFallback) { return function(hooks) { if (typeof navigator != "object") return hooks; var userAgent = navigator.userAgent; if (typeof userAgent != "string") return hooks; if (userAgent.indexOf("DumpRenderTree") >= 0) return hooks; if (userAgent.indexOf("Chrome") >= 0) { function confirm(p) { return typeof window == "object" && window[p] && window[p].name == p; } if (confirm("Window") && confirm("HTMLElement")) return hooks; } hooks.getTag = getTagFallback; }; } B.z=function(hooks) { if (typeof dartExperimentalFixupGetTag != "function") return hooks; hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag); } B.C=function(hooks) { if (typeof navigator != "object") return hooks; var userAgent = navigator.userAgent; if (typeof userAgent != "string") return hooks; if (userAgent.indexOf("Firefox") == -1) return hooks; var getTag = hooks.getTag; var quickMap = { "BeforeUnloadEvent": "Event", "DataTransfer": "Clipboard", "GeoGeolocation": "Geolocation", "Location": "!Location", "WorkerMessageEvent": "MessageEvent", "XMLDocument": "!Document"}; function getTagFirefox(o) { var tag = getTag(o); return quickMap[tag] || tag; } hooks.getTag = getTagFirefox; } B.B=function(hooks) { if (typeof navigator != "object") return hooks; var userAgent = navigator.userAgent; if (typeof userAgent != "string") return hooks; if (userAgent.indexOf("Trident/") == -1) return hooks; var getTag = hooks.getTag; var quickMap = { "BeforeUnloadEvent": "Event", "DataTransfer": "Clipboard", "HTMLDDElement": "HTMLElement", "HTMLDTElement": "HTMLElement", "HTMLPhraseElement": "HTMLElement", "Position": "Geoposition" }; function getTagIE(o) { var tag = getTag(o); var newTag = quickMap[tag]; if (newTag) return newTag; if (tag == "Object") { if (window.DataView && (o instanceof window.DataView)) return "DataView"; } return tag; } function prototypeForTagIE(tag) { var constructor = window[tag]; if (constructor == null) return null; return constructor.prototype; } hooks.getTag = getTagIE; hooks.prototypeForTag = prototypeForTagIE; } B.A=function(hooks) { var getTag = hooks.getTag; var prototypeForTag = hooks.prototypeForTag; function getTagFixed(o) { var tag = getTag(o); if (tag == "Document") { if (!!o.xmlVersion) return "!Document"; return "!HTMLDocument"; } return tag; } function prototypeForTagFixed(tag) { if (tag == "Document") return null; return prototypeForTag(tag); } hooks.getTag = getTagFixed; hooks.prototypeForTag = prototypeForTagFixed; } B.m=function(hooks) { return hooks; } B.E=new A.cH() B.F=new A.bW() B.i=new A.cR() B.e=new A.d0() B.G=new A.d2() B.n=new A.dp() B.d=new A.dq() B.H=new A.cj() B.L=new A.cI(null) B.a8=A.h(s([0,0,32722,12287,65534,34815,65534,18431]),t.t) B.f=A.h(s([0,0,65490,45055,65535,34815,65534,18431]),t.t) B.a9=A.h(s([0,0,32754,11263,65534,34815,65534,18431]),t.t) B.o=A.h(s([0,0,26624,1023,65534,2047,65534,2047]),t.t) B.p=A.h(s([0,0,65490,12287,65535,34815,65534,18431]),t.t) B.M=new A.m(0,"accessor") B.N=new A.m(1,"constant") B.Y=new A.m(2,"constructor") B.a1=new A.m(3,"class_") B.a2=new A.m(4,"dynamic") B.a3=new A.m(5,"enum_") B.a4=new A.m(6,"extension") B.a5=new A.m(7,"extensionType") B.a6=new A.m(8,"function") B.a7=new A.m(9,"library") B.O=new A.m(10,"method") B.P=new A.m(11,"mixin") B.Q=new A.m(12,"never") B.R=new A.m(13,"package") B.S=new A.m(14,"parameter") B.T=new A.m(15,"prefix") B.U=new A.m(16,"property") B.V=new A.m(17,"sdk") B.W=new A.m(18,"topic") B.X=new A.m(19,"topLevelConstant") B.Z=new A.m(20,"topLevelProperty") B.a_=new A.m(21,"typedef") B.a0=new A.m(22,"typeParameter") B.q=A.h(s([B.M,B.N,B.Y,B.a1,B.a2,B.a3,B.a4,B.a5,B.a6,B.a7,B.O,B.P,B.Q,B.R,B.S,B.T,B.U,B.V,B.W,B.X,B.Z,B.a_,B.a0]),A.bt("o")) B.r=A.h(s([0,0,32776,33792,1,10240,0,0]),t.t) B.t=A.h(s([]),t.b) B.h=A.h(s([0,0,24576,1023,65534,34815,65534,18431]),t.t) B.v={} B.aa=new A.ah(B.v,[],A.bt("ah")) B.u=new A.ah(B.v,[],A.bt("ah")) B.ac=new A.a5("call") B.ad=A.K("k6") B.ae=A.K("k7") B.af=A.K("hJ") B.ag=A.K("hK") B.ah=A.K("hM") B.ai=A.K("hN") B.aj=A.K("hO") B.ak=A.K("l") B.al=A.K("i7") B.am=A.K("i8") B.an=A.K("i9") B.ao=A.K("al") B.ap=new A.d1(!1) B.aq=new A.A(0,"isExactly") B.ar=new A.A(1,"startsWith") B.as=new A.A(2,"contains")})();(function staticFields(){$.dm=null $.ap=A.h([],A.bt("o")) $.f2=null $.eR=null $.eQ=null $.h2=null $.h_=null $.h7=null $.dZ=null $.e9=null $.eH=null $.dn=A.h([],A.bt("o?>")) $.aB=null $.br=null $.bs=null $.eA=!1 $.r=B.d $.eD=10 $.dX=0 $.bq=A.ej(t.N,t.m)})();(function lazyInitializers(){var s=hunkHelpers.lazyFinal s($,"k8","eK",()=>A.jK("_$dart_dartClosure")) s($,"kc","ha",()=>A.S(A.cV({ toString:function(){return"$receiver$"}}))) s($,"kd","hb",()=>A.S(A.cV({$method$:null, toString:function(){return"$receiver$"}}))) s($,"ke","hc",()=>A.S(A.cV(null))) s($,"kf","hd",()=>A.S(function(){var $argumentsExpr$="$arguments$" try{null.$method$($argumentsExpr$)}catch(r){return r.message}}())) s($,"ki","hg",()=>A.S(A.cV(void 0))) s($,"kj","hh",()=>A.S(function(){var $argumentsExpr$="$arguments$" try{(void 0).$method$($argumentsExpr$)}catch(r){return r.message}}())) s($,"kh","hf",()=>A.S(A.fd(null))) s($,"kg","he",()=>A.S(function(){try{null.$method$}catch(r){return r.message}}())) s($,"kl","hj",()=>A.S(A.fd(void 0))) s($,"kk","hi",()=>A.S(function(){try{(void 0).$method$}catch(r){return r.message}}())) s($,"km","eL",()=>A.ib()) s($,"ks","hp",()=>A.hY(4096)) s($,"kq","hn",()=>new A.dG().$0()) s($,"kr","ho",()=>new A.dF().$0()) s($,"kn","hk",()=>A.hX(A.j0(A.h([-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-1,-2,-2,-2,-2,-2,62,-2,62,-2,63,52,53,54,55,56,57,58,59,60,61,-2,-2,-2,-1,-2,-2,-2,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-2,-2,-2,-2,63,-2,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-2,-2,-2,-2,-2],t.t)))) s($,"ko","hl",()=>A.f6("^[\\-\\.0-9A-Z_a-z~]*$",!0)) s($,"kp","hm",()=>typeof URLSearchParams=="function") s($,"kE","ee",()=>A.h5(B.ak)) s($,"kG","hq",()=>A.j_()) s($,"kF","bw",()=>new A.dT().$0())})();(function nativeSupport(){!function(){var s=function(a){var m={} m[a]=1 return Object.keys(hunkHelpers.convertToFastObject(m))[0]} v.getIsolateTag=function(a){return s("___dart_"+a+v.isolateTag)} var r="___dart_isolate_tags_" var q=Object[r]||(Object[r]=Object.create(null)) var p="_ZxYxX" for(var o=0;;o++){var n=s(p+"_"+o+"_") if(!(n in q)){q[n]=1 v.isolateTag=n break}}v.dispatchPropertyName=v.getIsolateTag("dispatch_record")}() hunkHelpers.setOrUpdateInterceptorsByTag({ArrayBuffer:A.bM,ArrayBufferView:A.aZ,DataView:A.bN,Float32Array:A.bO,Float64Array:A.bP,Int16Array:A.bQ,Int32Array:A.bR,Int8Array:A.bS,Uint16Array:A.bT,Uint32Array:A.bU,Uint8ClampedArray:A.b_,CanvasPixelArray:A.b_,Uint8Array:A.b0}) hunkHelpers.setOrUpdateLeafTags({ArrayBuffer:true,ArrayBufferView:false,DataView:true,Float32Array:true,Float64Array:true,Int16Array:true,Int32Array:true,Int8Array:true,Uint16Array:true,Uint32Array:true,Uint8ClampedArray:true,CanvasPixelArray:true,Uint8Array:false}) A.aw.$nativeSuperclassTag="ArrayBufferView" A.bb.$nativeSuperclassTag="ArrayBufferView" A.bc.$nativeSuperclassTag="ArrayBufferView" A.aX.$nativeSuperclassTag="ArrayBufferView" A.bd.$nativeSuperclassTag="ArrayBufferView" A.be.$nativeSuperclassTag="ArrayBufferView" A.aY.$nativeSuperclassTag="ArrayBufferView"})() Function.prototype.$0=function(){return this()} Function.prototype.$1=function(a){return this(a)} Function.prototype.$2=function(a,b){return this(a,b)} Function.prototype.$1$1=function(a){return this(a)} Function.prototype.$3=function(a,b,c){return this(a,b,c)} Function.prototype.$4=function(a,b,c,d){return this(a,b,c,d)} Function.prototype.$1$0=function(){return this()} convertAllToFastObject(w) convertToFastObject($);(function(a){if(typeof document==="undefined"){a(null) return}if(typeof document.currentScript!="undefined"){a(document.currentScript) return}var s=document.scripts function onLoad(b){for(var q=0;q */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hljs-comment, .hljs-quote { color: #998; font-style: italic; } .hljs-keyword, .hljs-selector-tag, .hljs-subst { color: #333; font-weight: bold; } .hljs-number, .hljs-literal, .hljs-variable, .hljs-template-variable, .hljs-tag .hljs-attr { color: #008080; } .hljs-string, .hljs-doctag { color: #d14; } .hljs-title, .hljs-section, .hljs-selector-id { color: #900; font-weight: bold; } .hljs-subst { font-weight: normal; } .hljs-type, .hljs-class .hljs-title { color: #458; font-weight: bold; } .hljs-tag, .hljs-name, .hljs-attribute { color: #000080; font-weight: normal; } .hljs-regexp, .hljs-link { color: #009926; } .hljs-symbol, .hljs-bullet { color: #990073; } .hljs-built_in, .hljs-builtin-name { color: #0086b3; } .hljs-meta { color: #999; font-weight: bold; } .hljs-deletion { background: #fdd; } .hljs-addition { background: #dfd; } .hljs-emphasis { font-style: italic; } .hljs-strong { font-weight: bold; } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/highlight.pack.js ================================================ /*! Highlight.js v11.8.0 (git: d27be507cb) (c) 2006-2023 Ivan Sagalaev and other contributors License: BSD-3-Clause */ var hljs=function(){"use strict";function e(n){ return n instanceof Map?n.clear=n.delete=n.set=()=>{ throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ throw Error("set is read-only") }),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) })),n}class n{constructor(e){ void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") }function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] ;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope ;class s{constructor(e,n){ this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ if(e.startsWith("language:"))return e.replace("language:","language-") ;if(e.includes(".")){const t=e.split(".") ;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") }return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ this.buffer+=``}}const r=(e={})=>{const n={children:[]} ;return Object.assign(n,e),n};class o{constructor(){ this.rootNode=r(),this.stack=[this.rootNode]}get top(){ return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ this.top.children.push(e)}openNode(e){const n=r({scope:e}) ;this.add(n),this.stack.push(n)}closeNode(){ if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ "string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ this.closeNode()}__addSublanguage(e,n){const t=e.root ;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ return new s(this,this.options).value()}finalize(){ return this.closeAllNodes(),!0}}function c(e){ return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ const n=e[e.length-1] ;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} })(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} function p(e){return RegExp(e.toString()+"|").exec("").length-1} const h=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ ;function f(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t ;let a=c(e),i="";for(;a.length>0;){const e=h.exec(a);if(!e){i+=a;break} i+=a.substring(0,e.index), a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], "("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} const _="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",N="\\b\\d+(\\.\\d+)?",y="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",v={ begin:"\\\\[\\s\\S]",relevance:0},k={scope:"string",begin:"'",end:"'", illegal:"\\n",contains:[v]},x={scope:"string",begin:'"',end:'"',illegal:"\\n", contains:[v]},O=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, contains:[]},t);i.contains.push({scope:"doctag", begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) ;const s=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) ;return i.contains.push({begin:b(/[ ]+/,"(",s,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i },S=O("//","$"),A=O("/\\*","\\*/"),M=O("#","$");var C=Object.freeze({ __proto__:null,MATCH_NOTHING_RE:/\b\B/,IDENT_RE:_,UNDERSCORE_IDENT_RE:E, NUMBER_RE:N,C_NUMBER_RE:y,BINARY_NUMBER_RE:w, RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", SHEBANG:(e={})=>{const n=/^#![ ]*\// ;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, BACKSLASH_ESCAPE:v,APOS_STRING_MODE:k,QUOTE_STRING_MODE:x,PHRASAL_WORDS_MODE:{ begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ },COMMENT:O,C_LINE_COMMENT_MODE:S,C_BLOCK_COMMENT_MODE:A,HASH_COMMENT_MODE:M, NUMBER_MODE:{scope:"number",begin:N,relevance:0},C_NUMBER_MODE:{scope:"number", begin:y,relevance:0},BINARY_NUMBER_MODE:{scope:"number",begin:w,relevance:0}, REGEXP_MODE:{begin:/(?=\/[^/\n]*\/)/,contains:[{scope:"regexp",begin:/\//, end:/\/[gimuy]*/,illegal:/\n/,contains:[v,{begin:/\[/,end:/\]/,relevance:0, contains:[v]}]}]},TITLE_MODE:{scope:"title",begin:_,relevance:0}, UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0},METHOD_GUARD:{ begin:"\\.\\s*"+E,relevance:0},END_SAME_AS_BEGIN:e=>Object.assign(e,{ "on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ n.data._beginMatch!==e[1]&&n.ignoreMatch()}})});function T(e,n){ "."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, void 0===e.relevance&&(e.relevance=0))}function I(e,n){ Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function B(e,n){ if(e.match){ if(e.begin||e.end)throw Error("begin & end are not supported with match") ;e.begin=e.match,delete e.match}}function L(e,n){ void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return ;if(e.starts)throw Error("beforeMatch cannot be used with starts") ;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] })),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ relevance:0,contains:[Object.assign(t,{endsParent:!0})] },e.relevance=0,delete t.beforeMatch },F=["of","and","for","in","not","or","if","then","parent","list","value"],z="keyword" ;function U(e,n,t=z){const a=Object.create(null) ;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") ;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ return n?Number(n):(e=>F.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},Z=(e,n)=>{ P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) },G=Error();function q(e,n,{key:t}){let a=0;const i=e[t],s={},r={} ;for(let e=1;e<=n.length;e++)r[e+a]=i[e],s[e+a]=!0,a+=p(n[e-1]) ;e[t]=r,e[t]._emit=s,e[t]._multi=!0}function W(e){(e=>{ e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ _wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope }),(e=>{if(Array.isArray(e.begin)){ if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), G ;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), G;q(e,e.begin,{key:"beginScope"}),e.begin=f(e.begin,{joinWith:""})}})(e),(e=>{ if(Array.isArray(e.end)){ if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), G ;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), G;q(e,e.end,{key:"endScope"}),e.end=f(e.end,{joinWith:""})}})(e)}function X(e){ function n(n,t){ return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) }class t{constructor(){ this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} addRule(e,n){ n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) ;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(f(e,{joinWith:"|" }),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex ;const n=this.matcherRe.exec(e);if(!n)return null ;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] ;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ this.rules=[],this.multiRegexes=[], this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t ;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex ;let t=n.exec(e) ;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} return t&&(this.regexIndex+=t.position+1, this.regexIndex===this.count&&this.considerAll()),t}} if(e.compilerExtensions||(e.compilerExtensions=[]), e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") ;return e.classNameAliases=a(e.classNameAliases||{}),function t(s,r){const o=s ;if(s.isCompiled)return o ;[R,B,W,$].forEach((e=>e(s,r))),e.compilerExtensions.forEach((e=>e(s,r))), s.__beforeBegin=null,[D,I,L].forEach((e=>e(s,r))),s.isCompiled=!0;let l=null ;return"object"==typeof s.keywords&&s.keywords.$pattern&&(s.keywords=Object.assign({},s.keywords), l=s.keywords.$pattern, delete s.keywords.$pattern),l=l||/\w+/,s.keywords&&(s.keywords=U(s.keywords,e.case_insensitive)), o.keywordPatternRe=n(l,!0), r&&(s.begin||(s.begin=/\B|\b/),o.beginRe=n(o.begin),s.end||s.endsWithParent||(s.end=/\B|\b/), s.end&&(o.endRe=n(o.end)), o.terminatorEnd=c(o.end)||"",s.endsWithParent&&r.terminatorEnd&&(o.terminatorEnd+=(s.end?"|":"")+r.terminatorEnd)), s.illegal&&(o.illegalRe=n(s.illegal)), s.contains||(s.contains=[]),s.contains=[].concat(...s.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ variants:null},n)))),e.cachedVariants?e.cachedVariants:Q(e)?a(e,{ starts:e.starts?a(e.starts):null }):Object.isFrozen(e)?a(e):e))("self"===e?s:e)))),s.contains.forEach((e=>{t(e,o) })),s.starts&&t(s.starts,r),o.matcher=(e=>{const n=new i ;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" }))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" }),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function Q(e){ return!!e&&(e.endsWithParent||Q(e.starts))}class V extends Error{ constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ const a=Object.create(null),i=Object.create(null),s=[];let r=!0 ;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ disableAutodetect:!0,name:"Plain text",contains:[]};let p={ ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", cssSelector:"pre code",languages:null,__emitter:l};function h(e){ return p.noHighlightRe.test(e)}function f(e,n,t){let a="",i="" ;"object"==typeof n?(a=e, t=n.ignoreIllegals,i=n.language):(Z("10.7.0","highlight(lang, code, ...args) has been deprecated."), Z("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), i=e,a=n),void 0===t&&(t=!0);const s={code:a,language:i};O("before:highlight",s) ;const r=s.result?s.result:_(s.language,s.code,t) ;return r.code=s.code,O("after:highlight",r),r}function _(e,t,i,s){ const l=Object.create(null);function c(){if(!O.keywords)return void A.addText(M) ;let e=0;O.keywordPatternRe.lastIndex=0;let n=O.keywordPatternRe.exec(M),t="" ;for(;n;){t+=M.substring(e,n.index) ;const i=w.case_insensitive?n[0].toLowerCase():n[0],s=(a=i,O.keywords[a]);if(s){ const[e,a]=s ;if(A.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ const t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] ;e=O.keywordPatternRe.lastIndex,n=O.keywordPatternRe.exec(M)}var a ;t+=M.substring(e),A.addText(t)}function d(){null!=O.subLanguage?(()=>{ if(""===M)return;let e=null;if("string"==typeof O.subLanguage){ if(!a[O.subLanguage])return void A.addText(M) ;e=_(O.subLanguage,M,!0,S[O.subLanguage]),S[O.subLanguage]=e._top }else e=E(M,O.subLanguage.length?O.subLanguage:null) ;O.relevance>0&&(C+=e.relevance),A.__addSublanguage(e._emitter,e.language) })():c(),M=""}function g(e,n){ ""!==e&&(A.startScope(n),A.addText(e),A.endScope())}function u(e,n){let t=1 ;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} const a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(M=i,c(),M=""),t++}} function b(e,n){ return e.scope&&"string"==typeof e.scope&&A.openNode(w.classNameAliases[e.scope]||e.scope), e.beginScope&&(e.beginScope._wrap?(g(M,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), M=""):e.beginScope._multi&&(u(e.beginScope,n),M="")),O=Object.create(e,{parent:{ value:O}}),O}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) ;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) ;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ for(;e.endsParent&&e.parent;)e=e.parent;return e}} if(e.endsWithParent)return m(e.parent,t,a)}function h(e){ return 0===O.matcher.regexIndex?(M+=e[0],1):(D=!0,0)}function f(e){ const n=e[0],a=t.substring(e.index),i=m(O,e,a);if(!i)return ee;const s=O ;O.endScope&&O.endScope._wrap?(d(), g(n,O.endScope._wrap)):O.endScope&&O.endScope._multi?(d(), u(O.endScope,e)):s.skip?M+=n:(s.returnEnd||s.excludeEnd||(M+=n), d(),s.excludeEnd&&(M=n));do{ O.scope&&A.closeNode(),O.skip||O.subLanguage||(C+=O.relevance),O=O.parent }while(O!==i.parent);return i.starts&&b(i.starts,e),s.returnEnd?0:n.length} let N={};function y(a,s){const o=s&&s[0];if(M+=a,null==o)return d(),0 ;if("begin"===N.type&&"end"===s.type&&N.index===s.index&&""===o){ if(M+=t.slice(s.index,s.index+1),!r){const n=Error(`0 width match regex (${e})`) ;throw n.languageName=e,n.badRule=N.rule,n}return 1} if(N=s,"begin"===s.type)return(e=>{ const t=e[0],a=e.rule,i=new n(a),s=[a.__beforeBegin,a["on:begin"]] ;for(const n of s)if(n&&(n(e,i),i.isMatchIgnored))return h(t) ;return a.skip?M+=t:(a.excludeBegin&&(M+=t), d(),a.returnBegin||a.excludeBegin||(M=t)),b(a,e),a.returnBegin?0:t.length})(s) ;if("illegal"===s.type&&!i){ const e=Error('Illegal lexeme "'+o+'" for mode "'+(O.scope||"")+'"') ;throw e.mode=O,e}if("end"===s.type){const e=f(s);if(e!==ee)return e} if("illegal"===s.type&&""===o)return 1 ;if(R>1e5&&R>3*s.index)throw Error("potential infinite loop, way more iterations than matches") ;return M+=o,o.length}const w=v(e) ;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') ;const k=X(w);let x="",O=s||k;const S={},A=new p.__emitter(p);(()=>{const e=[] ;for(let n=O;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) ;e.forEach((e=>A.openNode(e)))})();let M="",C=0,T=0,R=0,D=!1;try{ if(w.__emitTokens)w.__emitTokens(t,A);else{for(O.matcher.considerAll();;){ R++,D?D=!1:O.matcher.considerAll(),O.matcher.lastIndex=T ;const e=O.matcher.exec(t);if(!e)break;const n=y(t.substring(T,e.index),e) ;T=e.index+n}y(t.substring(T))}return A.finalize(),x=A.toHTML(),{language:e, value:x,relevance:C,illegal:!1,_emitter:A,_top:O}}catch(n){ if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:x},_emitter:A};if(r)return{ language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:A,_top:O} ;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} ;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(x).map((n=>_(n,e,!1))) ;i.unshift(t);const s=i.sort(((e,n)=>{ if(e.relevance!==n.relevance)return n.relevance-e.relevance ;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 ;if(v(n.language).supersetOf===e.language)return-1}return 0})),[r,o]=s,l=r ;return l.secondBest=o,l}function N(e){let n=null;const t=(e=>{ let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" ;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) ;return n||(H(o.replace("{}",t[1])), H("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} return n.split(/\s+/).find((e=>h(e)||v(e)))})(e);if(h(t))return ;if(O("before:highlightElement",{el:e,language:t }),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) ;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), console.warn("The element with unescaped HTML:"), console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) ;n=e;const a=n.textContent,s=t?f(a,{language:t,ignoreIllegals:!0}):E(a) ;e.innerHTML=s.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t ;e.classList.add("hljs"),e.classList.add("language-"+a) })(e,t,s.language),e.result={language:s.language,re:s.relevance, relevance:s.relevance},s.secondBest&&(e.secondBest={ language:s.secondBest.language,relevance:s.secondBest.relevance }),O("after:highlightElement",{el:e,result:s,text:a})}let y=!1;function w(){ "loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(N):y=!0 }function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} function k(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ i[e.toLowerCase()]=n}))}function x(e){const n=v(e) ;return n&&!n.disableAutodetect}function O(e,n){const t=e;s.forEach((e=>{ e[t]&&e[t](n)}))} "undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ y&&w()}),!1),Object.assign(t,{highlight:f,highlightAuto:E,highlightAll:w, highlightElement:N, highlightBlock:e=>(Z("10.7.0","highlightBlock will be removed entirely in v12.0"), Z("10.7.0","Please use highlightElement now."),N(e)),configure:e=>{p=Y(p,e)}, initHighlighting:()=>{ w(),Z("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, initHighlightingOnLoad:()=>{ w(),Z("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") },registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ if(K("Language definition for '{}' could not be registered.".replace("{}",e)), !r)throw n;K(n),i=c} i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&k(i.aliases,{ languageName:e})},unregisterLanguage:e=>{delete a[e] ;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:k, autoDetection:x,inherit:Y,addPlugin:e=>{(e=>{ e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ e["before:highlightBlock"](Object.assign({block:n.el},n)) }),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),s.push(e)}, removePlugin:e=>{const n=s.indexOf(e);-1!==n&&s.splice(n,1)}}),t.debugMode=()=>{ r=!1},t.safeMode=()=>{r=!0},t.versionString="11.8.0",t.regex={concat:b, lookahead:d,either:m,optional:u,anyNumberOfTimes:g} ;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t },te=ne({});te.newInstance=()=>ne({});var ae=te ;const ie=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],se=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],re=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],oe=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],le=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse() ;var ce="[0-9](_*[0-9])*",de=`\\.(${ce})`,ge="[0-9a-fA-F](_*[0-9a-fA-F])*",ue={ className:"number",variants:[{ begin:`(\\b(${ce})((${de})|\\.)?|(${de}))[eE][+-]?(${ce})[fFdD]?\\b`},{ begin:`\\b(${ce})((${de})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ begin:`(${de})[fFdD]?\\b`},{begin:`\\b(${ce})[fFdD]\\b`},{ begin:`\\b0[xX]((${ge})\\.?|(${ge})?\\.(${ge}))[pP][+-]?(${ce})[fFdD]?\\b`},{ begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${ge})[lL]?\\b`},{ begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], relevance:0};function be(e,n,t){return-1===t?"":e.replace(n,(a=>be(e,n,t-1)))} const me="[A-Za-z$_][0-9A-Za-z$_]*",pe=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],he=["true","false","null","undefined","NaN","Infinity"],fe=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],_e=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ee=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],Ne=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ye=[].concat(Ee,fe,_e),we=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),ve=["Protocol","Type"].map(we),ke=["init","self"].map(we),xe=["Any","Self"],Oe=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","break","case","catch","class","continue","convenience","default","defer","deinit","didSet","distributed","do","dynamic","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Se=["false","nil","true"],Ae=["assignment","associativity","higherThan","left","lowerThan","none","right"],Me=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warn_unqualified_access","#warning"],Ce=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Te=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Re=m(Te,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),De=b(Te,Re,"*"),Ie=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),Be=m(Ie,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Le=b(Ie,Be,"*"),$e=b(/[A-Z]/,Be,"*"),Fe=["autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Le,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","testable","UIApplicationMain","unknown","usableFromInline"],ze=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] ;var Ue=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} ;Object.assign(t,{className:"variable",variants:[{ begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},s={ begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, end:/(\w+)/,className:"string"})]}},r={className:"string",begin:/"/,end:/"/, contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(r);const o={begin:/\$?\(\(/, end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] },l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 }),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], literal:["true","false"], built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] },contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,s,{match:/(\/[a-z._-]+)+/},r,{ className:"",begin:/\\"/},{className:"string",begin:/'/,end:/'/},t]}}, grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] }),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",s="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",r={ className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ className:"number",variants:[{begin:"\\b(0b[01']+)"},{ begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" },{ begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" }],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" },contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 },g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], literal:"true false NULL", built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" },b=[c,r,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ begin:"("+s+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,r,{begin:/\(/, end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,r] }]},r,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, disableAutodetect:!0,illegal:"=]/,contains:[{ beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, strings:o,keywords:u}}},grmr_css:e=>{const n=e.regex,t=(e=>({IMPORTANT:{ scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ scope:"number", begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z][A-Za-z0-9_-]*/} }))(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{name:"CSS", case_insensitive:!0,illegal:/[=|'\$]/,keywords:{keyframePosition:"from to"}, classNameAliases:{keyframePosition:"selector-tag"},contains:[t.BLOCK_COMMENT,{ begin:/-(webkit|moz|ms|o)-(?=[a-z])/},t.CSS_NUMBER_MODE,{ className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0},{ className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 },t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ begin:":("+re.join("|")+")"},{begin:":(:)?("+oe.join("|")+")"}] },t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+le.join("|")+")\\b"},{ begin:/:/,end:/[;}{]/, contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" },contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ },{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ $pattern:/[a-z-]+/,keyword:"and or not only",attribute:se.join(" ")},contains:[{ begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ className:"selector-tag",begin:"\\b("+ie.join("|")+")\\b"}]}},grmr_xml:e=>{ const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] },s=e.inherit(i,{begin:/\(/,end:/\)/}),r=e.inherit(e.APOS_STRING_MODE,{ className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ endsWithParent:!0,illegal:/`]+/}]}]}]};return{ name:"HTML, XML", aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,r,s,{begin:/\[/,end:/\]/,contains:[{ className:"meta",begin://,contains:[i,s,o,r]}]}] },e.COMMENT(//,{relevance:10}),{begin://, relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ className:"tag",begin:/<>|<\/>/},{className:"tag", begin:n.concat(//,/>/,/\s/)))), end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} },grmr_markdown:e=>{const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml", relevance:0},t={variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, relevance:2},{ begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ },{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] },i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ begin:/_(?![_\s])/,end:/_/,relevance:0}]},s=e.inherit(a,{contains:[] }),r=e.inherit(i,{contains:[]});a.contains.push(r),i.contains.push(s) ;let o=[n,t];return[a,i,s,r].forEach((e=>{e.contains=e.contains.concat(o) })),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_dart:e=>{ const n={className:"subst",variants:[{begin:"\\$[A-Za-z0-9_]+"}]},t={ className:"subst",variants:[{begin:/\$\{/,end:/\}/}], keywords:"true false null this is new super"},a={className:"string",variants:[{ begin:"r'''",end:"'''"},{begin:'r"""',end:'"""'},{begin:"r'",end:"'", illegal:"\\n"},{begin:'r"',end:'"',illegal:"\\n"},{begin:"'''",end:"'''", contains:[e.BACKSLASH_ESCAPE,n,t]},{begin:'"""',end:'"""', contains:[e.BACKSLASH_ESCAPE,n,t]},{begin:"'",end:"'",illegal:"\\n", contains:[e.BACKSLASH_ESCAPE,n,t]},{begin:'"',end:'"',illegal:"\\n", contains:[e.BACKSLASH_ESCAPE,n,t]}]};t.contains=[e.C_NUMBER_MODE,a] ;const i=["Comparable","DateTime","Duration","Function","Iterable","Iterator","List","Map","Match","Object","Pattern","RegExp","Set","Stopwatch","String","StringBuffer","StringSink","Symbol","Type","Uri","bool","double","int","num","Element","ElementList"],s=i.map((e=>e+"?")) ;return{name:"Dart",keywords:{ keyword:["abstract","as","assert","async","await","base","break","case","catch","class","const","continue","covariant","default","deferred","do","dynamic","else","enum","export","extends","extension","external","factory","false","final","finally","for","Function","get","hide","if","implements","import","in","interface","is","late","library","mixin","new","null","on","operator","part","required","rethrow","return","sealed","set","show","static","super","switch","sync","this","throw","true","try","typedef","var","void","when","while","with","yield"], built_in:i.concat(s).concat(["Never","Null","dynamic","print","document","querySelector","querySelectorAll","window"]), $pattern:/[A-Za-z][A-Za-z0-9_]*\??/}, contains:[a,e.COMMENT(/\/\*\*(?!\/)/,/\*\//,{subLanguage:"markdown",relevance:0 }),e.COMMENT(/\/{3,} ?/,/$/,{contains:[{subLanguage:"markdown",begin:".", end:"$",relevance:0}]}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{ className:"class",beginKeywords:"class interface",end:/\{/,excludeEnd:!0, contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE] },e.C_NUMBER_MODE,{className:"meta",begin:"@[A-Za-z]+"},{begin:"=>"}]}}, grmr_diff:e=>{const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ className:"meta",relevance:10, match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) },{className:"comment",variants:[{ begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, end:/$/}]}},grmr_java:e=>{ const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+be("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"], literal:["false","true","null"], type:["char","boolean","long","float","int","byte","short","double"], built_in:["super","this"]},s={className:"meta",begin:"@"+t,contains:[{ begin:/\(/,end:/\)/,contains:["self"]}]},r={className:"params",begin:/\(/, end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} ;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, className:"string",contains:[e.BACKSLASH_ESCAPE] },e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ 1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", 3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", 3:"title.class"},contains:[r,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ beginKeywords:"new throw return else",relevance:0},{ begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ 2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, end:/\)/,keywords:i,relevance:0, contains:[s,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,ue,e.C_BLOCK_COMMENT_MODE] },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},ue,s]}},grmr_javascript:e=>{ const n=e.regex,t=me,a={begin:/<[A-Za-z0-9\\._:-]+/, end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ const t=e[0].length+e.index,a=e.input[t] ;if("<"===a||","===a)return void n.ignoreMatch();let i ;">"===a&&(((e,{after:n})=>{const t="",S={ match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(O)], keywords:"async",className:{1:"keyword",3:"title.function"},contains:[_]} ;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ PARAMS_CONTAINS:f,CLASS_REFERENCE:N},illegal:/#(?![$_A-z])/, contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ label:"use_strict",className:"meta",relevance:10, begin:/^\s*['"]use (strict|asm)['"]/ },e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,N,{ className:"attr",begin:t+n.lookahead(":"),relevance:0},S,{ begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ className:"function",begin:O,returnBegin:!0,end:"\\s*=>",contains:[{ className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, excludeEnd:!0,keywords:i,contains:f}]}]},{begin:/,/,relevance:0},{match:/\s+/, relevance:0},{variants:[{begin:"<>",end:""},{ match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, "on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},y,{ beginKeywords:"while if switch catch for"},{ begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", returnBegin:!0,label:"func.def",contains:[_,e.inherit(e.TITLE_MODE,{begin:t, className:"title.function"})]},{match:/\.\.\./,relevance:0},k,{match:"\\$"+t, relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, contains:[_]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, className:"variable.constant"},E,x,{match:/\$[(.]/}]}},grmr_json:e=>{ const n=["true","false","null"],t={scope:"literal",beginKeywords:n.join(" ")} ;return{name:"JSON",keywords:{literal:n},contains:[{className:"attr", begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{match:/[{}[\],:]/, className:"punctuation",relevance:0 },e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], illegal:"\\S"}},grmr_kotlin:e=>{const n={ keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" },a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},s={className:"string", variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(s);const r={ className:"meta", begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" },o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, end:/\)/,contains:[e.inherit(s,{className:"string"}),"self"]}] },l=ue,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], {name:"Kotlin",aliases:["kt","kts"],keywords:n, contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", begin:/@\w+/}]}},t,r,o,{className:"function",beginKeywords:"fun",end:"[(]|$", returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 },e.C_LINE_COMMENT_MODE,c,r,o,s,e.C_NUMBER_MODE]},c]},{ begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ 3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, illegal:"extends implements",contains:[{ beginKeywords:"public protected internal private constructor" },e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, excludeBegin:!0,returnEnd:!0},r,o]},s,{className:"meta",begin:"^#!/usr/bin/env", end:"$",illegal:"\n"},l]}},grmr_objectivec:e=>{ const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, keyword:["@interface","@class","@protocol","@implementation"]};return{ name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], keywords:{"variable.language":["this","super"],$pattern:n, keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] },illegal:"/,end:/$/,illegal:"\\n" },e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, relevance:0}]}},grmr_plaintext:e=>({name:"Plain text",aliases:["text","txt"], disableAutodetect:!0}),grmr_shell:e=>({name:"Shell Session", aliases:["console","shellsession"],contains:[{className:"meta.prompt", begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, subLanguage:"bash"}}]}),grmr_swift:e=>{const n={match:/\s+/,relevance:0 },t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ match:[/\./,m(...ve,...ke)],className:{2:"keyword"}},s={match:b(/\./,m(...Oe)), relevance:0},r=Oe.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ className:"keyword", match:m(...Oe.filter((e=>"string"!=typeof e)).concat(xe).map(we),...ke)}]},l={ $pattern:m(/\b\w+/,/#\w+/),keyword:r.concat(Me),literal:Se},c=[i,s,o],g=[{ match:b(/\./,m(...Ce)),relevance:0},{className:"built_in", match:b(/\b/,m(...Ce),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ className:"operator",relevance:0,variants:[{match:De},{match:`\\.(\\.|${Re})+`}] }],h="([0-9]_*)+",f="([0-9a-fA-F]_*)+",_={className:"number",relevance:0, variants:[{match:`\\b(${h})(\\.(${h}))?([eE][+-]?(${h}))?\\b`},{ match:`\\b0x(${f})(\\.(${f}))?([pP][+-]?(${h}))?\\b`},{match:/\b0o([0-7]_*)+\b/ },{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] }),N=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) }),y=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ }),w=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),N(e),y(e)] }),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),y(e)]}),k={ className:"string", variants:[w(),w("#"),w("##"),w("###"),v(),v("#"),v("##"),v("###")]},x={ match:b(/`/,Le,/`/)},O=[x,{className:"variable",match:/\$\d+/},{ className:"variable",match:`\\$${Be}+`}],S=[{match:/(@|#(un)?)available/, className:"keyword",starts:{contains:[{begin:/\(/,end:/\)/,keywords:ze, contains:[...p,_,k]}]}},{className:"keyword",match:b(/@/,m(...Fe))},{ className:"meta",match:b(/@/,Le)}],A={match:d(/\b[A-Z]/),relevance:0,contains:[{ className:"type", match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,Be,"+") },{className:"type",match:$e,relevance:0},{match:/[?!]+/,relevance:0},{ match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d($e)),relevance:0}]},M={ begin://,keywords:l,contains:[...a,...c,...S,u,A]};A.contains.push(M) ;const C={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ match:b(Le,/\s*:/),keywords:"_|0",relevance:0 },...a,...c,...g,...p,_,k,...O,...S,A]},T={begin://,contains:[...a,A] },R={begin:/\(/,end:/\)/,keywords:l,contains:[{ begin:m(d(b(Le,/\s*:/)),d(b(Le,/\s+/,Le,/\s*:/))),end:/:/,relevance:0, contains:[{className:"keyword",match:/\b_\b/},{className:"params",match:Le}] },...a,...c,...p,_,k,...S,A,C],endsParent:!0,illegal:/["']/},D={ match:[/func/,/\s+/,m(x.match,Le,De)],className:{1:"keyword",3:"title.function" },contains:[T,R,n],illegal:[/\[/,/%/]},I={ match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, contains:[T,R,n],illegal:/\[|%/},B={match:[/operator/,/\s+/,De],className:{ 1:"keyword",3:"title"}},L={begin:[/precedencegroup/,/\s+/,$e],className:{ 1:"keyword",3:"title"},contains:[A],keywords:[...Ae,...Se],end:/}/} ;for(const e of k.variants){const n=e.contains.find((e=>"interpol"===e.label)) ;n.keywords=l;const t=[...c,...g,...p,_,k,...O];n.contains=[...t,{begin:/\(/, end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, contains:[...a,D,I,{beginKeywords:"struct protocol class extension enum actor", end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] },B,L,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 },...c,...g,...p,_,k,...O,...S,A,C]}},grmr_ruby:e=>{ const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),s={ "variable.constant":["__FILE__","__LINE__","__ENCODING__"], "variable.language":["self","super"], keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], literal:["true","false","nil"]},r={className:"doctag",begin:"@[A-Za-z]+"},o={ begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[r] }),e.COMMENT("^=begin","^=end",{contains:[r],relevance:10 }),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, end:/\}/,keywords:s},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", relevance:0,variants:[{ begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" },{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, keywords:s}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", 4:"title.class.inherited"},keywords:s},{match:[/(include|extend)\s+/,i],scope:{ 2:"title.class"},keywords:s},{relevance:0,match:[i,/\.new[. (]/],scope:{ 1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ begin:e.IDENT_RE+"::"},{className:"symbol", begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, relevance:0,keywords:s},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) ;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} },{className:"meta.prompt", begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", starts:{end:"$",keywords:s,contains:m}}];return l.unshift(o),{name:"Ruby", aliases:["rb","gemspec","podspec","thor","irb"],keywords:s,illegal:/\/\*/, contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, grmr_yaml:e=>{ const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ },{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),s={ end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},r={begin:/\{/, end:/\}/,contains:[s],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", contains:[s],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", relevance:10},{className:"string", begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t },{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ className:"number", begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" },{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},r,o,a],c=[...l] ;return c.pop(),c.push(i),s.contains=c,{name:"YAML",case_insensitive:!0, aliases:["yml"],contains:l}}});const je=ae;for(const e of Object.keys(Ue)){ const n=e.replace("grmr_","").replace("_","-");je.registerLanguage(n,Ue[e])} return je}() ;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/readme.md ================================================ # Dart documentation generator This directory includes static sources used by the Dart documentation generator through the `dart doc` command. To learn more about generating and viewing the generated documentation, check out the [`dart doc` documentation][]. [`dart doc` documentation]: https://dart.dev/tools/dart-doc ## Third-party resources ## highlight.js Generated from https://highlightjs.org/download/ on 2021-07-13. **License:** https://github.com/highlightjs/highlight.js/blob/main/LICENSE **Included languages:** * bash * c * css * dart * diff * html, xml * java * javascript * json * kotlin * markdown * objective-c * plaintext * shell * swift * yaml ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/script.js ================================================ /* * * Update script.js versions in all lib/templates when modifying this file! * */ function initSideNav() { const leftNavToggle = document.getElementById('sidenav-left-toggle'); const leftDrawer = document.querySelector('.sidebar-offcanvas-left'); const overlay = document.getElementById('overlay-under-drawer'); function toggleBoth() { if (leftDrawer) { leftDrawer.classList.toggle('active'); } if (overlay) { overlay.classList.toggle('active'); } } if (overlay) { overlay.addEventListener('click', toggleBoth); } if (leftNavToggle) { leftNavToggle.addEventListener('click', toggleBoth); } } function saveLeftScroll() { const leftSidebar = document.getElementById('dartdoc-sidebar-left'); sessionStorage.setItem('dartdoc-sidebar-left-scrollt' + window.location.pathname, leftSidebar.scrollTop.toString()); sessionStorage.setItem('dartdoc-sidebar-left-scrolll' + window.location.pathname, leftSidebar.scrollLeft.toString()); } function saveMainContentScroll() { const mainContent = document.getElementById('dartdoc-main-content'); sessionStorage.setItem('dartdoc-main-content-scrollt' + window.location.pathname, mainContent.scrollTop.toString()); sessionStorage.setItem('dartdoc-main-content-scrolll' + window.location.pathname, mainContent.scrollLeft.toString()); } function saveRightScroll() { const rightSidebar = document.getElementById('dartdoc-sidebar-right'); sessionStorage.setItem('dartdoc-sidebar-right-scrollt' + window.location.pathname, rightSidebar.scrollTop.toString()); sessionStorage.setItem('dartdoc-sidebar-right-scrolll' + window.location.pathname, rightSidebar.scrollLeft.toString()); } function restoreScrolls() { const leftSidebar = document.getElementById('dartdoc-sidebar-left'); const mainContent = document.getElementById('dartdoc-main-content'); const rightSidebar = document.getElementById('dartdoc-sidebar-right'); try { const leftSidebarX = sessionStorage.getItem('dartdoc-sidebar-left-scrolll' + window.location.pathname); const leftSidebarY = sessionStorage.getItem('dartdoc-sidebar-left-scrollt' + window.location.pathname); const mainContentX = sessionStorage.getItem('dartdoc-main-content-scrolll' + window.location.pathname); const mainContentY = sessionStorage.getItem('dartdoc-main-content-scrollt' + window.location.pathname); const rightSidebarX = sessionStorage.getItem('dartdoc-sidebar-right-scrolll' + window.location.pathname); const rightSidebarY = sessionStorage.getItem('dartdoc-sidebar-right-scrollt' + window.location.pathname); leftSidebar.scrollTo(parseFloat(leftSidebarX), parseFloat(leftSidebarY)); mainContent.scrollTo(parseFloat(mainContentX), parseFloat(mainContentY)); rightSidebar.scrollTo(parseFloat(rightSidebarX), parseFloat(rightSidebarY)); } finally { // Set visibility to visible after scroll to prevent the brief appearance of the // panel in the wrong position. leftSidebar.style.visibility = 'visible'; mainContent.style.visibility = 'visible'; rightSidebar.style.visibility = 'visible'; } } function initScrollSave() { const leftSidebar = document.getElementById('dartdoc-sidebar-left'); const mainContent = document.getElementById('dartdoc-main-content'); const rightSidebar = document.getElementById('dartdoc-sidebar-right'); leftSidebar.addEventListener("scroll", saveLeftScroll, true); mainContent.addEventListener("scroll", saveMainContentScroll, true); rightSidebar.addEventListener("scroll", saveRightScroll, true); } const weights = { 'library' : 2, 'class' : 2, 'mixin' : 3, 'extension' : 3, 'typedef' : 3, 'method' : 4, 'accessor' : 4, 'operator' : 4, 'constant' : 4, 'property' : 4, 'constructor' : 4 }; function findMatches(index, query) { if (query === '') { return []; } const allMatches = []; index.forEach(element => { function score(value) { value -= element.overriddenDepth * 10; const weightFactor = weights[element.type] || 4; allMatches.push({element: element, score: (value / weightFactor) >> 0}); } const name = element.name; const qualifiedName = element.qualifiedName; const lowerName = name.toLowerCase(); const lowerQualifiedName = qualifiedName.toLowerCase(); const lowerQuery = query.toLowerCase(); if (name === query || qualifiedName === query || name === `dart:${query}`) { score(2000); } else if (lowerName === `dart:${lowerQuery}`) { score(1800); } else if (lowerName === lowerQuery || lowerQualifiedName === lowerQuery) { score(1700); } else if (query.length > 1) { if (name.startsWith(query) || qualifiedName.startsWith(query)) { score(750); } else if (lowerName.startsWith(lowerQuery) || lowerQualifiedName.startsWith(lowerQuery)) { score(650); } else if (name.includes(query) || qualifiedName.includes(query)) { score(500); } else if (lowerName.includes(lowerQuery) || lowerQualifiedName.includes(query)) { score(400); } } }); allMatches.sort((a, b) => { const x = b.score - a.score; if (x === 0) { return a.element.name.length - b.element.name.length; } return x; }); const justElements = []; for (let i = 0; i < allMatches.length; i++) { justElements.push(allMatches[i].element); } return justElements; } let baseHref = ''; const minLength = 1; const suggestionLimit = 10; function initializeSearch(input, index) { input.disabled = false; input.setAttribute('placeholder', 'Search API Docs'); // Handle grabbing focus when the users types / outside of the input document.addEventListener('keypress', (event) => { if (event.code === 'Slash' && !(document.activeElement instanceof HTMLInputElement)) { event.preventDefault(); input.focus(); } }); // Prepare elements const parentForm = input.parentNode; const wrapper = document.createElement('div'); wrapper.classList.add('tt-wrapper'); parentForm.replaceChild(wrapper, input); const inputHint = document.createElement('input'); inputHint.setAttribute('type', 'text'); inputHint.setAttribute('autocomplete', 'off'); inputHint.setAttribute('readonly', 'true'); inputHint.setAttribute('spellcheck', 'false'); inputHint.setAttribute('tabindex', '-1'); inputHint.classList.add('typeahead', 'tt-hint'); wrapper.appendChild(inputHint); input.setAttribute('autocomplete', 'off'); input.setAttribute('spellcheck', 'false'); input.classList.add('tt-input'); wrapper.appendChild(input); const listBox = document.createElement('div'); listBox.setAttribute('role', 'listbox'); listBox.setAttribute('aria-expanded', 'false'); listBox.style.display = 'none'; listBox.classList.add('tt-menu'); const presentation = document.createElement('div'); presentation.classList.add('tt-elements'); listBox.appendChild(presentation); wrapper.appendChild(listBox); // Set up various search functionality function highlight(text, query) { query = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); return text.replace(new RegExp(query, 'gi'), (matched) => { return `${matched}`; }); } function createSuggestion(query, match) { const suggestion = document.createElement('div'); suggestion.setAttribute('data-href', match.href); suggestion.classList.add('tt-suggestion'); const suggestionTitle = document.createElement('span'); suggestionTitle.classList.add('tt-suggestion-title'); suggestionTitle.innerHTML = highlight(`${match.name} ${match.type.toLowerCase()}`, query); suggestion.appendChild(suggestionTitle); if (match.enclosedBy) { const fromLib = document.createElement('div'); fromLib.classList.add('search-from-lib'); fromLib.innerHTML = `from ${highlight(match.enclosedBy.name, query)}`; suggestion.appendChild(fromLib); } suggestion.addEventListener('mousedown', event => { event.preventDefault(); }); suggestion.addEventListener('click', event => { if (match.href) { window.location = baseHref + match.href; event.preventDefault(); } }); return suggestion; } let storedValue = null; let actualValue = ''; let hint = null; let suggestionElements = []; let suggestionsInfo = []; let selectedElement = null; function setHint(value) { hint = value; inputHint.value = value || ''; } function updateSuggestions(query, suggestions) { suggestionsInfo = []; suggestionElements = []; presentation.textContent = ''; if (suggestions.length < minLength) { setHint(null) hideSuggestions(); return; } for (let i = 0; i < suggestions.length; i++) { const element = createSuggestion(query, suggestions[i]); suggestionElements.push(element); presentation.appendChild(element); } suggestionsInfo = suggestions; setHint(query + suggestions[0].name.slice(query.length)); selectedElement = null; showSuggestions(); } function handle(newValue, forceUpdate) { if (actualValue === newValue && !forceUpdate) { return; } if (newValue === null || newValue.length === 0) { updateSuggestions('', []); return; } const suggestions = findMatches(index, newValue).slice(0, suggestionLimit); actualValue = newValue; updateSuggestions(newValue, suggestions); } function showSuggestions() { if (presentation.hasChildNodes()) { listBox.style.display = 'block'; listBox.setAttribute('aria-expanded', 'true'); } } function hideSuggestions() { listBox.style.display = 'none'; listBox.setAttribute('aria-expanded', 'false'); } // Hook up events input.addEventListener('focus', () => { handle(input.value, true); }); input.addEventListener('blur', () => { selectedElement = null; if (storedValue !== null) { input.value = storedValue; storedValue = null; } hideSuggestions(); setHint(null); }); input.addEventListener('input', event => { handle(event.target.value); }); input.addEventListener('keydown', event => { if (suggestionElements.length === 0) { return; } if (event.code === 'Enter') { const selectingElement = selectedElement || 0; const href = suggestionElements[selectingElement].dataset.href; if (href) { window.location = baseHref + href; } return; } if (event.code === 'Tab') { if (selectedElement === null) { // The user wants to fill the field with the hint if (hint !== null) { input.value = hint; handle(hint); event.preventDefault(); } } else { // The user wants to fill the input field with their currently selected suggestion handle(suggestionsInfo[selectedElement].name); storedValue = null; selectedElement = null; event.preventDefault(); } return; } const lastIndex = suggestionElements.length - 1; const previousSelectedElement = selectedElement; if (event.code === 'ArrowUp') { if (selectedElement === null) { selectedElement = lastIndex; } else if (selectedElement === 0) { selectedElement = null; } else { selectedElement--; } } else if (event.code === 'ArrowDown') { if (selectedElement === null) { selectedElement = 0; } else if (selectedElement === lastIndex) { selectedElement = null; } else { selectedElement++; } } else { if (storedValue !== null) { storedValue = null; handle(input.value); } return; } if (previousSelectedElement !== null) { suggestionElements[previousSelectedElement].classList.remove('tt-cursor'); } if (selectedElement !== null) { const selected = suggestionElements[selectedElement]; selected.classList.add('tt-cursor'); // Guarantee the selected element is visible if (selectedElement === 0) { listBox.scrollTop = 0; } else if (selectedElement === lastIndex) { listBox.scrollTop = listBox.scrollHeight; } else { const offsetTop = selected.offsetTop; const parentOffsetHeight = listBox.offsetHeight; if (offsetTop < parentOffsetHeight || parentOffsetHeight < (offsetTop + selected.offsetHeight)) { selected.scrollIntoView({behavior: 'auto', block: 'nearest'}); } } if (storedValue === null) { // Store the actual input value to display their currently selected item storedValue = input.value; } input.value = suggestionsInfo[selectedElement].name; setHint(''); } else if (storedValue !== null && previousSelectedElement !== null) { // They are moving back to the input field, so return the stored value input.value = storedValue; setHint(storedValue + suggestionsInfo[0].name.slice(storedValue.length)); storedValue = null; } event.preventDefault(); }); } document.addEventListener('DOMContentLoaded', () => { // Place this first so that unexpected exceptions in other JavaScript do not block page visibility. restoreScrolls(); hljs.highlightAll(); initSideNav(); initScrollSave(); const searchBox = document.getElementById('search-box'); const searchBody = document.getElementById('search-body'); const searchSidebar = document.getElementById('search-sidebar'); if (document.body.getAttribute('data-using-base-href') === 'false') { // If dartdoc did not add a base-href tag, we will need to add the relative // path ourselves. baseHref = document.body.getAttribute('data-base-href'); } function disableSearch() { console.log('Could not activate search functionality.'); if (searchBox) { searchBox.placeholder = 'Failed to initialize search'; } if (searchBody) { searchBody.placeholder = 'Failed to initialize search'; } if (searchSidebar) { searchSidebar.placeholder = 'Failed to initialize search'; } } if ('fetch' in window) { fetch(baseHref + 'index.json', {method: 'GET'}) .then(response => response.json()) .then(index => { // Handle if the user specified a `search` parameter in the URL if ('URLSearchParams' in window) { const search = new URLSearchParams(window.location.search).get('search'); if (search) { const matches = findMatches(search); if (matches.length !== 0) { window.location = baseHref + matches[0].href; return; } } } // Initialize all three search fields if (searchBox) { initializeSearch(searchBox, index); } if (searchBody) { initializeSearch(searchBody, index); } if (searchSidebar) { initializeSearch(searchSidebar, index); } }) .catch(() => { disableSearch(); }); } else { disableSearch(); } }); ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/doc/api/static-assets/styles.css ================================================ .light-theme { /*background-color body, listdropdown*/ --main-bg-color: #fff; /*header id-tittle*/ --main-header-color: #eeeeee; /*package-name*/ --main-sidebar-color: #727272; /*section-title and section subtitle, desc markdown(body, dd, h3), header a*/ --main-text-color: #111111; /*typehead search-box*/ --main-search-bar: #fff; /* scrollbar-thumb */ --main-scrollbar-color: #CCC; /* footer */ --main-footer-background: #111111; /*header text color*/ --main-h-text: black; /* hyperlinks*/ --main-hyperlinks-color: #0175C2; /*search background*/ --main-search-background: transparent; /*code snippets*/ --main-code-bg: #f8f8f8; --main-keyword-color: #333; --main-tag-color: #000080; --main-section-color: #900; --main-comment-color: #998; --main-var-color: #008080; --main-string-color: #d14; --main-number-filter: invert(0%); --main-icon-color: black; /* alerts */ --alert-info: #e7f8ff; --alert-tip: #ecfaf7; --alert-important: #e2dbff; --alert-warning: #fcf8e3; --alert-error: #fde9ee; } .dark-theme { /*background-color body, listdropdown*/ --main-bg-color: #10161E; /*header id-tittle*/ --main-header-color: #1C2834; /*package-name*/ --main-sidebar-color: #fff; /*section-title and section subtitle, desc markdown(body, dd, h3), header a*/ --main-text-color: #fff; /*typehead search-box*/ --main-search-bar: #454545; /* scrollbar-thumb */ --main-scrollbar-color: #5f6368; /* footer */ --main-footer-background: #27323a; /* hyperlinks*/ --main-hyperlinks-color: #00D2FA; /*search background*/ --main-search-background: black; /*code snippets*/ --main-code-bg: #10161E; --main-keyword-color: white; --main-tag-color: #00D2FA; --main-section-color: #FF2D64; --main-comment-color: #909CC3; --main-var-color: #55A09B; --main-string-color: #FF2D64; --main-number-filter: invert(100%); --main-icon-color: white; /* alerts */ --alert-info: #043875; --alert-tip: #065517; --alert-important: #4a00b4; --alert-warning: #7b6909; --alert-error: #7a0c17; } #theme { display: none; } #theme-button { position: absolute; right: 30px; height: 24px; } #theme-button .material-symbols-outlined { color: var(--main-icon-color); user-select: none; cursor: pointer; } #theme-button .material-symbols-outlined:hover { color: var(--main-hyperlinks-color); } li .material-symbols-outlined, dt .material-symbols-outlined { font-size: 1em; vertical-align: text-bottom; } dt .material-symbols-outlined { text-indent: 0; } .light-theme #light-theme-button { display: none; } .dark-theme #dark-theme-button { display: none; } /* Only show images that fit their theme using GitHub's syntax, see: https://github.blog/changelog/2021-11-24-specify-theme-context-for-images-in-markdown/ */ .dark-theme img[src$="#gh-light-mode-only"] { display: none; } .light-theme img[src$="#gh-dark-mode-only"] { display: none; } /* for layout */ html, body { margin: 0; padding: 0; height: 100%; width: 100%; overflow: hidden; box-sizing: border-box; } *, *:before, *:after { box-sizing: inherit; } body { display: flex; flex-direction: column; -webkit-overflow-scrolling: touch; } header { flex: 0 0 50px; display: flex; flex-direction: row; align-items: center; padding-left: 30px; padding-right: 30px; background-color: var(--main-header-color); } header ol { list-style: none; margin: 0; padding: 0; } header ol li { display: inline; } header form { display: flex; flex: 1; justify-content: flex-end; } header#header-search-sidebar { height: 50px; margin-bottom: 25px; } footer { flex: 0 0 16px; text-align: center; padding: 16px 20px; } main { flex: 1; display: flex; flex-direction: row; min-height: 0; } .sidebar-offcanvas-left { flex: 0 1 230px; order: 1; overflow-y: scroll; padding: 20px 0 15px 30px; margin: 5px 20px 0 0; } ::-webkit-scrollbar-button{ display: none; height: 13px; border-radius: 0; background-color: #AAA; } ::-webkit-scrollbar-button:hover{ background-color: #AAA; } ::-webkit-scrollbar-thumb{ background-color: var(--main-scrollbar-color); } ::-webkit-scrollbar-thumb:hover{ background-color: var(--main-scrollbar-color); } ::-webkit-scrollbar{ width: 4px; } .main-content::-webkit-scrollbar{ width: 8px; } .main-content { flex: 1; order: 2; overflow-y: scroll; padding: 10px 20px 0 20px; } .sidebar-offcanvas-right { flex: 0 1 12em; order: 3; overflow-y: scroll; padding: 20px 15px 15px 15px; margin-top: 5px; margin-right: 20px; } /* end for layout */ body { -webkit-text-size-adjust: 100%; overflow-x: hidden; font-family: Roboto, sans-serif; font-size: 16px; line-height: 1.42857143; color: var(--main-text-color); background-color: var(--main-bg-color); } nav.navbar { background-color: inherit; min-height: 50px; border: 0; } @media (max-width: 840px) { .hidden-xs { display: none !important; } } @media (min-width: 841px) { .hidden-l { display: none !important; } } nav.navbar .row { padding-top: 8px; } nav .container { white-space: nowrap; } header { background-color: var(--main-header-color); box-shadow: 0 3px 5px rgba(0,0,0,0.1); } .pre { border: 1px solid #ddd; font-size: 14px; } .hljs-string, .hljs-doctag { color: var(--main-string-color); } .hljs-number, .hljs-literal, .hljs-variable, .hljs-template-variable, .hljs-tag .hljs-attr { color: var(--main-var-color); } .hljs-comment, .hljs-quote { color: var(--main-comment-color); font-style: italic; } .hljs-title, .hljs-section, .hljs-selector-id { color: var(--main-section-color); font-weight: bold; } .hljs-tag, .hljs-name, .hljs-attribute { color: var(--main-tag-color); font-weight: normal; } .hljs-keyword, .hljs-selector-tag, .hljs-subst { color: var(--main-keyword-color); font-weight: bold; } .hljs { display: block; overflow-x: auto; padding: 0.5em; color: var(--main-text-color); background: var(--main-code-bg); } a { text-decoration: none; } section { margin-bottom: 36px; } dl { margin: 0; } h1, h2, h3, h4, h5, h6 { font-family: Roboto, sans-serif; font-weight: 400; margin-top: 1.5em; color: var(--main-text-color); } h1.title { overflow: hidden; text-overflow: ellipsis; } h1 { font-size: 37px; margin-top: 0; margin-bottom: 0.67em; } h2 { font-size: 28px; } h5 { font-size: 16px; } p { margin-bottom: 1em; margin-top: 0; } a { color: var(--main-hyperlinks-color); } a:hover { color: #13B9FD; } pre.prettyprint { font-family: 'Roboto Mono', Menlo, monospace; color: black; border-radius: 0; font-size: 15px; word-wrap: normal; line-height: 1.4; border: 0; margin: 16px 0 16px 0; padding: 8px; } pre code { white-space: pre; word-wrap: initial; font-size: 100% } .fixed { white-space: pre; } pre { border: 1px solid #ddd; background-color: #eee; font-size: 14px; } code { font-family: 'Roboto Mono', Menlo, monospace; color: inherit; padding: 0.2em 0.4em; font-size: 85%; background-color: rgba(27,31,35,0.05); border-radius: 3px; } @media(max-width: 840px) { nav .container { width: 100% } h1 { font-size: 24px; } pre { margin: 16px 0; } } header h1 { font-weight: 400; margin-bottom: 16px; } header a, header p, header li { color: #0175C2; } header a:hover { color: #0175C2; } header h1 .kind { color: #555; } dt { font-weight: normal; } dd { color: var(--main-text-color); margin-bottom: 1em; margin-left: 0; } dd.callable, dd.constant, dd.property { margin-bottom: 24px; } dd p { overflow-x: hidden; text-overflow: ellipsis; margin-bottom: 0; } /* Enum values do not have their own pages; their full docs are presented on the * enum class's page. */ dt.constant + dd p { margin-bottom: 1em; } /* indents wrapped lines */ section.summary dt { margin-left: 24px; text-indent: -24px; } .dl-horizontal dd { margin-left: initial; } dl.dl-horizontal dt { font-style: normal; text-align: left; color: #727272; margin-right: 20px; width: initial; } dt .name { font-weight: 500; } dl dt.callable .name { float: none; width: auto; } .type-parameter { white-space: nowrap; } .multi-line-signature .type-parameter .parameter { margin-left: 0; display: unset; } .parameter-list { display: table-cell; margin-left: 10px; list-style-type: none; padding-inline-start: unset; } .parameter-list.single-line { display: inline; margin-left: 0; } .parameter-list.single-line > li { display: inline; } .parameter-list.single-line > li > .parameter { display: inline; margin-left: 0; text-indent: 0; } .signature { color: var(--main-text-color); } .signature a { color: var(--main-hyperlinks-color); } .optional { font-style: italic; } .undocumented { font-style: italic; } .is-const { font-style: italic; } .deprecated { text-decoration: line-through; } .category.linked { font-weight: bold; opacity: 1; } /* Colors for category based on categoryOrder in dartdoc_options.config. */ .category.cp-0 { background-color: #54b7c4 } .category.cp-1 { background-color: #54c47f } .category.cp-2 { background-color: #c4c254 } .category.cp-3 { background-color: #c49f54 } .category.cp-4 { background-color: #c45465 } .category.cp-5 { background-color: #c454c4 } .category a { color: white; } .category { padding: 2px 4px; font-size: 12px; border-radius: 4px; background-color: #999; text-transform: uppercase; color: white; opacity: .5; } h1 .category { vertical-align: middle; } /* The badge under a declaration for things like "const", "read-only", etc. and for the badges inline like sealed or interface */ /* See https://github.com/dart-lang/dartdoc/blob/main/lib/src/model/feature.dart */ .feature { display: inline-block; background: var(--main-bg-color); border: 1px solid var(--main-hyperlinks-color); border-radius: 20px; color: var(--main-hyperlinks-color); font-size: 12px; padding: 1px 6px; margin: 0 8px 0 0; } a.feature:hover { border-color: #13B9FD; } h1 .feature { vertical-align: middle; margin: 0 -2px 0 0; } .source-link { padding: 18px 4px; font-size: 18px; vertical-align: middle; } @media (max-width: 840px) { .source-link { padding: 7px 2px; font-size: 10px; } } #external-links { float: right; } .btn-group { position: relative; display: inline-flex; vertical-align: middle; } footer { color: #fff; background-color: var(--main-footer-background); width: 100%; } footer p { margin: 0; } footer .no-break { white-space: nowrap; } footer .container { padding-left: 0; padding-right: 0; } footer a, footer a:hover { color: #fff; } .markdown.desc { max-width: 700px; } .markdown h1 { font-size: 24px; margin-bottom: 8px; } .markdown h2 { font-size: 20px; margin-top: 24px; margin-bottom: 8px; } .markdown h3 { font-size: 18px; margin-bottom: 8px; color: var(--main-text-color); } .markdown h4 { font-size: 16px; margin-bottom: 0; } .markdown li p { margin: 0; } table { margin-bottom: 1em; } table, th, td { border: 1px solid lightgrey; border-collapse: collapse; } th, td { padding: 8px; } .gt-separated { list-style: none; padding: 0; margin: 0; } .gt-separated li { display: inline-block; } .gt-separated li:before { background-image: url("data:image/svg+xml;utf8,"); background-position: center; content: "\00a0"; margin: 0 6px 0 4px; padding: 0 3px 0 0; } .gt-separated.dark li:before { background-image: url("data:image/svg+xml;utf8,"); } .gt-separated li:first-child:before { background-image: none; content: ""; margin: 0; padding: 0; } .multi-line-signature { font-size: 17px; color: #727272; } .multi-line-signature .parameter { margin-left: 60px; display: block; text-indent: -36px; } .breadcrumbs { padding: 0; margin: 8px 0 8px 0; white-space: nowrap; line-height: 1; } @media screen and (min-width: 840px) { nav ol.breadcrumbs { float: left; } } @media screen and (max-width: 840px) { .breadcrumbs { margin: 0 0 24px 0; overflow-x: hidden; } } .breadcrumbs .gt-separated .dark .hidden-xs li+li:before { color: var(--main-h-text); } ol.breadcrumbs li a { color: var(--main-hyperlinks-color); } .self-crumb { color: var(--main-h-text); } .self-name { color: #555; display: none; } .annotation-list { list-style: none; padding: 0; display: inline; } .comma-separated { list-style: none; padding: 0; display: inline; } .comma-separated li { display: inline; } .comma-separated li:after { content: ", "; } .comma-separated li:last-child:after { content: ""; } .end-with-period li:last-child:after { content: "."; } .container > section:first-child { border: 0; } .constructor-modifier { font-style: italic; } section.multi-line-signature div.parameters { margin-left: 24px; } /* sidebar styles */ .sidebar ol { list-style: none; line-height: 22px; margin-top: 0; margin-bottom: 0; padding: 0 0 15px 0; } .sidebar h5 a, .sidebar h5 a:hover { color: var(--main-sidebar-color); } .sidebar h5, .sidebar ol li { text-overflow: ellipsis; overflow: hidden; padding: 3px 0 3px 3px; } .sidebar h5 { color: var(--main-sidebar-color); font-size: 18px; margin: 0 0 22px 0; padding-top: 0; } .sidebar ol li.section-title { font-size: 18px; font-weight: normal; text-transform: uppercase; padding-top: 25px; } .sidebar ol li.section-subtitle a { color: inherit; } .sidebar ol li.section-subtitle { font-weight: 400; text-transform: uppercase; } .sidebar ol li.section-subitem { margin-left: 12px; } .sidebar ol li:first-child { padding-top: 3px; margin-top: 0; } button { padding: 0; } #sidenav-left-toggle { display: none; vertical-align: text-bottom; padding: 0; color: var(--main-icon-color); user-select: none; cursor: pointer; } #sidenav-left-toggle:hover { color: var(--main-hyperlinks-color); } /* left-nav disappears, and can transition in from the left */ @media screen and (max-width:840px) { #sidenav-left-toggle { display: inline; width: 24px; height: 24px; border: none; margin-right: 24px; margin-left: 24px; font-size: 24px; } #overlay-under-drawer.active { opacity: 0.4; height: 100%; z-index: 1999; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: black; display: block; } .sidebar-offcanvas-left { left: -100%; position: fixed; -webkit-transition:all .25s ease-out; -o-transition:all .25s ease-out; transition:all .25s ease-out; z-index: 2000; top: 0; width: 280px; /* works all the way down to an iphone 4 */ height: 90%; background-color: var(--main-bg-color); overflow-y: scroll; /* TODO: how to hide scroll bars? */ padding: 10px; margin: 10px 10px; box-shadow: 5px 5px 5px 5px #444444; } ol#sidebar-nav { font-size: 18px; white-space: pre-line; } .sidebar-offcanvas-left.active { left: 0; /* this animates our drawer into the page */ } .self-name { display: inline-block; color: var(--main-hyperlinks-color); } } .sidebar-offcanvas-left h5 { margin-bottom: 10px; } .sidebar-offcanvas-left h5:last-of-type { border: 0; margin-bottom: 25px; } /* the right nav disappears out of view when the window shrinks */ @media screen and (max-width: 992px) { .sidebar-offcanvas-right { display: none; } } #overlay-under-drawer { display: none; } /* find-as-you-type search box */ .form-control { border-radius: 0; border: 0; } @media screen and (max-width: 840px) { form.search { display: none; } } .typeahead { width: 200px; padding: 2px 7px 1px 7px; line-height: 20px; outline: none; } .tt-wrapper { position: relative; display: inline-block; } .tt-input { position: relative; vertical-align: top; } .navbar-right .tt-menu { right: 0; left: inherit !important; width: 540px; max-height: 280px; overflow-y: scroll; } .navbar-right { padding-right: 60px; } .tt-menu { position: absolute; top: 100%; left: 0; z-index: 100; font-size: 14px; margin: 0; background-color: var(--main-bg-color); border: 1px solid var(--main-header-color); -webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); -moz-box-shadow: 0 5px 10px rgba(0,0,0,.2); box-shadow: 0 5px 10px rgba(0,0,0,.2); } .typeahead { padding: 17px 17px 17px 50px; width: 422px; height: 20px; font-size: 13px; background-image: url("./search.svg"); background-repeat: no-repeat; background-position: 4%; outline: 0; background-size: 20px; filter: var(--main-number-filter); -webkit-filter: var(--main-number-filter); } .search-summary { margin-bottom: 10px; } a.tt-container { font-size: 16px; color: var(--main-hyperlinks-color); } .enter-search-message { position: -webkit-sticky; position: sticky; top: 0; background-color: #AAA; padding: 0; font-size: 14px; margin: 0; clear: both; text-align: center; color: black; } .tt-suggestion:hover { cursor: pointer; color: #fff; background-color: #0097cf; } .tt-suggestion:hover .search-from-lib { color: #ddd; } .tt-suggestion.tt-cursor { color: #fff; background-color: #0097cf; } .tt-suggestion.tt-cursor .search-from-lib { color: #ddd; } .tt-suggestion p { margin: 0; } .tt-container { font-size: 14px; margin-bottom: 0; margin-top: 15px; } .tt-container-text { color: var(--main-text-color); } /* Search results formatting for mini results below search bar. */ .tt-search-results .tt-container { margin-top: 5px; margin-bottom: 5px; } /* Do not show the container as a section. */ .tt-search-results .tt-container-text { display: none } /* An inline style. */ .tt-search-results .tt-suggestion { color: var(--main-text-color); margin-top: 5px; overflow: hidden; padding-left: 10px; padding-right: 10px; text-overflow: ellipsis; white-space: nowrap; } .tt-search-results .tt-suggestion-title { font-size: 14px; padding-right: 5px; } .tt-search-results .tt-suggestion-container { color: var(--main-keyword-color); font-size: 14px; font-style: italic; padding-right: 5px; } .tt-search-results .one-line-description { color: var(--main-keyword-color); display: inline; margin-left: 0; } .tt-search-results .one-line-description::before { content: open-quote; } .tt-search-results .one-line-description::after { content: close-quote; } /* Search results formatting for `search.html`. */ /* A block style. */ #dartdoc-main-content .tt-suggestion { color: var(--main-text-color); margin-top: 5px; margin-bottom: 10px; border-style: solid; border-color: lightgrey; border-width: 0.5px; } #dartdoc-main-content .tt-suggestion-title { display: block; font-weight: 500; margin: 4px 10px 0; } #dartdoc-main-content .one-line-description { display: block; margin: 2px 10px 3px; } /* Do not show a result's container. */ #dartdoc-main-content .tt-suggestion-container { display: none; } @media screen and (max-width: 840px) { .typeahead { padding: 17px 17px 17px 33px; width: 240px; height: 17px; border: 1px solid #f5f5f5; background-position: 3%; margin: 10px 10px 10px 9px; } header { padding-left: 0; } } @media screen and (max-width: 320px) { #sidenav-left-toggle { margin-right: 10px; margin-left: 20px; } .self-name { margin-right: 10px; } } ::placeholder { filter: brightness(0.85); } .search-body { border: 1px solid #7f7f7f; max-width: 400px; box-shadow: 3px 3px 5px rgba(0,0,0,0.1); } section#setter { border-top: 1px solid #ddd; padding-top: 36px; } li.inherited a { opacity: 0.65; font-style: italic; } #instance-methods dt.inherited .name, #instance-properties dt.inherited .name, #operators dt.inherited .name { font-weight: 400; font-style: italic; } #instance-methods dt.inherited .signature, #instance-properties dt.inherited .signature, #operators dt.inherited .signature { font-weight: 400; } @media print { .subnav, .sidebar { display: none; } a[href]:after { content: "" !important; } } /* github alert styles */ .markdown-alert { margin-top: 1rem; margin-bottom: 1rem; padding: 1.25rem; } .markdown-alert>:last-child { margin-bottom: 0; } .markdown-alert-title { display: flex; align-items: center; gap: 0.4rem; margin-bottom: 0.5rem; font-weight: bold; -webkit-font-smoothing: antialiased; } .markdown-alert-title:before { font: 24px / 1 'Material Symbols Outlined'; } /* note, tip, important, warning, caution */ .markdown-alert.markdown-alert-note { background-color: var(--alert-info); } .markdown-alert-note .markdown-alert-title:before { content: 'info'; } .markdown-alert.markdown-alert-tip { background-color: var(--alert-tip); } .markdown-alert-tip .markdown-alert-title:before { content: 'lightbulb'; } .markdown-alert.markdown-alert-important { background-color: var(--alert-important); } .markdown-alert-important .markdown-alert-title:before { content: 'feedback'; } .markdown-alert.markdown-alert-warning { background-color: var(--alert-warning); } .markdown-alert-warning .markdown-alert-title:before { content: 'warning'; } .markdown-alert.markdown-alert-caution { background-color: var(--alert-error); } .markdown-alert-caution .markdown-alert-title:before { content: 'report'; } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/example/main.dart ================================================ import 'package:logger/logger.dart'; void main() { const logger = Logger( nivel: Nivel.info, printer: Printer(inicio: 'Customizado: {', fim: '}'), ); logger.error('Este é um erro'); logger.warning('Este é um warning'); logger.info('Esta é uma info'); } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/lib/logger.dart ================================================ export 'src/log.dart'; export 'src/printer.dart'; ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/log.dart ================================================ import 'printer.dart'; /// Enum com as cores utilizadas para personalizar a fonte de log no terminal. enum Cores { verde('\x1b[32m'), vermelho('\x1b[31m'), azul('\x1b[36m'); const Cores(this.ansi); final String ansi; } /// Código ANSI utilizado para resetar a cor da fonte no terminal. const resetarCor = '\x1b[m'; /// Controla o [Nivel] permitido do log para ser impresso, quanto mais crítico /// mais restrito é, e menos níveis são impressos. /// Abaixo as opções ordenadas pelo menos crítico: /// /// * [Nivel.info] signica que serão impressos todos os níveis. /// * [Nivel.warning] são impressos os logs de [Nivel.warning] e [Nivel.error] /// * [Nivel.error] é o nível mais restrito, e apenas [Nivel.error] são impressos. enum Nivel { info, warning, error } /// Controla a impressão de logs, feitas através do [printer]. /// Imprime logs de acordo com o [nivel] informado. class Logger { const Logger({ this.printer = const Printer(), required this.nivel, }); /// Impressora responsável por imprimir o log de acordo com a plataforma. final Printer printer; /// Permite definir o [nivel] dos logs impressos. final Nivel nivel; /// Imprime logs de [Nivel.info] com a cor [Cores.verde]. void info(Object object) { if (_habilitado(Nivel.info)) printer.log(Cores.verde, '[INFO] $object'); } /// Imprime logs de [Nivel.warning] com a cor [Cores.azul]. void warning(Object object) { if (_habilitado(Nivel.warning)) { printer.log(Cores.azul, '[WARNING] $object'); } } /// Imprime logs de [Nivel.error] com a cor [Cores.vermelho]. void error(Object object) { if (_habilitado(Nivel.error)) { printer.log(Cores.vermelho, '[ERROR] $object'); } } /// Define se um determinado [Nivel] está habilitado para impressão. bool _habilitado(Nivel nivelHabilitado) => nivelHabilitado.index >= nivel.index; } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/printer.dart ================================================ import 'log.dart'; import 'printer_console.dart' if (dart.library.io) 'printer_io.dart' as printer; /// Uma impressora de logs utilizada por [Logger] que funciona em todas /// as plataformas. class Printer { const Printer({this.inicio = '', this.fim = ''}); /// Utilizado para personalizar o início de cada linha impressa no log. /// Por padrão não contém um valor. final String inicio; /// Utilizado para personalizar o término de cada linha impressa no log. /// Por padrão não contém um valor. final String fim; /// Imprime o [object] de log de acordo com a plataforma utilizada. /// É possível personalizar a [cor] do texto impresso. void log(Cores cor, Object object) { printer.log( '${cor.ansi}' '$inicio$object$fim' '$resetarCor', ); } } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/printer_console.dart ================================================ /// Imprime o [object] no console, para a plataforma web. void log(Object object) { print('[Console] $object'); } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/lib/src/printer_io.dart ================================================ import 'dart:io'; /// Imprime o [object] no terminal da plataforma. void log(Object object) { stdout.writeln('[IO] $object'); } ================================================ FILE: code/pt_Br/na_pratica/07_logger_package/pubspec.yaml ================================================ name: logger description: Um package para facilitar a criação de logs nas aplicações. version: 1.0.0 environment: sdk: ^3.5.1 dev_dependencies: lints: ^1.0.0 test: ^1.16.0 ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/bin/climatempo.dart ================================================ import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; try { if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); print(tempo); } } catch (e) { print(e); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta')) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; @override String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/na_pratica/11_climatempo/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_client/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_client/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_client/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_client/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_client/bin/climatempo_client.dart ================================================ import 'dart:convert'; import 'dart:io'; void main(List args) async { var aviso = args.isNotEmpty ? args.first : '-'; final jsonMap = {'aviso': aviso}; HttpClientRequest request = await HttpClient().post(InternetAddress.loopbackIPv4.host, 8080, '') ..headers.contentType = ContentType.json ..write(jsonEncode(jsonMap)); HttpClientResponse response = await request.close(); response.transform(utf8.decoder).forEach(print); } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_client/pubspec.yaml ================================================ name: climatempo_client description: Aplicação CLI client do ClimaTempo. version: 1.0.0 environment: sdk: ^3.5.1 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/bin/climatempo.dart ================================================ import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; try { if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } catch (e) { print(e); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta')) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo')) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/na_pratica/13_climatempo_server/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/bin/climatempo.dart ================================================ import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/log.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; try { if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); if (comando['salvar']) await salvarCidades(cidades); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); if (comando['salvar']) await salvarTempo(tempo); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } catch (e) { print(e); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/log.dart ================================================ import 'dart:io'; import 'package:climatempo/model/clima_tempo.dart'; import 'model/cidade.dart'; Future _validarDiretorio() async { final dir = Directory('log'); if (!(await dir.exists())) { await dir.create(); } } Future salvarCidades(List cidades) async { await _validarDiretorio(); final file = File('log/cidades.txt'); final sink = file.openWrite(mode: FileMode.write); cidades.forEach((c) => sink.writeln(c)); await sink.flush(); await sink.close(); } Future salvarTempo(ClimaTempo climaTempo) async { await _validarDiretorio(); final file = File('log/${climaTempo.cidade.id}.txt'); await file.writeAsString('===\n$climaTempo', mode: FileMode.append); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/log/4915.txt ================================================ === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2024-12-21 17:20:45.000 Temperatura: 26 - Sensação: 27 Umidade: 74 - Velocidade do Vento: 24 ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/log/cidades.txt ================================================ Id: 5049 - Nome: Abdon Batista - Estado: SC, País: BR Id: 5050 - Nome: Abelardo Luz - Estado: SC, País: BR Id: 5051 - Nome: Agrolândia - Estado: SC, País: BR Id: 5052 - Nome: Agronômica - Estado: SC, País: BR Id: 5053 - Nome: Água Doce - Estado: SC, País: BR Id: 5054 - Nome: Águas Brancas - Estado: SC, País: BR Id: 5055 - Nome: Águas de Chapecó - Estado: SC, País: BR Id: 5056 - Nome: Águas Frias - Estado: SC, País: BR Id: 5057 - Nome: Águas Mornas - Estado: SC, País: BR Id: 5058 - Nome: Alfredo Wagner - Estado: SC, País: BR Id: 5059 - Nome: Alto Bela Vista - Estado: SC, País: BR Id: 5060 - Nome: Anchieta - Estado: SC, País: BR Id: 5061 - Nome: Angelina - Estado: SC, País: BR Id: 5062 - Nome: Anita Garibaldi - Estado: SC, País: BR Id: 5063 - Nome: Anitápolis - Estado: SC, País: BR Id: 5064 - Nome: Anta Gorda - Estado: SC, País: BR Id: 5065 - Nome: Antônio Carlos - Estado: SC, País: BR Id: 5066 - Nome: Apiúna - Estado: SC, País: BR Id: 5067 - Nome: Arabutã - Estado: SC, País: BR Id: 5068 - Nome: Araquari - Estado: SC, País: BR Id: 5069 - Nome: Araranguá - Estado: SC, País: BR Id: 5070 - Nome: Armazém - Estado: SC, País: BR Id: 5071 - Nome: Arroio Trinta - Estado: SC, País: BR Id: 5072 - Nome: Arvoredo - Estado: SC, País: BR Id: 5073 - Nome: Ascurra - Estado: SC, País: BR Id: 5074 - Nome: Atalanta - Estado: SC, País: BR Id: 5075 - Nome: Aurora - Estado: SC, País: BR Id: 5076 - Nome: Balneário Arroio do Silva - Estado: SC, País: BR Id: 5077 - Nome: Balneário Barra do Sul - Estado: SC, País: BR Id: 5078 - Nome: Balneário Camboriú - Estado: SC, País: BR Id: 5080 - Nome: Balneário Gaivota - Estado: SC, País: BR Id: 4769 - Nome: Balneário Piçarras - Estado: SC, País: BR Id: 5081 - Nome: Bandeirante - Estado: SC, País: BR Id: 5082 - Nome: Barra Bonita - Estado: SC, País: BR Id: 5083 - Nome: Barra do Ibiraquera - Estado: SC, País: BR Id: 5084 - Nome: Barra do Saí - Estado: SC, País: BR Id: 5085 - Nome: Barra Velha - Estado: SC, País: BR Id: 5086 - Nome: Bela Vista do Toldo - Estado: SC, País: BR Id: 5087 - Nome: Belmonte - Estado: SC, País: BR Id: 5088 - Nome: Benedito Novo - Estado: SC, País: BR Id: 5089 - Nome: Biguaçu - Estado: SC, País: BR Id: 5090 - Nome: Blumenau - Estado: SC, País: BR Id: 5091 - Nome: Bocaina do Sul - Estado: SC, País: BR Id: 5092 - Nome: Bombinhas - Estado: SC, País: BR Id: 5093 - Nome: Bom Jardim da Serra - Estado: SC, País: BR Id: 5095 - Nome: Bom Jesus - Estado: SC, País: BR Id: 5094 - Nome: Bom Jesus do Oeste - Estado: SC, País: BR Id: 5096 - Nome: Bom Retiro - Estado: SC, País: BR Id: 5097 - Nome: Bom Sucesso - Estado: SC, País: BR Id: 5098 - Nome: Botuverá - Estado: SC, País: BR Id: 5099 - Nome: Braço do Norte - Estado: SC, País: BR Id: 5100 - Nome: Braço do Trombudo - Estado: SC, País: BR Id: 5101 - Nome: Brunópolis - Estado: SC, País: BR Id: 5102 - Nome: Brusque - Estado: SC, País: BR Id: 5103 - Nome: Caçador - Estado: SC, País: BR Id: 5104 - Nome: Caibi - Estado: SC, País: BR Id: 5105 - Nome: Calmon - Estado: SC, País: BR Id: 5106 - Nome: Camboriú - Estado: SC, País: BR Id: 5107 - Nome: Campina da Alegria - Estado: SC, País: BR Id: 5108 - Nome: Campo Alegre - Estado: SC, País: BR Id: 5109 - Nome: Campo Belo do Sul - Estado: SC, País: BR Id: 5110 - Nome: Campo Erê - Estado: SC, País: BR Id: 5111 - Nome: Campos Novos - Estado: SC, País: BR Id: 5112 - Nome: Canelinha - Estado: SC, País: BR Id: 5113 - Nome: Canoinhas - Estado: SC, País: BR Id: 5114 - Nome: Capão Alto - Estado: SC, País: BR Id: 5115 - Nome: Capinzal - Estado: SC, País: BR Id: 5116 - Nome: Capivari de Baixo - Estado: SC, País: BR Id: 5117 - Nome: Catanduvas - Estado: SC, País: BR Id: 5118 - Nome: Caxambu do Sul - Estado: SC, País: BR Id: 5119 - Nome: Celso Ramos - Estado: SC, País: BR Id: 4888 - Nome: Cerro Negro - Estado: SC, País: BR Id: 4889 - Nome: Chapadão do Lageado - Estado: SC, País: BR Id: 4890 - Nome: Chapecó - Estado: SC, País: BR Id: 4891 - Nome: Cocal do Sul - Estado: SC, País: BR Id: 4892 - Nome: Concórdia - Estado: SC, País: BR Id: 4893 - Nome: Cordilheira Alta - Estado: SC, País: BR Id: 4894 - Nome: Coronel Freitas - Estado: SC, País: BR Id: 4895 - Nome: Coronel Martins - Estado: SC, País: BR Id: 4896 - Nome: Correia Pinto - Estado: SC, País: BR Id: 4897 - Nome: Corupá - Estado: SC, País: BR Id: 4898 - Nome: Criciúma - Estado: SC, País: BR Id: 4899 - Nome: Cunha Porã - Estado: SC, País: BR Id: 4900 - Nome: Cunhataí - Estado: SC, País: BR Id: 4901 - Nome: Curitibanos - Estado: SC, País: BR Id: 4902 - Nome: Descanso - Estado: SC, País: BR Id: 4903 - Nome: Dionísio Cerqueira - Estado: SC, País: BR Id: 4904 - Nome: Dona Emma - Estado: SC, País: BR Id: 4905 - Nome: Doutor Pedrinho - Estado: SC, País: BR Id: 4906 - Nome: Enseada de Brito - Estado: SC, País: BR Id: 4907 - Nome: Entre Rios - Estado: SC, País: BR Id: 4909 - Nome: Ermo - Estado: SC, País: BR Id: 4912 - Nome: Erval Velho - Estado: SC, País: BR Id: 4913 - Nome: Faxinal dos Guedes - Estado: SC, País: BR Id: 4914 - Nome: Flor do Sertão - Estado: SC, País: BR Id: 4915 - Nome: Florianópolis - Estado: SC, País: BR Id: 4916 - Nome: Formosa do Sul - Estado: SC, País: BR Id: 4918 - Nome: Forquilhinha - Estado: SC, País: BR Id: 4919 - Nome: Fraiburgo - Estado: SC, País: BR Id: 4920 - Nome: Frei Rogério - Estado: SC, País: BR Id: 4921 - Nome: Galvão - Estado: SC, País: BR Id: 4922 - Nome: Garopaba - Estado: SC, País: BR Id: 4923 - Nome: Garuva - Estado: SC, País: BR Id: 4924 - Nome: Gaspar - Estado: SC, País: BR Id: 4925 - Nome: Governador Celso Ramos - Estado: SC, País: BR Id: 4927 - Nome: Grão Pará - Estado: SC, País: BR Id: 4928 - Nome: Gravatal - Estado: SC, País: BR Id: 4929 - Nome: Guabiruba - Estado: SC, País: BR Id: 4930 - Nome: Guaraciaba - Estado: SC, País: BR Id: 4931 - Nome: Guaramirim - Estado: SC, País: BR Id: 4932 - Nome: Guarda do Embaú - Estado: SC, País: BR Id: 4933 - Nome: Guarujá do Sul - Estado: SC, País: BR Id: 4935 - Nome: Guatá - Estado: SC, País: BR Id: 4934 - Nome: Guatambú - Estado: SC, País: BR Id: 4936 - Nome: Herval d'Oeste - Estado: SC, País: BR Id: 4937 - Nome: Ibiam - Estado: SC, País: BR Id: 4938 - Nome: Ibicaré - Estado: SC, País: BR Id: 4939 - Nome: Ibirama - Estado: SC, País: BR Id: 4940 - Nome: Içara - Estado: SC, País: BR Id: 4941 - Nome: Ilhota - Estado: SC, País: BR Id: 4942 - Nome: Imaruí - Estado: SC, País: BR Id: 4943 - Nome: Imbituba - Estado: SC, País: BR Id: 4944 - Nome: Imbuia - Estado: SC, País: BR Id: 4945 - Nome: Indaial - Estado: SC, País: BR Id: 4946 - Nome: Iomerê - Estado: SC, País: BR Id: 4947 - Nome: Ipira - Estado: SC, País: BR Id: 4948 - Nome: Ipoméia - Estado: SC, País: BR Id: 4949 - Nome: Iporã do Oeste - Estado: SC, País: BR Id: 4950 - Nome: Ipuaçu - Estado: SC, País: BR Id: 4951 - Nome: Ipumirim - Estado: SC, País: BR Id: 4952 - Nome: Iraceminha - Estado: SC, País: BR Id: 4953 - Nome: Irani - Estado: SC, País: BR Id: 4954 - Nome: Irati - Estado: SC, País: BR Id: 4955 - Nome: Irineópolis - Estado: SC, País: BR Id: 4962 - Nome: Itá - Estado: SC, País: BR Id: 4956 - Nome: Itaiópolis - Estado: SC, País: BR Id: 4957 - Nome: Itajaí - Estado: SC, País: BR Id: 4958 - Nome: Itapema - Estado: SC, País: BR Id: 4959 - Nome: Itapiranga - Estado: SC, País: BR Id: 4960 - Nome: Itapoá - Estado: SC, País: BR Id: 4961 - Nome: Itapocu - Estado: SC, País: BR Id: 4963 - Nome: Ituporanga - Estado: SC, País: BR Id: 4964 - Nome: Jaborá - Estado: SC, País: BR Id: 4965 - Nome: Jacinto Machado - Estado: SC, País: BR Id: 4966 - Nome: Jaguaruna - Estado: SC, País: BR Id: 4967 - Nome: Jaraguá do Sul - Estado: SC, País: BR Id: 4968 - Nome: Jardinópolis - Estado: SC, País: BR Id: 4969 - Nome: Joaçaba - Estado: SC, País: BR Id: 4970 - Nome: Joinville - Estado: SC, País: BR Id: 4971 - Nome: José Boiteux - Estado: SC, País: BR Id: 4972 - Nome: Jupiá - Estado: SC, País: BR Id: 4974 - Nome: Lacerdópolis - Estado: SC, País: BR Id: 4975 - Nome: Lages - Estado: SC, País: BR Id: 4976 - Nome: Laguna - Estado: SC, País: BR Id: 4977 - Nome: Lajeado Grande - Estado: SC, País: BR Id: 4978 - Nome: Laurentino - Estado: SC, País: BR Id: 4979 - Nome: Lauro Muller - Estado: SC, País: BR Id: 4980 - Nome: Lebon Régis - Estado: SC, País: BR Id: 4981 - Nome: Leoberto Leal - Estado: SC, País: BR Id: 4982 - Nome: Lindóia do Sul - Estado: SC, País: BR Id: 4983 - Nome: Lontras - Estado: SC, País: BR Id: 4984 - Nome: Luiz Alves - Estado: SC, País: BR Id: 4985 - Nome: Luzerna - Estado: SC, País: BR Id: 4986 - Nome: Macieira - Estado: SC, País: BR Id: 4987 - Nome: Mafra - Estado: SC, País: BR Id: 4988 - Nome: Major Gercino - Estado: SC, País: BR Id: 4989 - Nome: Major Vieira - Estado: SC, País: BR Id: 4990 - Nome: Maracajá - Estado: SC, País: BR Id: 4991 - Nome: Maravilha - Estado: SC, País: BR Id: 4992 - Nome: Marema - Estado: SC, País: BR Id: 4993 - Nome: Massaranduba - Estado: SC, País: BR Id: 4994 - Nome: Matos Costa - Estado: SC, País: BR Id: 4995 - Nome: Meleiro - Estado: SC, País: BR Id: 4996 - Nome: Mirim Doce - Estado: SC, País: BR Id: 4997 - Nome: Modelo - Estado: SC, País: BR Id: 4998 - Nome: Mondaí - Estado: SC, País: BR Id: 4999 - Nome: Monte Carlo - Estado: SC, País: BR Id: 5000 - Nome: Monte Castelo - Estado: SC, País: BR Id: 5001 - Nome: Morro da Fumaça - Estado: SC, País: BR Id: 5002 - Nome: Morro Grande - Estado: SC, País: BR Id: 5003 - Nome: Navegantes - Estado: SC, País: BR Id: 5004 - Nome: Nova Erechim - Estado: SC, País: BR Id: 5005 - Nome: Nova Itaberaba - Estado: SC, País: BR Id: 5006 - Nome: Nova Trento - Estado: SC, País: BR Id: 5007 - Nome: Nova Veneza - Estado: SC, País: BR Id: 4678 - Nome: Novo Horizonte - Estado: SC, País: BR Id: 4679 - Nome: Orleans - Estado: SC, País: BR Id: 4680 - Nome: Otacílio Costa - Estado: SC, País: BR Id: 4681 - Nome: Ouro - Estado: SC, País: BR Id: 4682 - Nome: Ouro Verde - Estado: SC, País: BR Id: 4683 - Nome: Paial - Estado: SC, País: BR Id: 4648 - Nome: Painel - Estado: SC, País: BR Id: 4756 - Nome: Palhoça - Estado: SC, País: BR Id: 4757 - Nome: Palma Sola - Estado: SC, País: BR Id: 4758 - Nome: Palmeira - Estado: SC, País: BR Id: 4759 - Nome: Palmitos - Estado: SC, País: BR Id: 4760 - Nome: Papanduva - Estado: SC, País: BR Id: 4761 - Nome: Paraíso - Estado: SC, País: BR Id: 4762 - Nome: Passo de Torres - Estado: SC, País: BR Id: 4763 - Nome: Passos Maia - Estado: SC, País: BR Id: 4764 - Nome: Paulo Lopes - Estado: SC, País: BR Id: 4765 - Nome: Pedras Grandes - Estado: SC, País: BR Id: 4766 - Nome: Penha - Estado: SC, País: BR Id: 4767 - Nome: Peritiba - Estado: SC, País: BR Id: 4768 - Nome: Petrolândia - Estado: SC, País: BR Id: 4770 - Nome: Pinhalzinho - Estado: SC, País: BR Id: 4771 - Nome: Pinheiro Preto - Estado: SC, País: BR Id: 4772 - Nome: Piratuba - Estado: SC, País: BR Id: 4773 - Nome: Planalto Alegre - Estado: SC, País: BR Id: 4774 - Nome: Pomerode - Estado: SC, País: BR Id: 4776 - Nome: Ponte Alta - Estado: SC, País: BR Id: 4775 - Nome: Ponte Alta do Norte - Estado: SC, País: BR Id: 4777 - Nome: Ponte Serrada - Estado: SC, País: BR Id: 4778 - Nome: Porto Belo - Estado: SC, País: BR Id: 4779 - Nome: Porto União - Estado: SC, País: BR Id: 4780 - Nome: Pouso Redondo - Estado: SC, País: BR Id: 4781 - Nome: Praia do Santinho - Estado: SC, País: BR Id: 4782 - Nome: Praia Grande - Estado: SC, País: BR Id: 4783 - Nome: Presidente Castelo Branco - Estado: SC, País: BR Id: 4784 - Nome: Presidente Getúlio - Estado: SC, País: BR Id: 4785 - Nome: Presidente Nereu - Estado: SC, País: BR Id: 4811 - Nome: Princesa - Estado: SC, País: BR Id: 4812 - Nome: Quilombo - Estado: SC, País: BR Id: 4813 - Nome: Rancho Queimado - Estado: SC, País: BR Id: 4814 - Nome: Rio das Antas - Estado: SC, País: BR Id: 4815 - Nome: Rio do Campo - Estado: SC, País: BR Id: 4816 - Nome: Rio d'Oeste - Estado: SC, País: BR Id: 4817 - Nome: Rio dos Cedros - Estado: SC, País: BR Id: 4818 - Nome: Rio do Sul - Estado: SC, País: BR Id: 4819 - Nome: Rio Fortuna - Estado: SC, País: BR Id: 4820 - Nome: Rio Negrinho - Estado: SC, País: BR Id: 4821 - Nome: Rio Rufino - Estado: SC, País: BR Id: 4822 - Nome: Riqueza - Estado: SC, País: BR Id: 4823 - Nome: Rodeio - Estado: SC, País: BR Id: 4824 - Nome: Romelândia - Estado: SC, País: BR Id: 4825 - Nome: Salete - Estado: SC, País: BR Id: 4826 - Nome: Saltinho - Estado: SC, País: BR Id: 4827 - Nome: Salto Veloso - Estado: SC, País: BR Id: 4828 - Nome: Sangão - Estado: SC, País: BR Id: 4829 - Nome: Santa Cecília - Estado: SC, País: BR Id: 4830 - Nome: Santa Helena - Estado: SC, País: BR Id: 4831 - Nome: Santa Rosa de Lima - Estado: SC, País: BR Id: 4832 - Nome: Santa Rosa do Sul - Estado: SC, País: BR Id: 4834 - Nome: Santa Terezinha - Estado: SC, País: BR Id: 4833 - Nome: Santa Terezinha do Progresso - Estado: SC, País: BR Id: 4835 - Nome: Santiago do Sul - Estado: SC, País: BR Id: 4836 - Nome: Santo Amaro da Imperatriz - Estado: SC, País: BR Id: 4837 - Nome: São Bento do Sul - Estado: SC, País: BR Id: 4838 - Nome: São Bernardino - Estado: SC, País: BR Id: 4839 - Nome: São Bonifácio - Estado: SC, País: BR Id: 4840 - Nome: São Carlos - Estado: SC, País: BR Id: 4841 - Nome: São Cristovão do Sul - Estado: SC, País: BR Id: 4842 - Nome: São Domingos - Estado: SC, País: BR Id: 4843 - Nome: São Francisco do Sul - Estado: SC, País: BR Id: 4844 - Nome: São João Batista - Estado: SC, País: BR Id: 4845 - Nome: São João do Itaperiú - Estado: SC, País: BR Id: 4846 - Nome: São João do Oeste - Estado: SC, País: BR Id: 4847 - Nome: São João do Sul - Estado: SC, País: BR Id: 4848 - Nome: São Joaquim - Estado: SC, País: BR Id: 4851 - Nome: São José - Estado: SC, País: BR Id: 4849 - Nome: São José do Cedro - Estado: SC, País: BR Id: 4850 - Nome: São José do Cerrito - Estado: SC, País: BR Id: 4852 - Nome: São Lourenço d'Oeste - Estado: SC, País: BR Id: 4853 - Nome: São Ludgero - Estado: SC, País: BR Id: 4854 - Nome: São Martinho - Estado: SC, País: BR Id: 4855 - Nome: São Miguel da Boa Vista - Estado: SC, País: BR Id: 4856 - Nome: São Miguel do Oeste - Estado: SC, País: BR Id: 4857 - Nome: São Pedro de Alcântara - Estado: SC, País: BR Id: 4858 - Nome: Saudades - Estado: SC, País: BR Id: 85793 - Nome: SBCH - Estado: SC, País: BR Id: 74832 - Nome: SBFL - Estado: SC, País: BR Id: 74833 - Nome: SBJV - Estado: SC, País: BR Id: 85285 - Nome: SBNF - Estado: SC, País: BR Id: 4859 - Nome: Schroeder - Estado: SC, País: BR Id: 4860 - Nome: Seara - Estado: SC, País: BR Id: 4861 - Nome: Serra Alta - Estado: SC, País: BR Id: 4862 - Nome: Siderópolis - Estado: SC, País: BR Id: 4863 - Nome: Sombrio - Estado: SC, País: BR Id: 4864 - Nome: Sul Brasil - Estado: SC, País: BR Id: 4865 - Nome: Taió - Estado: SC, País: BR Id: 4866 - Nome: Tangará - Estado: SC, País: BR Id: 4867 - Nome: Tigrinhos - Estado: SC, País: BR Id: 4868 - Nome: Tijucas - Estado: SC, País: BR Id: 4869 - Nome: Timbé do Sul - Estado: SC, País: BR Id: 4871 - Nome: Timbó - Estado: SC, País: BR Id: 4870 - Nome: Timbó Grande - Estado: SC, País: BR Id: 4872 - Nome: Três Barras - Estado: SC, País: BR Id: 4875 - Nome: Treviso - Estado: SC, País: BR Id: 4878 - Nome: Treze de Maio - Estado: SC, País: BR Id: 4879 - Nome: Treze Tílias - Estado: SC, País: BR Id: 4880 - Nome: Trombudo Central - Estado: SC, País: BR Id: 4881 - Nome: Tubarão - Estado: SC, País: BR Id: 4882 - Nome: Tunápolis - Estado: SC, País: BR Id: 4883 - Nome: Turvo - Estado: SC, País: BR Id: 4884 - Nome: União do Oeste - Estado: SC, País: BR Id: 4885 - Nome: Urubici - Estado: SC, País: BR Id: 4886 - Nome: Urupema - Estado: SC, País: BR Id: 4887 - Nome: Urussanga - Estado: SC, País: BR Id: 4482 - Nome: Vargeão - Estado: SC, País: BR Id: 4484 - Nome: Vargem - Estado: SC, País: BR Id: 4483 - Nome: Vargem Bonita - Estado: SC, País: BR Id: 4485 - Nome: Vidal Ramos - Estado: SC, País: BR Id: 4486 - Nome: Videira - Estado: SC, País: BR Id: 4487 - Nome: Vitor Meireles - Estado: SC, País: BR Id: 4488 - Nome: Witmarsum - Estado: SC, País: BR Id: 4489 - Nome: Xanxerê - Estado: SC, País: BR Id: 4490 - Nome: Xavantina - Estado: SC, País: BR Id: 4491 - Nome: Xaxim - Estado: SC, País: BR Id: 4492 - Nome: Zortéa - Estado: SC, País: BR ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/bin/climatempo.dart ================================================ import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/log.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; try { if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); if (comando['salvar']) await salvarCidadesIsolate(cidades); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); if (comando['salvar']) await salvarTempoIsolate(tempo); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } catch (e) { print(e); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/log.dart ================================================ import 'dart:io'; import 'dart:isolate'; import 'package:climatempo/model/clima_tempo.dart'; import 'model/cidade.dart'; Future _validarDiretorio() async { final dir = Directory('log'); if (!(await dir.exists())) { await dir.create(); } } Future salvarTempoIsolate(ClimaTempo climaTempo) async { final isolate = await Isolate.spawn(salvarTempo, climaTempo); _registrarCallbackFinalizacao(isolate); } Future salvarTempo(ClimaTempo climaTempo) async { await _validarDiretorio(); final file = File('log/${climaTempo.cidade.id}.txt'); await file.writeAsString('===\n$climaTempo', mode: FileMode.append); } void _registrarCallbackFinalizacao(Isolate isolate) { final receivePort = ReceivePort(); receivePort.listen((mensagem) { print(mensagem); receivePort.close(); }); isolate.addOnExitListener(receivePort.sendPort, response: 'Arquivo salvo com sucesso!'); } Future salvarCidadesIsolate(List cidades) async { final isolate = await Isolate.spawn(salvarCidades, cidades); _registrarCallbackFinalizacao(isolate); } Future salvarCidades(List cidades) async { await _validarDiretorio(); final file = File('log/cidades.txt'); final sink = file.openWrite(mode: FileMode.write); cidades.forEach((c) => sink.writeln(c)); await sink.flush(); await sink.close(); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/log/4915.txt ================================================ === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:45:02.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2024-12-21 17:20:45.000 Temperatura: 26 - Sensação: 27 Umidade: 74 - Velocidade do Vento: 24 === Cidade: Florianópolis, SC - BR 2024-12-21 17:20:45.000 Temperatura: 26 - Sensação: 27 Umidade: 74 - Velocidade do Vento: 24 ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/log/cidades.txt ================================================ Id: 5049 - Nome: Abdon Batista - Estado: SC, País: BR Id: 5050 - Nome: Abelardo Luz - Estado: SC, País: BR Id: 5051 - Nome: Agrolândia - Estado: SC, País: BR Id: 5052 - Nome: Agronômica - Estado: SC, País: BR Id: 5053 - Nome: Água Doce - Estado: SC, País: BR Id: 5054 - Nome: Águas Brancas - Estado: SC, País: BR Id: 5055 - Nome: Águas de Chapecó - Estado: SC, País: BR Id: 5056 - Nome: Águas Frias - Estado: SC, País: BR Id: 5057 - Nome: Águas Mornas - Estado: SC, País: BR Id: 5058 - Nome: Alfredo Wagner - Estado: SC, País: BR Id: 5059 - Nome: Alto Bela Vista - Estado: SC, País: BR Id: 5060 - Nome: Anchieta - Estado: SC, País: BR Id: 5061 - Nome: Angelina - Estado: SC, País: BR Id: 5062 - Nome: Anita Garibaldi - Estado: SC, País: BR Id: 5063 - Nome: Anitápolis - Estado: SC, País: BR Id: 5064 - Nome: Anta Gorda - Estado: SC, País: BR Id: 5065 - Nome: Antônio Carlos - Estado: SC, País: BR Id: 5066 - Nome: Apiúna - Estado: SC, País: BR Id: 5067 - Nome: Arabutã - Estado: SC, País: BR Id: 5068 - Nome: Araquari - Estado: SC, País: BR Id: 5069 - Nome: Araranguá - Estado: SC, País: BR Id: 5070 - Nome: Armazém - Estado: SC, País: BR Id: 5071 - Nome: Arroio Trinta - Estado: SC, País: BR Id: 5072 - Nome: Arvoredo - Estado: SC, País: BR Id: 5073 - Nome: Ascurra - Estado: SC, País: BR Id: 5074 - Nome: Atalanta - Estado: SC, País: BR Id: 5075 - Nome: Aurora - Estado: SC, País: BR Id: 5076 - Nome: Balneário Arroio do Silva - Estado: SC, País: BR Id: 5077 - Nome: Balneário Barra do Sul - Estado: SC, País: BR Id: 5078 - Nome: Balneário Camboriú - Estado: SC, País: BR Id: 5080 - Nome: Balneário Gaivota - Estado: SC, País: BR Id: 4769 - Nome: Balneário Piçarras - Estado: SC, País: BR Id: 5081 - Nome: Bandeirante - Estado: SC, País: BR Id: 5082 - Nome: Barra Bonita - Estado: SC, País: BR Id: 5083 - Nome: Barra do Ibiraquera - Estado: SC, País: BR Id: 5084 - Nome: Barra do Saí - Estado: SC, País: BR Id: 5085 - Nome: Barra Velha - Estado: SC, País: BR Id: 5086 - Nome: Bela Vista do Toldo - Estado: SC, País: BR Id: 5087 - Nome: Belmonte - Estado: SC, País: BR Id: 5088 - Nome: Benedito Novo - Estado: SC, País: BR Id: 5089 - Nome: Biguaçu - Estado: SC, País: BR Id: 5090 - Nome: Blumenau - Estado: SC, País: BR Id: 5091 - Nome: Bocaina do Sul - Estado: SC, País: BR Id: 5092 - Nome: Bombinhas - Estado: SC, País: BR Id: 5093 - Nome: Bom Jardim da Serra - Estado: SC, País: BR Id: 5095 - Nome: Bom Jesus - Estado: SC, País: BR Id: 5094 - Nome: Bom Jesus do Oeste - Estado: SC, País: BR Id: 5096 - Nome: Bom Retiro - Estado: SC, País: BR Id: 5097 - Nome: Bom Sucesso - Estado: SC, País: BR Id: 5098 - Nome: Botuverá - Estado: SC, País: BR Id: 5099 - Nome: Braço do Norte - Estado: SC, País: BR Id: 5100 - Nome: Braço do Trombudo - Estado: SC, País: BR Id: 5101 - Nome: Brunópolis - Estado: SC, País: BR Id: 5102 - Nome: Brusque - Estado: SC, País: BR Id: 5103 - Nome: Caçador - Estado: SC, País: BR Id: 5104 - Nome: Caibi - Estado: SC, País: BR Id: 5105 - Nome: Calmon - Estado: SC, País: BR Id: 5106 - Nome: Camboriú - Estado: SC, País: BR Id: 5107 - Nome: Campina da Alegria - Estado: SC, País: BR Id: 5108 - Nome: Campo Alegre - Estado: SC, País: BR Id: 5109 - Nome: Campo Belo do Sul - Estado: SC, País: BR Id: 5110 - Nome: Campo Erê - Estado: SC, País: BR Id: 5111 - Nome: Campos Novos - Estado: SC, País: BR Id: 5112 - Nome: Canelinha - Estado: SC, País: BR Id: 5113 - Nome: Canoinhas - Estado: SC, País: BR Id: 5114 - Nome: Capão Alto - Estado: SC, País: BR Id: 5115 - Nome: Capinzal - Estado: SC, País: BR Id: 5116 - Nome: Capivari de Baixo - Estado: SC, País: BR Id: 5117 - Nome: Catanduvas - Estado: SC, País: BR Id: 5118 - Nome: Caxambu do Sul - Estado: SC, País: BR Id: 5119 - Nome: Celso Ramos - Estado: SC, País: BR Id: 4888 - Nome: Cerro Negro - Estado: SC, País: BR Id: 4889 - Nome: Chapadão do Lageado - Estado: SC, País: BR Id: 4890 - Nome: Chapecó - Estado: SC, País: BR Id: 4891 - Nome: Cocal do Sul - Estado: SC, País: BR Id: 4892 - Nome: Concórdia - Estado: SC, País: BR Id: 4893 - Nome: Cordilheira Alta - Estado: SC, País: BR Id: 4894 - Nome: Coronel Freitas - Estado: SC, País: BR Id: 4895 - Nome: Coronel Martins - Estado: SC, País: BR Id: 4896 - Nome: Correia Pinto - Estado: SC, País: BR Id: 4897 - Nome: Corupá - Estado: SC, País: BR Id: 4898 - Nome: Criciúma - Estado: SC, País: BR Id: 4899 - Nome: Cunha Porã - Estado: SC, País: BR Id: 4900 - Nome: Cunhataí - Estado: SC, País: BR Id: 4901 - Nome: Curitibanos - Estado: SC, País: BR Id: 4902 - Nome: Descanso - Estado: SC, País: BR Id: 4903 - Nome: Dionísio Cerqueira - Estado: SC, País: BR Id: 4904 - Nome: Dona Emma - Estado: SC, País: BR Id: 4905 - Nome: Doutor Pedrinho - Estado: SC, País: BR Id: 4906 - Nome: Enseada de Brito - Estado: SC, País: BR Id: 4907 - Nome: Entre Rios - Estado: SC, País: BR Id: 4909 - Nome: Ermo - Estado: SC, País: BR Id: 4912 - Nome: Erval Velho - Estado: SC, País: BR Id: 4913 - Nome: Faxinal dos Guedes - Estado: SC, País: BR Id: 4914 - Nome: Flor do Sertão - Estado: SC, País: BR Id: 4915 - Nome: Florianópolis - Estado: SC, País: BR Id: 4916 - Nome: Formosa do Sul - Estado: SC, País: BR Id: 4918 - Nome: Forquilhinha - Estado: SC, País: BR Id: 4919 - Nome: Fraiburgo - Estado: SC, País: BR Id: 4920 - Nome: Frei Rogério - Estado: SC, País: BR Id: 4921 - Nome: Galvão - Estado: SC, País: BR Id: 4922 - Nome: Garopaba - Estado: SC, País: BR Id: 4923 - Nome: Garuva - Estado: SC, País: BR Id: 4924 - Nome: Gaspar - Estado: SC, País: BR Id: 4925 - Nome: Governador Celso Ramos - Estado: SC, País: BR Id: 4927 - Nome: Grão Pará - Estado: SC, País: BR Id: 4928 - Nome: Gravatal - Estado: SC, País: BR Id: 4929 - Nome: Guabiruba - Estado: SC, País: BR Id: 4930 - Nome: Guaraciaba - Estado: SC, País: BR Id: 4931 - Nome: Guaramirim - Estado: SC, País: BR Id: 4932 - Nome: Guarda do Embaú - Estado: SC, País: BR Id: 4933 - Nome: Guarujá do Sul - Estado: SC, País: BR Id: 4935 - Nome: Guatá - Estado: SC, País: BR Id: 4934 - Nome: Guatambú - Estado: SC, País: BR Id: 4936 - Nome: Herval d'Oeste - Estado: SC, País: BR Id: 4937 - Nome: Ibiam - Estado: SC, País: BR Id: 4938 - Nome: Ibicaré - Estado: SC, País: BR Id: 4939 - Nome: Ibirama - Estado: SC, País: BR Id: 4940 - Nome: Içara - Estado: SC, País: BR Id: 4941 - Nome: Ilhota - Estado: SC, País: BR Id: 4942 - Nome: Imaruí - Estado: SC, País: BR Id: 4943 - Nome: Imbituba - Estado: SC, País: BR Id: 4944 - Nome: Imbuia - Estado: SC, País: BR Id: 4945 - Nome: Indaial - Estado: SC, País: BR Id: 4946 - Nome: Iomerê - Estado: SC, País: BR Id: 4947 - Nome: Ipira - Estado: SC, País: BR Id: 4948 - Nome: Ipoméia - Estado: SC, País: BR Id: 4949 - Nome: Iporã do Oeste - Estado: SC, País: BR Id: 4950 - Nome: Ipuaçu - Estado: SC, País: BR Id: 4951 - Nome: Ipumirim - Estado: SC, País: BR Id: 4952 - Nome: Iraceminha - Estado: SC, País: BR Id: 4953 - Nome: Irani - Estado: SC, País: BR Id: 4954 - Nome: Irati - Estado: SC, País: BR Id: 4955 - Nome: Irineópolis - Estado: SC, País: BR Id: 4962 - Nome: Itá - Estado: SC, País: BR Id: 4956 - Nome: Itaiópolis - Estado: SC, País: BR Id: 4957 - Nome: Itajaí - Estado: SC, País: BR Id: 4958 - Nome: Itapema - Estado: SC, País: BR Id: 4959 - Nome: Itapiranga - Estado: SC, País: BR Id: 4960 - Nome: Itapoá - Estado: SC, País: BR Id: 4961 - Nome: Itapocu - Estado: SC, País: BR Id: 4963 - Nome: Ituporanga - Estado: SC, País: BR Id: 4964 - Nome: Jaborá - Estado: SC, País: BR Id: 4965 - Nome: Jacinto Machado - Estado: SC, País: BR Id: 4966 - Nome: Jaguaruna - Estado: SC, País: BR Id: 4967 - Nome: Jaraguá do Sul - Estado: SC, País: BR Id: 4968 - Nome: Jardinópolis - Estado: SC, País: BR Id: 4969 - Nome: Joaçaba - Estado: SC, País: BR Id: 4970 - Nome: Joinville - Estado: SC, País: BR Id: 4971 - Nome: José Boiteux - Estado: SC, País: BR Id: 4972 - Nome: Jupiá - Estado: SC, País: BR Id: 4974 - Nome: Lacerdópolis - Estado: SC, País: BR Id: 4975 - Nome: Lages - Estado: SC, País: BR Id: 4976 - Nome: Laguna - Estado: SC, País: BR Id: 4977 - Nome: Lajeado Grande - Estado: SC, País: BR Id: 4978 - Nome: Laurentino - Estado: SC, País: BR Id: 4979 - Nome: Lauro Muller - Estado: SC, País: BR Id: 4980 - Nome: Lebon Régis - Estado: SC, País: BR Id: 4981 - Nome: Leoberto Leal - Estado: SC, País: BR Id: 4982 - Nome: Lindóia do Sul - Estado: SC, País: BR Id: 4983 - Nome: Lontras - Estado: SC, País: BR Id: 4984 - Nome: Luiz Alves - Estado: SC, País: BR Id: 4985 - Nome: Luzerna - Estado: SC, País: BR Id: 4986 - Nome: Macieira - Estado: SC, País: BR Id: 4987 - Nome: Mafra - Estado: SC, País: BR Id: 4988 - Nome: Major Gercino - Estado: SC, País: BR Id: 4989 - Nome: Major Vieira - Estado: SC, País: BR Id: 4990 - Nome: Maracajá - Estado: SC, País: BR Id: 4991 - Nome: Maravilha - Estado: SC, País: BR Id: 4992 - Nome: Marema - Estado: SC, País: BR Id: 4993 - Nome: Massaranduba - Estado: SC, País: BR Id: 4994 - Nome: Matos Costa - Estado: SC, País: BR Id: 4995 - Nome: Meleiro - Estado: SC, País: BR Id: 4996 - Nome: Mirim Doce - Estado: SC, País: BR Id: 4997 - Nome: Modelo - Estado: SC, País: BR Id: 4998 - Nome: Mondaí - Estado: SC, País: BR Id: 4999 - Nome: Monte Carlo - Estado: SC, País: BR Id: 5000 - Nome: Monte Castelo - Estado: SC, País: BR Id: 5001 - Nome: Morro da Fumaça - Estado: SC, País: BR Id: 5002 - Nome: Morro Grande - Estado: SC, País: BR Id: 5003 - Nome: Navegantes - Estado: SC, País: BR Id: 5004 - Nome: Nova Erechim - Estado: SC, País: BR Id: 5005 - Nome: Nova Itaberaba - Estado: SC, País: BR Id: 5006 - Nome: Nova Trento - Estado: SC, País: BR Id: 5007 - Nome: Nova Veneza - Estado: SC, País: BR Id: 4678 - Nome: Novo Horizonte - Estado: SC, País: BR Id: 4679 - Nome: Orleans - Estado: SC, País: BR Id: 4680 - Nome: Otacílio Costa - Estado: SC, País: BR Id: 4681 - Nome: Ouro - Estado: SC, País: BR Id: 4682 - Nome: Ouro Verde - Estado: SC, País: BR Id: 4683 - Nome: Paial - Estado: SC, País: BR Id: 4648 - Nome: Painel - Estado: SC, País: BR Id: 4756 - Nome: Palhoça - Estado: SC, País: BR Id: 4757 - Nome: Palma Sola - Estado: SC, País: BR Id: 4758 - Nome: Palmeira - Estado: SC, País: BR Id: 4759 - Nome: Palmitos - Estado: SC, País: BR Id: 4760 - Nome: Papanduva - Estado: SC, País: BR Id: 4761 - Nome: Paraíso - Estado: SC, País: BR Id: 4762 - Nome: Passo de Torres - Estado: SC, País: BR Id: 4763 - Nome: Passos Maia - Estado: SC, País: BR Id: 4764 - Nome: Paulo Lopes - Estado: SC, País: BR Id: 4765 - Nome: Pedras Grandes - Estado: SC, País: BR Id: 4766 - Nome: Penha - Estado: SC, País: BR Id: 4767 - Nome: Peritiba - Estado: SC, País: BR Id: 4768 - Nome: Petrolândia - Estado: SC, País: BR Id: 4770 - Nome: Pinhalzinho - Estado: SC, País: BR Id: 4771 - Nome: Pinheiro Preto - Estado: SC, País: BR Id: 4772 - Nome: Piratuba - Estado: SC, País: BR Id: 4773 - Nome: Planalto Alegre - Estado: SC, País: BR Id: 4774 - Nome: Pomerode - Estado: SC, País: BR Id: 4776 - Nome: Ponte Alta - Estado: SC, País: BR Id: 4775 - Nome: Ponte Alta do Norte - Estado: SC, País: BR Id: 4777 - Nome: Ponte Serrada - Estado: SC, País: BR Id: 4778 - Nome: Porto Belo - Estado: SC, País: BR Id: 4779 - Nome: Porto União - Estado: SC, País: BR Id: 4780 - Nome: Pouso Redondo - Estado: SC, País: BR Id: 4781 - Nome: Praia do Santinho - Estado: SC, País: BR Id: 4782 - Nome: Praia Grande - Estado: SC, País: BR Id: 4783 - Nome: Presidente Castelo Branco - Estado: SC, País: BR Id: 4784 - Nome: Presidente Getúlio - Estado: SC, País: BR Id: 4785 - Nome: Presidente Nereu - Estado: SC, País: BR Id: 4811 - Nome: Princesa - Estado: SC, País: BR Id: 4812 - Nome: Quilombo - Estado: SC, País: BR Id: 4813 - Nome: Rancho Queimado - Estado: SC, País: BR Id: 4814 - Nome: Rio das Antas - Estado: SC, País: BR Id: 4815 - Nome: Rio do Campo - Estado: SC, País: BR Id: 4816 - Nome: Rio d'Oeste - Estado: SC, País: BR Id: 4817 - Nome: Rio dos Cedros - Estado: SC, País: BR Id: 4818 - Nome: Rio do Sul - Estado: SC, País: BR Id: 4819 - Nome: Rio Fortuna - Estado: SC, País: BR Id: 4820 - Nome: Rio Negrinho - Estado: SC, País: BR Id: 4821 - Nome: Rio Rufino - Estado: SC, País: BR Id: 4822 - Nome: Riqueza - Estado: SC, País: BR Id: 4823 - Nome: Rodeio - Estado: SC, País: BR Id: 4824 - Nome: Romelândia - Estado: SC, País: BR Id: 4825 - Nome: Salete - Estado: SC, País: BR Id: 4826 - Nome: Saltinho - Estado: SC, País: BR Id: 4827 - Nome: Salto Veloso - Estado: SC, País: BR Id: 4828 - Nome: Sangão - Estado: SC, País: BR Id: 4829 - Nome: Santa Cecília - Estado: SC, País: BR Id: 4830 - Nome: Santa Helena - Estado: SC, País: BR Id: 4831 - Nome: Santa Rosa de Lima - Estado: SC, País: BR Id: 4832 - Nome: Santa Rosa do Sul - Estado: SC, País: BR Id: 4834 - Nome: Santa Terezinha - Estado: SC, País: BR Id: 4833 - Nome: Santa Terezinha do Progresso - Estado: SC, País: BR Id: 4835 - Nome: Santiago do Sul - Estado: SC, País: BR Id: 4836 - Nome: Santo Amaro da Imperatriz - Estado: SC, País: BR Id: 4837 - Nome: São Bento do Sul - Estado: SC, País: BR Id: 4838 - Nome: São Bernardino - Estado: SC, País: BR Id: 4839 - Nome: São Bonifácio - Estado: SC, País: BR Id: 4840 - Nome: São Carlos - Estado: SC, País: BR Id: 4841 - Nome: São Cristovão do Sul - Estado: SC, País: BR Id: 4842 - Nome: São Domingos - Estado: SC, País: BR Id: 4843 - Nome: São Francisco do Sul - Estado: SC, País: BR Id: 4844 - Nome: São João Batista - Estado: SC, País: BR Id: 4845 - Nome: São João do Itaperiú - Estado: SC, País: BR Id: 4846 - Nome: São João do Oeste - Estado: SC, País: BR Id: 4847 - Nome: São João do Sul - Estado: SC, País: BR Id: 4848 - Nome: São Joaquim - Estado: SC, País: BR Id: 4851 - Nome: São José - Estado: SC, País: BR Id: 4849 - Nome: São José do Cedro - Estado: SC, País: BR Id: 4850 - Nome: São José do Cerrito - Estado: SC, País: BR Id: 4852 - Nome: São Lourenço d'Oeste - Estado: SC, País: BR Id: 4853 - Nome: São Ludgero - Estado: SC, País: BR Id: 4854 - Nome: São Martinho - Estado: SC, País: BR Id: 4855 - Nome: São Miguel da Boa Vista - Estado: SC, País: BR Id: 4856 - Nome: São Miguel do Oeste - Estado: SC, País: BR Id: 4857 - Nome: São Pedro de Alcântara - Estado: SC, País: BR Id: 4858 - Nome: Saudades - Estado: SC, País: BR Id: 85793 - Nome: SBCH - Estado: SC, País: BR Id: 74832 - Nome: SBFL - Estado: SC, País: BR Id: 74833 - Nome: SBJV - Estado: SC, País: BR Id: 85285 - Nome: SBNF - Estado: SC, País: BR Id: 4859 - Nome: Schroeder - Estado: SC, País: BR Id: 4860 - Nome: Seara - Estado: SC, País: BR Id: 4861 - Nome: Serra Alta - Estado: SC, País: BR Id: 4862 - Nome: Siderópolis - Estado: SC, País: BR Id: 4863 - Nome: Sombrio - Estado: SC, País: BR Id: 4864 - Nome: Sul Brasil - Estado: SC, País: BR Id: 4865 - Nome: Taió - Estado: SC, País: BR Id: 4866 - Nome: Tangará - Estado: SC, País: BR Id: 4867 - Nome: Tigrinhos - Estado: SC, País: BR Id: 4868 - Nome: Tijucas - Estado: SC, País: BR Id: 4869 - Nome: Timbé do Sul - Estado: SC, País: BR Id: 4871 - Nome: Timbó - Estado: SC, País: BR Id: 4870 - Nome: Timbó Grande - Estado: SC, País: BR Id: 4872 - Nome: Três Barras - Estado: SC, País: BR Id: 4875 - Nome: Treviso - Estado: SC, País: BR Id: 4878 - Nome: Treze de Maio - Estado: SC, País: BR Id: 4879 - Nome: Treze Tílias - Estado: SC, País: BR Id: 4880 - Nome: Trombudo Central - Estado: SC, País: BR Id: 4881 - Nome: Tubarão - Estado: SC, País: BR Id: 4882 - Nome: Tunápolis - Estado: SC, País: BR Id: 4883 - Nome: Turvo - Estado: SC, País: BR Id: 4884 - Nome: União do Oeste - Estado: SC, País: BR Id: 4885 - Nome: Urubici - Estado: SC, País: BR Id: 4886 - Nome: Urupema - Estado: SC, País: BR Id: 4887 - Nome: Urussanga - Estado: SC, País: BR Id: 4482 - Nome: Vargeão - Estado: SC, País: BR Id: 4484 - Nome: Vargem - Estado: SC, País: BR Id: 4483 - Nome: Vargem Bonita - Estado: SC, País: BR Id: 4485 - Nome: Vidal Ramos - Estado: SC, País: BR Id: 4486 - Nome: Videira - Estado: SC, País: BR Id: 4487 - Nome: Vitor Meireles - Estado: SC, País: BR Id: 4488 - Nome: Witmarsum - Estado: SC, País: BR Id: 4489 - Nome: Xanxerê - Estado: SC, País: BR Id: 4490 - Nome: Xavantina - Estado: SC, País: BR Id: 4491 - Nome: Xaxim - Estado: SC, País: BR Id: 4492 - Nome: Zortéa - Estado: SC, País: BR ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/.gitignore ================================================ # Files and directories created by pub. .dart_tool/ .packages # Conventional directory for build output. build/ ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/CHANGELOG.md ================================================ ## 1.0.0 - Initial version. ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/README.md ================================================ A sample command-line application with an entrypoint in `bin/`, library code in `lib/`, and example unit test in `test/`. ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/analysis_options.yaml ================================================ # This file configures the static analysis results for your project (errors, # warnings, and lints). # # This enables the 'recommended' set of lints from `package:lints`. # This set helps identify many issues that may lead to problems when running # or consuming Dart code, and enforces writing Dart using a single, idiomatic # style and format. # # If you want a smaller set of lints you can change this to specify # 'package:lints/core.yaml'. These are just the most critical lints # (the recommended set includes the core lints). # The core lints are also what is used by pub.dev for scoring packages. include: package:lints/recommended.yaml # Uncomment the following section to specify additional rules. # linter: # rules: # - camel_case_types # analyzer: # exclude: # - path/to/excluded/files/** # For more information about the core and recommended set of lints, see # https://dart.dev/go/core-lints # For additional information about configuring this file, see # https://dart.dev/guides/language/analysis-options ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart ================================================ import 'dart:async'; import 'dart:io'; import 'package:args/args.dart'; import 'package:climatempo/alerta_server.dart'; import 'package:climatempo/api.dart'; import 'package:climatempo/log.dart'; import 'package:climatempo/model/clima_tempo.dart'; void main(List args) { runZonedGuarded(() { executar(args); }, (e, s) { print(e); print(s); salvarErro(e, s); }); } Future executar(List args) async { final parser = criarParser(); final argsResult = parser.parse(args); if (argsResult['help']) { mostrarAjuda(parser); exit(0); } final comando = argsResult.command; if (comando != null && comando.name == 'cidade') { final nomeCidade = comando['nome']; final estado = comando['estado']; final cidades = await buscarCidades(estado: estado, nome: nomeCidade); if (comando['salvar']) await salvarCidadesIsolate(cidades); cidades.forEach((c) => print(c)); } if (comando != null && comando.name == 'agora') { final id = comando['id']; if (id == null) { print('É obrigatório informar um [-id] de cidade'); exit(2); } final tempo = await registrarCidadeEBuscarTempo(int.parse(id)); if (comando['salvar']) await salvarTempoIsolate(tempo); print(tempo); } if (comando != null && comando.name == 'alerta') { AlertaServer().start().listen(print); } } Future registrarCidadeEBuscarTempo(int idCidade) async { await registrarCidade(idCidade: idCidade); return await climaAtual(idCidade: idCidade); } void mostrarAjuda(ArgParser parser) { print('--- HELP ---'); print(parser.usage); for (var comando in parser.commands.entries) { print('> Comando [${comando.key}]'); print(comando.value.usage); } } ArgParser criarParser() { return ArgParser() ..addCommand('alerta') ..addCommand( 'cidade', ArgParser() ..addOption('nome', abbr: 'n', valueHelp: 'Nome da cidade para consulta') ..addOption('estado', abbr: 'e', valueHelp: 'Sigla do estado para consulta') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addCommand( 'agora', ArgParser() ..addOption('id', abbr: 'i', valueHelp: 'Id da cidade para consulta do tempo') ..addFlag('salvar', abbr: 's', help: 'Salvar o resultado em arquivo de log', negatable: false), ) ..addFlag('help', abbr: 'h', help: 'Como utilizar o programa', negatable: false); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/alerta_server.dart ================================================ import 'dart:convert'; import 'dart:io'; class AlertaServer { Stream start() async* { var server = await HttpServer.bind( InternetAddress.loopbackIPv4, 8080, ); await for (HttpRequest request in server) { final contentType = request.headers.contentType != null ? request.headers.contentType!.mimeType : ''; final response = request.response; if (request.method == 'POST' && contentType == 'application/json') { final requestMap = await utf8.decoder.bind(request).join(); final String? aviso = jsonDecode(requestMap)['aviso']; if (aviso != null) { response ..statusCode = HttpStatus.ok ..write('Informação recebida!'); yield aviso; } else { response ..statusCode = HttpStatus.badRequest ..write('Formato de request errado..'); } } else { response ..statusCode = HttpStatus.methodNotAllowed ..write('É aceito apenas request POST'); } await request.response.close(); } } } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/api.dart ================================================ import 'dart:convert'; import 'package:http/http.dart' as http; import 'model/cidade.dart'; import 'model/clima_tempo.dart'; const apiBaseUrl = 'https://apiadvisor.climatempo.com.br'; const token = '5e411a25e4adf6786d3fd7fa45d9fa9c'; Future> buscarCidades({String? nome, String? estado}) async { var url = '$apiBaseUrl/api/v1/locale/city?'; if (nome != null) url += 'name=$nome'; if (estado != null) url += '&state=$estado'; final response = await http.get(Uri.parse('$url&token=$token')); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); final cidades = []; responseJson.forEach((map) => cidades.add(Cidade.fromJson(map))); return cidades; } Future registrarCidade({required int idCidade}) async { final url = '$apiBaseUrl/api-manager/user-token/$token/locales'; final map = {'localeId[]': '$idCidade'}; await http.put(Uri.parse(url), body: map); } Future climaAtual({required int idCidade}) async { final url = '$apiBaseUrl/api/v1/weather/locale/$idCidade/current?token=$token'; final response = await http.get(Uri.parse(url)); if (response.statusCode != 200) throw response.body; final responseJson = json.decode(response.body); return ClimaTempo.fromJson(responseJson); } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/log.dart ================================================ import 'dart:io'; import 'dart:isolate'; import 'package:climatempo/model/clima_tempo.dart'; import 'model/cidade.dart'; Future _validarDiretorio() async { final dir = Directory('log'); if (!(await dir.exists())) { await dir.create(); } } Future salvarTempoIsolate(ClimaTempo climaTempo) async { final isolate = await Isolate.spawn(salvarTempo, climaTempo); _registrarCallbackFinalizacao(isolate); } Future salvarTempo(ClimaTempo climaTempo) async { await _validarDiretorio(); final file = File('log/${climaTempo.cidade.id}.txt'); await file.writeAsString('===\n$climaTempo', mode: FileMode.append); } void _registrarCallbackFinalizacao(Isolate isolate) { final receivePort = ReceivePort(); receivePort.listen((mensagem) { print(mensagem); receivePort.close(); }); isolate.addOnExitListener(receivePort.sendPort, response: 'Arquivo salvo com sucesso!'); } Future salvarCidadesIsolate(List cidades) async { final isolate = await Isolate.spawn(salvarCidades, cidades); _registrarCallbackFinalizacao(isolate); } Future salvarCidades(List cidades) async { await _validarDiretorio(); final file = File('log/cidades.txt'); final sink = file.openWrite(mode: FileMode.write); cidades.forEach((c) => sink.writeln(c)); await sink.flush(); await sink.close(); } Future salvarErro(Object erro, StackTrace stackTrace) async { await _validarDiretorio(); final data = DateTime.now(); final ano = data.year; final mes = _doisDigitos(data.month); final dia = _doisDigitos(data.day); final file = File('log/$dia$mes$ano.txt'); await file.writeAsString('${data.toIso8601String()} : $erro\n', mode: FileMode.append); await file.writeAsString('${data.toIso8601String()} : $stackTrace', mode: FileMode.append); } String _doisDigitos(int numero) { if (numero >= 10) return '$numero'; return '0$numero'; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/cidade.dart ================================================ class Cidade { Cidade.fromJson(Map jsonMap) : id = jsonMap['id'], nome = jsonMap['name'], estado = jsonMap['state'], pais = jsonMap['country']; final int id; final String nome; final String estado; final String pais; @override String toString() => 'Id: $id - Nome: $nome - Estado: $estado, País: $pais'; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/clima_tempo.dart ================================================ import 'cidade.dart'; import 'tempo.dart'; class ClimaTempo { ClimaTempo.fromJson(Map jsonMap) : cidade = Cidade.fromJson(jsonMap), tempo = Tempo.fromJson(jsonMap['data']); final Cidade cidade; final Tempo tempo; String toString() => ''' Cidade: ${cidade.nome}, ${cidade.estado} - ${cidade.pais} ${tempo.data} Temperatura: ${tempo.temperatura} - Sensação: ${tempo.sensacao} Umidade: ${tempo.humidade} - Velocidade do Vento: ${tempo.velocidadeVento} '''; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/lib/model/tempo.dart ================================================ class Tempo { Tempo.fromJson(Map jsonMap) : temperatura = jsonMap['temperature'], velocidadeVento = jsonMap['wind_velocity'], humidade = jsonMap['humidity'], sensacao = jsonMap['sensation'], data = DateTime.parse(jsonMap['date']); final num temperatura; final num velocidadeVento; final num humidade; final num sensacao; final DateTime data; } ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/log/13032022.txt ================================================ 2022-03-13T22:18:37.172126 : {"error":true,"detail":"Invalid token"} 2022-03-13T22:18:37.172126 : #0 climaAtual (package:climatempo/api.dart:34:35) #1 registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10) #2 executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19) 2022-03-13T22:18:54.065327 : {"error":true,"detail":"Invalid token"} 2022-03-13T22:18:54.065327 : #0 climaAtual (package:climatempo/api.dart:34:35) #1 registrarCidadeEBuscarTempo (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:56:10) #2 executar (file:///Users/juliohenriquebitencourt/Docs/dev/projects/dart-book/code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/bin/climatempo.dart:44:19) ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/log/4915.txt ================================================ === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:32:11.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 21:45:02.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 17 === Cidade: Florianópolis, SC - BR 2022-03-13 22:18:07.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 === Cidade: Florianópolis, SC - BR 2022-03-13 22:18:07.000 Temperatura: 20 - Sensação: 20 Umidade: 100 - Velocidade do Vento: 15 ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/log/cidades.txt ================================================ Id: 5049 - Nome: Abdon Batista - Estado: SC, País: BR Id: 5050 - Nome: Abelardo Luz - Estado: SC, País: BR Id: 5051 - Nome: Agrolândia - Estado: SC, País: BR Id: 5052 - Nome: Agronômica - Estado: SC, País: BR Id: 5053 - Nome: Água Doce - Estado: SC, País: BR Id: 5054 - Nome: Águas Brancas - Estado: SC, País: BR Id: 5055 - Nome: Águas de Chapecó - Estado: SC, País: BR Id: 5056 - Nome: Águas Frias - Estado: SC, País: BR Id: 5057 - Nome: Águas Mornas - Estado: SC, País: BR Id: 5058 - Nome: Alfredo Wagner - Estado: SC, País: BR Id: 5059 - Nome: Alto Bela Vista - Estado: SC, País: BR Id: 5060 - Nome: Anchieta - Estado: SC, País: BR Id: 5061 - Nome: Angelina - Estado: SC, País: BR Id: 5062 - Nome: Anita Garibaldi - Estado: SC, País: BR Id: 5063 - Nome: Anitápolis - Estado: SC, País: BR Id: 5064 - Nome: Anta Gorda - Estado: SC, País: BR Id: 5065 - Nome: Antônio Carlos - Estado: SC, País: BR Id: 5066 - Nome: Apiúna - Estado: SC, País: BR Id: 5067 - Nome: Arabutã - Estado: SC, País: BR Id: 5068 - Nome: Araquari - Estado: SC, País: BR Id: 5069 - Nome: Araranguá - Estado: SC, País: BR Id: 5070 - Nome: Armazém - Estado: SC, País: BR Id: 5071 - Nome: Arroio Trinta - Estado: SC, País: BR Id: 5072 - Nome: Arvoredo - Estado: SC, País: BR Id: 5073 - Nome: Ascurra - Estado: SC, País: BR Id: 5074 - Nome: Atalanta - Estado: SC, País: BR Id: 5075 - Nome: Aurora - Estado: SC, País: BR Id: 5076 - Nome: Balneário Arroio do Silva - Estado: SC, País: BR Id: 5077 - Nome: Balneário Barra do Sul - Estado: SC, País: BR Id: 5078 - Nome: Balneário Camboriú - Estado: SC, País: BR Id: 5080 - Nome: Balneário Gaivota - Estado: SC, País: BR Id: 4769 - Nome: Balneário Piçarras - Estado: SC, País: BR Id: 5081 - Nome: Bandeirante - Estado: SC, País: BR Id: 5082 - Nome: Barra Bonita - Estado: SC, País: BR Id: 5083 - Nome: Barra do Ibiraquera - Estado: SC, País: BR Id: 5084 - Nome: Barra do Saí - Estado: SC, País: BR Id: 5085 - Nome: Barra Velha - Estado: SC, País: BR Id: 5086 - Nome: Bela Vista do Toldo - Estado: SC, País: BR Id: 5087 - Nome: Belmonte - Estado: SC, País: BR Id: 5088 - Nome: Benedito Novo - Estado: SC, País: BR Id: 5089 - Nome: Biguaçu - Estado: SC, País: BR Id: 5090 - Nome: Blumenau - Estado: SC, País: BR Id: 5091 - Nome: Bocaina do Sul - Estado: SC, País: BR Id: 5092 - Nome: Bombinhas - Estado: SC, País: BR Id: 5093 - Nome: Bom Jardim da Serra - Estado: SC, País: BR Id: 5095 - Nome: Bom Jesus - Estado: SC, País: BR Id: 5094 - Nome: Bom Jesus do Oeste - Estado: SC, País: BR Id: 5096 - Nome: Bom Retiro - Estado: SC, País: BR Id: 5097 - Nome: Bom Sucesso - Estado: SC, País: BR Id: 5098 - Nome: Botuverá - Estado: SC, País: BR Id: 5099 - Nome: Braço do Norte - Estado: SC, País: BR Id: 5100 - Nome: Braço do Trombudo - Estado: SC, País: BR Id: 5101 - Nome: Brunópolis - Estado: SC, País: BR Id: 5102 - Nome: Brusque - Estado: SC, País: BR Id: 5103 - Nome: Caçador - Estado: SC, País: BR Id: 5104 - Nome: Caibi - Estado: SC, País: BR Id: 5105 - Nome: Calmon - Estado: SC, País: BR Id: 5106 - Nome: Camboriú - Estado: SC, País: BR Id: 5107 - Nome: Campina da Alegria - Estado: SC, País: BR Id: 5108 - Nome: Campo Alegre - Estado: SC, País: BR Id: 5109 - Nome: Campo Belo do Sul - Estado: SC, País: BR Id: 5110 - Nome: Campo Erê - Estado: SC, País: BR Id: 5111 - Nome: Campos Novos - Estado: SC, País: BR Id: 5112 - Nome: Canelinha - Estado: SC, País: BR Id: 5113 - Nome: Canoinhas - Estado: SC, País: BR Id: 5114 - Nome: Capão Alto - Estado: SC, País: BR Id: 5115 - Nome: Capinzal - Estado: SC, País: BR Id: 5116 - Nome: Capivari de Baixo - Estado: SC, País: BR Id: 5117 - Nome: Catanduvas - Estado: SC, País: BR Id: 5118 - Nome: Caxambu do Sul - Estado: SC, País: BR Id: 5119 - Nome: Celso Ramos - Estado: SC, País: BR Id: 4888 - Nome: Cerro Negro - Estado: SC, País: BR Id: 4889 - Nome: Chapadão do Lageado - Estado: SC, País: BR Id: 4890 - Nome: Chapecó - Estado: SC, País: BR Id: 4891 - Nome: Cocal do Sul - Estado: SC, País: BR Id: 4892 - Nome: Concórdia - Estado: SC, País: BR Id: 4893 - Nome: Cordilheira Alta - Estado: SC, País: BR Id: 4894 - Nome: Coronel Freitas - Estado: SC, País: BR Id: 4895 - Nome: Coronel Martins - Estado: SC, País: BR Id: 4896 - Nome: Correia Pinto - Estado: SC, País: BR Id: 4897 - Nome: Corupá - Estado: SC, País: BR Id: 4898 - Nome: Criciúma - Estado: SC, País: BR Id: 4899 - Nome: Cunha Porã - Estado: SC, País: BR Id: 4900 - Nome: Cunhataí - Estado: SC, País: BR Id: 4901 - Nome: Curitibanos - Estado: SC, País: BR Id: 4902 - Nome: Descanso - Estado: SC, País: BR Id: 4903 - Nome: Dionísio Cerqueira - Estado: SC, País: BR Id: 4904 - Nome: Dona Emma - Estado: SC, País: BR Id: 4905 - Nome: Doutor Pedrinho - Estado: SC, País: BR Id: 4906 - Nome: Enseada de Brito - Estado: SC, País: BR Id: 4907 - Nome: Entre Rios - Estado: SC, País: BR Id: 4909 - Nome: Ermo - Estado: SC, País: BR Id: 4912 - Nome: Erval Velho - Estado: SC, País: BR Id: 4913 - Nome: Faxinal dos Guedes - Estado: SC, País: BR Id: 4914 - Nome: Flor do Sertão - Estado: SC, País: BR Id: 4915 - Nome: Florianópolis - Estado: SC, País: BR Id: 4916 - Nome: Formosa do Sul - Estado: SC, País: BR Id: 4918 - Nome: Forquilhinha - Estado: SC, País: BR Id: 4919 - Nome: Fraiburgo - Estado: SC, País: BR Id: 4920 - Nome: Frei Rogério - Estado: SC, País: BR Id: 4921 - Nome: Galvão - Estado: SC, País: BR Id: 4922 - Nome: Garopaba - Estado: SC, País: BR Id: 4923 - Nome: Garuva - Estado: SC, País: BR Id: 4924 - Nome: Gaspar - Estado: SC, País: BR Id: 4925 - Nome: Governador Celso Ramos - Estado: SC, País: BR Id: 4927 - Nome: Grão Pará - Estado: SC, País: BR Id: 4928 - Nome: Gravatal - Estado: SC, País: BR Id: 4929 - Nome: Guabiruba - Estado: SC, País: BR Id: 4930 - Nome: Guaraciaba - Estado: SC, País: BR Id: 4931 - Nome: Guaramirim - Estado: SC, País: BR Id: 4932 - Nome: Guarda do Embaú - Estado: SC, País: BR Id: 4933 - Nome: Guarujá do Sul - Estado: SC, País: BR Id: 4935 - Nome: Guatá - Estado: SC, País: BR Id: 4934 - Nome: Guatambú - Estado: SC, País: BR Id: 4936 - Nome: Herval d'Oeste - Estado: SC, País: BR Id: 4937 - Nome: Ibiam - Estado: SC, País: BR Id: 4938 - Nome: Ibicaré - Estado: SC, País: BR Id: 4939 - Nome: Ibirama - Estado: SC, País: BR Id: 4940 - Nome: Içara - Estado: SC, País: BR Id: 4941 - Nome: Ilhota - Estado: SC, País: BR Id: 4942 - Nome: Imaruí - Estado: SC, País: BR Id: 4943 - Nome: Imbituba - Estado: SC, País: BR Id: 4944 - Nome: Imbuia - Estado: SC, País: BR Id: 4945 - Nome: Indaial - Estado: SC, País: BR Id: 4946 - Nome: Iomerê - Estado: SC, País: BR Id: 4947 - Nome: Ipira - Estado: SC, País: BR Id: 4948 - Nome: Ipoméia - Estado: SC, País: BR Id: 4949 - Nome: Iporã do Oeste - Estado: SC, País: BR Id: 4950 - Nome: Ipuaçu - Estado: SC, País: BR Id: 4951 - Nome: Ipumirim - Estado: SC, País: BR Id: 4952 - Nome: Iraceminha - Estado: SC, País: BR Id: 4953 - Nome: Irani - Estado: SC, País: BR Id: 4954 - Nome: Irati - Estado: SC, País: BR Id: 4955 - Nome: Irineópolis - Estado: SC, País: BR Id: 4962 - Nome: Itá - Estado: SC, País: BR Id: 4956 - Nome: Itaiópolis - Estado: SC, País: BR Id: 4957 - Nome: Itajaí - Estado: SC, País: BR Id: 4958 - Nome: Itapema - Estado: SC, País: BR Id: 4959 - Nome: Itapiranga - Estado: SC, País: BR Id: 4960 - Nome: Itapoá - Estado: SC, País: BR Id: 4961 - Nome: Itapocu - Estado: SC, País: BR Id: 4963 - Nome: Ituporanga - Estado: SC, País: BR Id: 4964 - Nome: Jaborá - Estado: SC, País: BR Id: 4965 - Nome: Jacinto Machado - Estado: SC, País: BR Id: 4966 - Nome: Jaguaruna - Estado: SC, País: BR Id: 4967 - Nome: Jaraguá do Sul - Estado: SC, País: BR Id: 4968 - Nome: Jardinópolis - Estado: SC, País: BR Id: 4969 - Nome: Joaçaba - Estado: SC, País: BR Id: 4970 - Nome: Joinville - Estado: SC, País: BR Id: 4971 - Nome: José Boiteux - Estado: SC, País: BR Id: 4972 - Nome: Jupiá - Estado: SC, País: BR Id: 4974 - Nome: Lacerdópolis - Estado: SC, País: BR Id: 4975 - Nome: Lages - Estado: SC, País: BR Id: 4976 - Nome: Laguna - Estado: SC, País: BR Id: 4977 - Nome: Lajeado Grande - Estado: SC, País: BR Id: 4978 - Nome: Laurentino - Estado: SC, País: BR Id: 4979 - Nome: Lauro Muller - Estado: SC, País: BR Id: 4980 - Nome: Lebon Régis - Estado: SC, País: BR Id: 4981 - Nome: Leoberto Leal - Estado: SC, País: BR Id: 4982 - Nome: Lindóia do Sul - Estado: SC, País: BR Id: 4983 - Nome: Lontras - Estado: SC, País: BR Id: 4984 - Nome: Luiz Alves - Estado: SC, País: BR Id: 4985 - Nome: Luzerna - Estado: SC, País: BR Id: 4986 - Nome: Macieira - Estado: SC, País: BR Id: 4987 - Nome: Mafra - Estado: SC, País: BR Id: 4988 - Nome: Major Gercino - Estado: SC, País: BR Id: 4989 - Nome: Major Vieira - Estado: SC, País: BR Id: 4990 - Nome: Maracajá - Estado: SC, País: BR Id: 4991 - Nome: Maravilha - Estado: SC, País: BR Id: 4992 - Nome: Marema - Estado: SC, País: BR Id: 4993 - Nome: Massaranduba - Estado: SC, País: BR Id: 4994 - Nome: Matos Costa - Estado: SC, País: BR Id: 4995 - Nome: Meleiro - Estado: SC, País: BR Id: 4996 - Nome: Mirim Doce - Estado: SC, País: BR Id: 4997 - Nome: Modelo - Estado: SC, País: BR Id: 4998 - Nome: Mondaí - Estado: SC, País: BR Id: 4999 - Nome: Monte Carlo - Estado: SC, País: BR Id: 5000 - Nome: Monte Castelo - Estado: SC, País: BR Id: 5001 - Nome: Morro da Fumaça - Estado: SC, País: BR Id: 5002 - Nome: Morro Grande - Estado: SC, País: BR Id: 5003 - Nome: Navegantes - Estado: SC, País: BR Id: 5004 - Nome: Nova Erechim - Estado: SC, País: BR Id: 5005 - Nome: Nova Itaberaba - Estado: SC, País: BR Id: 5006 - Nome: Nova Trento - Estado: SC, País: BR Id: 5007 - Nome: Nova Veneza - Estado: SC, País: BR Id: 4678 - Nome: Novo Horizonte - Estado: SC, País: BR Id: 4679 - Nome: Orleans - Estado: SC, País: BR Id: 4680 - Nome: Otacílio Costa - Estado: SC, País: BR Id: 4681 - Nome: Ouro - Estado: SC, País: BR Id: 4682 - Nome: Ouro Verde - Estado: SC, País: BR Id: 4683 - Nome: Paial - Estado: SC, País: BR Id: 4648 - Nome: Painel - Estado: SC, País: BR Id: 4756 - Nome: Palhoça - Estado: SC, País: BR Id: 4757 - Nome: Palma Sola - Estado: SC, País: BR Id: 4758 - Nome: Palmeira - Estado: SC, País: BR Id: 4759 - Nome: Palmitos - Estado: SC, País: BR Id: 4760 - Nome: Papanduva - Estado: SC, País: BR Id: 4761 - Nome: Paraíso - Estado: SC, País: BR Id: 4762 - Nome: Passo de Torres - Estado: SC, País: BR Id: 4763 - Nome: Passos Maia - Estado: SC, País: BR Id: 4764 - Nome: Paulo Lopes - Estado: SC, País: BR Id: 4765 - Nome: Pedras Grandes - Estado: SC, País: BR Id: 4766 - Nome: Penha - Estado: SC, País: BR Id: 4767 - Nome: Peritiba - Estado: SC, País: BR Id: 4768 - Nome: Petrolândia - Estado: SC, País: BR Id: 4770 - Nome: Pinhalzinho - Estado: SC, País: BR Id: 4771 - Nome: Pinheiro Preto - Estado: SC, País: BR Id: 4772 - Nome: Piratuba - Estado: SC, País: BR Id: 4773 - Nome: Planalto Alegre - Estado: SC, País: BR Id: 4774 - Nome: Pomerode - Estado: SC, País: BR Id: 4776 - Nome: Ponte Alta - Estado: SC, País: BR Id: 4775 - Nome: Ponte Alta do Norte - Estado: SC, País: BR Id: 4777 - Nome: Ponte Serrada - Estado: SC, País: BR Id: 4778 - Nome: Porto Belo - Estado: SC, País: BR Id: 4779 - Nome: Porto União - Estado: SC, País: BR Id: 4780 - Nome: Pouso Redondo - Estado: SC, País: BR Id: 4781 - Nome: Praia do Santinho - Estado: SC, País: BR Id: 4782 - Nome: Praia Grande - Estado: SC, País: BR Id: 4783 - Nome: Presidente Castelo Branco - Estado: SC, País: BR Id: 4784 - Nome: Presidente Getúlio - Estado: SC, País: BR Id: 4785 - Nome: Presidente Nereu - Estado: SC, País: BR Id: 4811 - Nome: Princesa - Estado: SC, País: BR Id: 4812 - Nome: Quilombo - Estado: SC, País: BR Id: 4813 - Nome: Rancho Queimado - Estado: SC, País: BR Id: 4814 - Nome: Rio das Antas - Estado: SC, País: BR Id: 4815 - Nome: Rio do Campo - Estado: SC, País: BR Id: 4816 - Nome: Rio d'Oeste - Estado: SC, País: BR Id: 4817 - Nome: Rio dos Cedros - Estado: SC, País: BR Id: 4818 - Nome: Rio do Sul - Estado: SC, País: BR Id: 4819 - Nome: Rio Fortuna - Estado: SC, País: BR Id: 4820 - Nome: Rio Negrinho - Estado: SC, País: BR Id: 4821 - Nome: Rio Rufino - Estado: SC, País: BR Id: 4822 - Nome: Riqueza - Estado: SC, País: BR Id: 4823 - Nome: Rodeio - Estado: SC, País: BR Id: 4824 - Nome: Romelândia - Estado: SC, País: BR Id: 4825 - Nome: Salete - Estado: SC, País: BR Id: 4826 - Nome: Saltinho - Estado: SC, País: BR Id: 4827 - Nome: Salto Veloso - Estado: SC, País: BR Id: 4828 - Nome: Sangão - Estado: SC, País: BR Id: 4829 - Nome: Santa Cecília - Estado: SC, País: BR Id: 4830 - Nome: Santa Helena - Estado: SC, País: BR Id: 4831 - Nome: Santa Rosa de Lima - Estado: SC, País: BR Id: 4832 - Nome: Santa Rosa do Sul - Estado: SC, País: BR Id: 4834 - Nome: Santa Terezinha - Estado: SC, País: BR Id: 4833 - Nome: Santa Terezinha do Progresso - Estado: SC, País: BR Id: 4835 - Nome: Santiago do Sul - Estado: SC, País: BR Id: 4836 - Nome: Santo Amaro da Imperatriz - Estado: SC, País: BR Id: 4837 - Nome: São Bento do Sul - Estado: SC, País: BR Id: 4838 - Nome: São Bernardino - Estado: SC, País: BR Id: 4839 - Nome: São Bonifácio - Estado: SC, País: BR Id: 4840 - Nome: São Carlos - Estado: SC, País: BR Id: 4841 - Nome: São Cristovão do Sul - Estado: SC, País: BR Id: 4842 - Nome: São Domingos - Estado: SC, País: BR Id: 4843 - Nome: São Francisco do Sul - Estado: SC, País: BR Id: 4844 - Nome: São João Batista - Estado: SC, País: BR Id: 4845 - Nome: São João do Itaperiú - Estado: SC, País: BR Id: 4846 - Nome: São João do Oeste - Estado: SC, País: BR Id: 4847 - Nome: São João do Sul - Estado: SC, País: BR Id: 4848 - Nome: São Joaquim - Estado: SC, País: BR Id: 4851 - Nome: São José - Estado: SC, País: BR Id: 4849 - Nome: São José do Cedro - Estado: SC, País: BR Id: 4850 - Nome: São José do Cerrito - Estado: SC, País: BR Id: 4852 - Nome: São Lourenço d'Oeste - Estado: SC, País: BR Id: 4853 - Nome: São Ludgero - Estado: SC, País: BR Id: 4854 - Nome: São Martinho - Estado: SC, País: BR Id: 4855 - Nome: São Miguel da Boa Vista - Estado: SC, País: BR Id: 4856 - Nome: São Miguel do Oeste - Estado: SC, País: BR Id: 4857 - Nome: São Pedro de Alcântara - Estado: SC, País: BR Id: 4858 - Nome: Saudades - Estado: SC, País: BR Id: 85793 - Nome: SBCH - Estado: SC, País: BR Id: 74832 - Nome: SBFL - Estado: SC, País: BR Id: 74833 - Nome: SBJV - Estado: SC, País: BR Id: 85285 - Nome: SBNF - Estado: SC, País: BR Id: 4859 - Nome: Schroeder - Estado: SC, País: BR Id: 4860 - Nome: Seara - Estado: SC, País: BR Id: 4861 - Nome: Serra Alta - Estado: SC, País: BR Id: 4862 - Nome: Siderópolis - Estado: SC, País: BR Id: 4863 - Nome: Sombrio - Estado: SC, País: BR Id: 4864 - Nome: Sul Brasil - Estado: SC, País: BR Id: 4865 - Nome: Taió - Estado: SC, País: BR Id: 4866 - Nome: Tangará - Estado: SC, País: BR Id: 4867 - Nome: Tigrinhos - Estado: SC, País: BR Id: 4868 - Nome: Tijucas - Estado: SC, País: BR Id: 4869 - Nome: Timbé do Sul - Estado: SC, País: BR Id: 4871 - Nome: Timbó - Estado: SC, País: BR Id: 4870 - Nome: Timbó Grande - Estado: SC, País: BR Id: 4872 - Nome: Três Barras - Estado: SC, País: BR Id: 4875 - Nome: Treviso - Estado: SC, País: BR Id: 4878 - Nome: Treze de Maio - Estado: SC, País: BR Id: 4879 - Nome: Treze Tílias - Estado: SC, País: BR Id: 4880 - Nome: Trombudo Central - Estado: SC, País: BR Id: 4881 - Nome: Tubarão - Estado: SC, País: BR Id: 4882 - Nome: Tunápolis - Estado: SC, País: BR Id: 4883 - Nome: Turvo - Estado: SC, País: BR Id: 4884 - Nome: União do Oeste - Estado: SC, País: BR Id: 4885 - Nome: Urubici - Estado: SC, País: BR Id: 4886 - Nome: Urupema - Estado: SC, País: BR Id: 4887 - Nome: Urussanga - Estado: SC, País: BR Id: 4482 - Nome: Vargeão - Estado: SC, País: BR Id: 4484 - Nome: Vargem - Estado: SC, País: BR Id: 4483 - Nome: Vargem Bonita - Estado: SC, País: BR Id: 4485 - Nome: Vidal Ramos - Estado: SC, País: BR Id: 4486 - Nome: Videira - Estado: SC, País: BR Id: 4487 - Nome: Vitor Meireles - Estado: SC, País: BR Id: 4488 - Nome: Witmarsum - Estado: SC, País: BR Id: 4489 - Nome: Xanxerê - Estado: SC, País: BR Id: 4490 - Nome: Xavantina - Estado: SC, País: BR Id: 4491 - Nome: Xaxim - Estado: SC, País: BR Id: 4492 - Nome: Zortéa - Estado: SC, País: BR ================================================ FILE: code/pt_Br/na_pratica/15_climatempo_arquivos_isolate_zone/pubspec.yaml ================================================ name: climatempo description: Aplicação CLI para consulta de clima. version: 0.0.1 environment: sdk: ^3.5.1 dependencies: args: ^2.4.2 http: ^1.2.2 dev_dependencies: lints: ^4.0.0 test: ^1.24.0 executables: climatempo: climatempo ================================================ FILE: website/.gitignore ================================================ node_modules/ .cache/ public ================================================ FILE: website/README.md ================================================ ================================================ FILE: website/gatsby-config.js ================================================ module.exports = { siteMetadata: { title: `O guia de Dart`, siteUrl: `https://www.dartguide.dev`, description: `A história, os fundamentos, os conceitos avançados e tudo mais.`, image: `/green_guy.png` }, plugins: [ { resolve: "gatsby-plugin-google-tagmanager", options: { id: "GTM-MLR7B9C", includeInDevelopment: false, routeChangeEventName: "gatsby-route-change", enableWebVitalsTracking: true }, }, "gatsby-plugin-styled-components", `gatsby-plugin-image`, `gatsby-plugin-sharp`, `gatsby-transformer-sharp`, { resolve: `gatsby-plugin-manifest`, options: { name: `Dart Guide Book`, short_name: `DartGuide`, display: `standalone`, icon: `src/images/green_guy.png` }, }, { resolve: "gatsby-plugin-react-svg", options: { rule: { include: /svgs/, }, }, }, ], }; ================================================ FILE: website/package.json ================================================ { "name": "dart-book", "version": "1.0.0", "private": true, "description": "Dart Book", "author": "Julio Bitencourt", "keywords": [ "gatsby" ], "scripts": { "develop": "gatsby develop", "start": "gatsby develop", "build": "gatsby build", "serve": "gatsby serve", "clean": "gatsby clean", "deploy": "gatsby build && gh-pages -d public -b main" }, "dependencies": { "@styled-icons/boxicons-logos": "^10.38.0", "babel-plugin-styled-components": "^2.0.2", "gatsby": "^4.7.1", "gatsby-plugin-google-tagmanager": "^4.10.2", "gatsby-plugin-image": "^2.7.0", "gatsby-plugin-manifest": "^4.10.2", "gatsby-plugin-react-svg": "^3.1.0", "gatsby-plugin-sharp": "^4.10.2", "gatsby-plugin-styled-components": "^5.7.0", "gatsby-source-filesystem": "^4.7.0", "gatsby-transformer-sharp": "^4.10.0", "react": "^17.0.1", "react-day-and-night-toggle": "^1.0.18", "react-dom": "^17.0.1", "styled-components": "^5.3.3" }, "devDependencies": { "gh-pages": "^3.2.3" } } ================================================ FILE: website/src/components/audience/audience.js ================================================ import React from "react"; import { StaticImage } from "gatsby-plugin-image"; import * as G from "../layout/styles"; const Audience = () => { return ( Pra quem é o livro? 
Este livro é indicado para todos aqueles e aquelas que desejam expandir um pouco o seu conhecimento sobre Dart, ou até mesmo para quem não conhece nada da linguagem e quer se aventurar nesse novo mundo, tendo uma nova carta na manga em seu currículo para começar a desenvolver algo server side, para web, desktop, mobile, IOT... várias possibilidades. O objetivo é que o livro sirva como um guia estruturado para introdução e aprofundamento na linguagem. Nele, abordarei desde os conceitos mais básicos envolvendo a sintaxe (como tipos, operadores, estruturas de repetição etc.) até features mais avançadas da linguagem (como programação assíncrona, generics etc.), sempre focando na parte teórica seguida de prática com exemplos Este livro não é uma abordagem de Dart focada para algum SDK específico, como a utilização do AngularDart para desenvolvimento web ou até mesmo o Flutter para criação de aplicações móveis. Porém, como eles trabalham em cima do core do Dart, todos os fundamentos e conceitos aprendidos aqui serão essenciais e com certeza úteis para utilização de qualquer outro framework criado a partir da linguagem.
); }; export default Audience; ================================================ FILE: website/src/components/author/author.js ================================================ import React from "react"; import { StaticImage } from "gatsby-plugin-image"; import * as S from "./styles"; import * as G from "../layout/styles"; import { Github, Instagram } from "@styled-icons/boxicons-logos"; const Author = () => { return (  E o autor?
Julio Henrique Bitencourt
Bacharel em Ciência da Computação e pós-graduando em desenvolvimento mobile pela FIAP. Um eterno estudante, acredito que conhecimento nunca será demais e sempre é o momento certo para ser um aprendiz em algo. Entusiasta em desenvolvimento mobile, após anos flertando com desenvolvimento Android, a partir do final de 2017 venho me especializando e trabalhando com Dart na criação de aplicações multiplataformas e nativas com o querido Flutter. SDK no qual tenho prazer em trabalhar hoje em dia em meu atual emprego como Desenvolvedor Mobile.
); }; export default Author; ================================================ FILE: website/src/components/author/styles.js ================================================ import styled, { css } from "styled-components"; export const Avatar = styled.figure` ${({ theme }) => css` min-width: 120px; width: 120px; height: 120px; border: 3px solid ${theme.textColor}; border-radius: 50%; overflow: hidden; @media (max-width: 900px) { margin: 0px 0px 20px 0px; } `}; `; export const AuthorContainer = styled.div` ${({ theme, widthExpanded, textAlign, alignItems }) => css` display: flex; flex-direction: column; text-align: ${textAlign}; align-items: ${alignItems}; width: ${widthExpanded}; @media (max-width: 900px) { width: 100%; margin-bottom: 30px; } `}; `; export const Icon = styled.div` ${({ theme }) => css` width: 30px; height: 30px; cursor: pointer; color: ${theme.textColor}; &:not(:last-child) { margin-right: 10px; } a { all: unset; } `}; `; ================================================ FILE: website/src/components/book-info/book-info.js ================================================ import React from "react"; import { useTheme } from "styled-components"; import { StaticImage } from "gatsby-plugin-image"; import * as S from "./styles"; import * as G from "../layout/styles"; const BookInfo = () => { const theme = useTheme(); return ( O guia de Dart Fundamentos, prática, conceitos avançados e tudo mais. Disponível impresso ou em seu leitor favorito (.pdf, .epub, .mob). Garanta a sua cópia:

Casa do Código Amazon Kindle

); }; export default BookInfo; ================================================ FILE: website/src/components/book-info/styles.js ================================================ import { keyframes } from "styled-components"; import styled, { css } from "styled-components"; export const Content = styled.div` /* display: flex; */ flex-direction: column; justify-content: center; text-align: start; align-items: flex-start; width: 70%; @media (max-width: 900px) { align-items: start; width: 100%; } `; const coverAnimation = keyframes` 0% { transform: rotateY(0deg); } 100% { transform: rotateY(-29deg); } `; export const BookCover = styled.div` ${({ theme }) => css` display: flex; align-items: center; justify-content: center; perspective: 617px; `}; `; export const Book = styled.div` ${({ theme }) => css` width: 200px; height: 285px; position: relative; transform-style: preserve-3d; transform: rotateY(-29deg); transition: transform 1s ease; animation: 1s ease 0s 1 ${coverAnimation}; :hover { transform: rotateY(0deg); } > :first-child { position: absolute; top: 0; left: 0; width: 200px; height: 285px; transform: translateZ(22.5px); border-radius: 0 2px 2px 0; box-shadow: 5px 5px 20px #aaaaaa; background-color: #01060f; } ::before { position: absolute; content: ' '; left: 0; top: 3px; width: 43px; height: 279px; transform: translateX(174.5px) rotateY(90deg); background: linear-gradient(90deg, #fff 0%, #f9f9f9 5%, #fff 10%, #f9f9f9 15%, #fff 20%, #f9f9f9 25%, #fff 30%, #f9f9f9 35%, #fff 40%, #f9f9f9 45%, #fff 50%, #f9f9f9 55%, #fff 60%, #f9f9f9 65%, #fff 70%, #f9f9f9 75%, #fff 80%, #f9f9f9 85%, #fff 90%, #f9f9f9 95%, #fff 100% ); } ::after { position: absolute; top: 0; left: 0; content: ' '; width: 200px; height: 285px; transform: translateZ(-22.5px); background-color: #6e1c76; border-radius: 0 2px 2px 0; box-shadow: -10px 0 50px 10px #aaaaaa; } `}; `; ================================================ FILE: website/src/components/github/github.js ================================================ import React from "react"; import { useTheme } from "styled-components"; import * as S from "./styles"; import * as G from "../layout/styles"; const Github = () => { const theme = useTheme(); return ( Acesse o Github do livro ); }; export default Github; ================================================ FILE: website/src/components/github/styles.js ================================================ import styled from "styled-components"; export const ButtonArea = styled.section` margin: 12px; `; ================================================ FILE: website/src/components/layout/error.js ================================================ import React from "react"; import { useTheme } from "styled-components"; import * as G from "../layout/styles"; const ErrorContent = () => { const theme = useTheme(); return ( Voltar para home


Esta página não existe :/
); }; export default ErrorContent; ================================================ FILE: website/src/components/layout/footer/footer.js ================================================ import React from "react"; import { useTheme } from "styled-components"; import * as S from "./styles"; import * as G from "../styles"; import HitchhikersDark from "../../../images/svgs/hitchhikers_guide_dark.svg"; import HitchhikersLight from "../../../images/svgs/hitchhikers_guide_light.svg"; const Footer = (props) => { const theme = useTheme(); let svg = theme.dark === "true" ? : ; return ( Até mais, e obrigado pelos peixes! {svg} Autoria de  Julio Bitencourt   |  Arte da capa por  @antunesketchreal   ); }; export default Footer; ================================================ FILE: website/src/components/layout/footer/styles.js ================================================ import styled, { css } from "styled-components"; export const Footer = styled.footer` ${({ theme, bgColor }) => css` background-color: ${bgColor}; text-align: center; padding: 20px; color: ${theme.textColor}; `}; `; export const Svg = styled.svg` width: 30px; height: 30px; vertical-align: middle; `; ================================================ FILE: website/src/components/layout/global.js ================================================ import { createGlobalStyle } from "styled-components"; export default createGlobalStyle` @font-face { font-family: "Source Code Pro"; src: url("/fonts/SourceCodePro.ttf") format("ttf"); } body { line-height: 0.9; } * { font-family: 'Source Code Pro', monospace; letter-spacing: 0.04rem; box-sizing: border-box; } `; ================================================ FILE: website/src/components/layout/header/header.js ================================================ import React, { useState, useEffect } from "react"; import DayNightToggle from "react-day-and-night-toggle"; import * as S from "./styles"; const Header = ({ changeTheme, isDarkTheme }) => { const [isDarkMode, setIsDarkMode] = useState(isDarkTheme); useEffect(() => { setIsDarkMode(isDarkTheme); }, [isDarkTheme]); return ( { changeTheme(); setIsDarkMode(e); }} checked={isDarkMode} shadows={true} size={28} className="toggle" /> ); }; export default Header; ================================================ FILE: website/src/components/layout/header/styles.js ================================================ import styled, { css } from "styled-components"; export const Header = styled.header` ${({ theme }) => css` background-color: ${theme.primaryBg}; `}; `; export const Toggle = styled.div` ${({ theme }) => css` max-width: 80%; margin: auto; padding-top: 20px; padding-bottom: 10px; .toggle { margin-left: auto; } .toggle > div { /* box-shadow: ${theme.dark ? "0 0 35px 1px #e0e0e0a8" : "none"}; */ box-shadow: none; } `}; `; ================================================ FILE: website/src/components/layout/layout.js ================================================ import React from "react"; import GlobalCSS from "./global"; import Header from "./header/header"; import Footer from "./footer/footer"; import { ThemeProvider } from "styled-components"; import { lightTheme, darkTheme } from "./theme"; import "./normalize.css"; class Layout extends React.Component { constructor(props) { super(props); this.state = { lightTheme: true }; this.changeTheme = this.changeTheme.bind(this); } componentDidMount() { const localStorageLayout = localStorage.getItem("lightTheme"); if (localStorageLayout) { this.setState({ lightTheme: JSON.parse(localStorageLayout) }); } } changeTheme() { console.log("clique"); this.setState({ lightTheme: !this.state.lightTheme, }); localStorage.setItem("lightTheme", !this.state.lightTheme); console.log("change state"); } render() { const { children } = this.props; var footerColor; if (this.state.lightTheme) { footerColor = this.props.primary ? lightTheme.primaryBg : lightTheme.secondaryBg; } else { footerColor = this.props.primary ? darkTheme.primaryBg : darkTheme.secondaryBg; } return (
{children}