Introdução
O Spotify é um serviço digital que permite acesso a milhões de músicas, podcasts, vídeos, e outros conteúdos. Atualmente, ele é um dos serviços de streaming de música mais popular e usado no mundo e dispõe de uma api a qual podemos acessá-la para ter acesso aos dados.
Sabemos que a popularidade de uma música depende de diversos fatores. Nesse experimento, buscamos analisar a popularidade das músicas que estão que estiveram no Top 200 das paradas semanais (globais) do Spotify em 2020 e 2021, segundo sua energia, valência e dançabilidade.
Dados
O conjunto de dados inclui todas as músicas que estiveram no Top 200 das paradas semanais (globais) do Spotify em 2020 e 2021. Nesse conjunto de dados, temos diversas variáveis que nos trazem informações sobre o nome da música, os artistas, quantas vezes a música ficou no Top 200 e em quais semanas, streams, número de seguidores do artista, gênero, popularidade, o quanto a música é adequada para dançar, etc. Aqui, queremos saber o que leva uma música a ser popular e como algumas variáveis estão relacionadas com essa popularidade. Para isso, usaremos as seguintes variáveis:
- Popularity: a popularidade da faixa. O valor estará entre 0 e 100, sendo 100 o mais popular.
- Danceability: descreve como uma faixa é adequada para dançar com base em uma combinação de elementos musicais incluindo tempo, estabilidade de ritmo, força de batida e regularidade geral. Um valor de 0,0 é menos dançável e 1,0 é mais dançante.
- Valency: é uma medida de 0,0 a 1,0 que descreve a positividade musical transmitida por uma faixa. Faixas com alta valência soam mais positivas (por exemplo, feliz, alegre, eufórico), enquanto faixas com baixa valência soam mais negativas (por exemplo, triste, deprimido, com raiva).
- Energy: é uma medida de 0,0 a 1,0 e representa uma medida percentual de intensidade e atividade.
Essas variáveis passaram por processamento e estão em porcentagem.
Os dados podem ser encontrados em: https://www.kaggle.com/sashankpillai/spotify-top-200-charts-20202021
Análise Exploratória
Abaixo podemos visualizar alguns sumários como o valor máximo de popularidade das músicas que é 100, a mediana que é 73 indicando que a maior parte das músicas são muito populares e a média de 70,08 reforça isso ainda mais.
Rows: 1
Columns: 4
$ pop_max <dbl> 100
$ mediana <dbl> 73
$ min <dbl> 0
$ media <dbl> 70.08932
O gráfico abaixo mostra como está distribuída a variável Danceability em relação a popularidade. Nele, podemos ver claramente que as músicas mais populares são as mais dançantes, já que os valores mais altos de Danceability estão acima de 50. Músicas que são menos populares são menos dançante também. Nessa categoria de músicas os dados são dispersos. Em contrapartida, os valores de faixas mais populares são mais concentrados e ficam mais dispersos a medida que a popularidade aumenta. Ou ponto importante é a mediana é um valor alto e isso indica que essa playlist conta com a maior parte das músicas sendo muito populares. Além disso, as músicas populares são bem dançantes.

O gráfico abaixo mostra como está distribuída a variável Energy em relação a popularidade. Nele, podemos ver claramente que as músicas mais populares são as mais agitadas, já que os valores mais altos de Energy estão acima de 50. Os valores da variável Energy se coomportam de forma semelhante aos valores da variável Danceability. O senso comum sobre isso é que uma música mais agitada indica que ela é mais dançante, assim como uma música mais lenta tende a ser menos dançante. Porém, se observarmos valores de popularidade próximos a 100, notamos que os valores são mais dispersos tanto em Energy quanto em Danceability.

O gráfico abaixo mostra como está distribuída a variável Valence em relação a popularidade. Nele, podemos ver que os valores para músicas menos populares são muito dispersos indicando que a pouca popularidade contém músicas tristes e felizes. Entretanto a média de valencia segue acima 50 em todo o gráfico. Para músicas mais populares a valencia também varia muito. Isso indica que a popularidade de uma música independe dela ser mais feliz ou mais triste.

Para verificar de se realmente a valencia não está relacionada a popularidade, verificamos o coeficiente de Spearman (já que não é linear e a amostra é um pouco grande). O resultado abaixo de 0.03 mostra que, de fato, a correlação entre essas duas variáveis é muito fraca, quase inexistente.
[1] 0.03557571
Regressão Logística
Para descobrir o efeito dessas variáveis sobre a música ser popular ou não, foi feito um experimento usando Regressão logística. No caso, nossa variável de interesse é a faixa_popularidade que indica se a música é popular (Popularity >= 50) ou não (Popularity < 50).
Abaixo, a tabela nos mostra que a estimativa o odds é multiplicado por 1.02 de energia, ou seja, aumenta o odds em 2%, logo a música ser mais energética, tem um efeito positivo sobre a variável de resposta. Exemplo: se duas músicas tem diferença de 30 no valor de Energy, (1.02^30) implica num aumento de 1,82 no odds da música ser popular.
Já a variável valence o odds é multiplicado por 0.97, ou seja, diminui o odds em 3%, logo essa variável tem um efeito negativo sobre a variável de resposta. Exemplo: se duas músicas tem diferença de 30 no valor de Valence, (0.97^30) implica num decréscimo de 0.40 no odds da música ser popular.
A variável Danceability multiplica o odds em 1.03, ou seja, aumenta o odds em 3%, logo essa variável tem um efeito positivo sobre a variável de resposta. Exemplo: se duas músicas tem diferença de 30 no valor de Danceability, (1.03^30) implica num aumento de 2.42 no odds da música ser popular.
Assim, a música ser dançante é o fator que mais tem efeito na chance da música ser mais popular no Top 200 das paradas semanais, dentro das variáveis estudadas.
Nesse tipo de análise com regressão logística não temos um R² análogo ao R² da regressão linear. Aqui, temos um pseudo-R² onde usaremos o R² McFadden que é mais ou menos equivalente ao da regressão linear, mas com limitações. Vendo esse dado, temos que o modelo se ajusta aos dados em 0.0599 (5.99%), ou seja, o modelo não se adequa tão bem aos dados.
fitting null model for pseudo-r2
llh llhNull G2 McFadden r2ML
-322.61568161 -343.19346086 41.15555850 0.05995971 0.02628624
r2CU
0.07328125
Abaixo temos a curva estimada da popularidade das músicas de acordo com sua energia em função da valência da música. Podemos observar que, quando a música é lenta a sua popularidade é menor do que se ela for mais feliz. Logo, faixas mais lentas precisam ter muita sofrência para chegar a um nivel de 75 de popularidade. Já em relação a musicas mais energéticas, a popularidade é muito maior, mas a medida que a música tem uma pegada mais feliz, tende a cair a popularidade.

Abaixo, podemos ver o impacto de diferentes valres para Danceability, onde a linha clara são as músicas com menor valor para Danceability e a linha mais escuro o maior valor. Assim, músicas que tem maior valor em Danceability, são mais populares seja em músicas mais lentas ou mais energéticas, independentemente se é mais triste ou feliz.

Em relação aos intervalos de confiança, podemos observar que Valence está completamente abaixo de 1 indicando que essa variável tem efeito negativo e diminui o odds, então diminui a probabilidade da música ser popular. Já Energy tem efeito positivo muito relevante, aumentando o odds, ou seja, aumenta a probabilidade da música ser popular. E, em relação a Danceability, o comportamento é semelhante a Energy, aumentando o odds da música ser popular, com efeito positivo.

Conclusões
Na análise exploratória percebemos que as músicas mais populares eram músicas mais dançantes e energéticas. Além disso, vimos que o fato da música ser mais triste ou mais feliz não indica sua popularidade. Na regressão linear pudemos confirmar essas conclusões, mesmo que o modelo não represente tão bem os dados.
LS0tCnRpdGxlOiAiUG9wdWxhcmlkYWRlIGRhcyBtw7pzaWNhcyBkYSBwbGF5bGlzdCBUb3AgMjAwIGdsb2JhbCBkbyBTcG90aWZ5IgphdXRob3I6ICJKYXJkZWx5IE1hcmlzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgojIyBJbnRyb2R1w6fDo28KCk8gU3BvdGlmeSDDqSB1bSBzZXJ2acOnbyBkaWdpdGFsIHF1ZSBwZXJtaXRlIGFjZXNzbyBhIG1pbGjDtWVzIGRlIG3DunNpY2FzLCBwb2RjYXN0cywgdsOtZGVvcywgZSBvdXRyb3MgY29udGXDumRvcy4gQXR1YWxtZW50ZSwgZWxlIMOpIHVtIGRvcyBzZXJ2acOnb3MgZGUgc3RyZWFtaW5nIGRlIG3DunNpY2EgbWFpcyBwb3B1bGFyIGUgdXNhZG8gbm8gbXVuZG8gZSBkaXNww7VlIGRlIHVtYSBhcGkgYSBxdWFsIHBvZGVtb3MgYWNlc3PDoS1sYSBwYXJhIHRlciBhY2Vzc28gYW9zIGRhZG9zLiAKClNhYmVtb3MgcXVlIGEgcG9wdWxhcmlkYWRlIGRlIHVtYSBtw7pzaWNhIGRlcGVuZGUgZGUgZGl2ZXJzb3MgZmF0b3Jlcy4gTmVzc2UgZXhwZXJpbWVudG8sIGJ1c2NhbW9zIGFuYWxpc2FyIGEgcG9wdWxhcmlkYWRlIGRhcyBtw7pzaWNhcyBxdWUgZXN0w6NvIHF1ZSBlc3RpdmVyYW0gbm8gVG9wIDIwMCBkYXMgcGFyYWRhcyBzZW1hbmFpcyAoZ2xvYmFpcykgZG8gU3BvdGlmeSBlbSAyMDIwIGUgMjAyMSwgc2VndW5kbyBzdWEgZW5lcmdpYSwgdmFsw6puY2lhIGUgZGFuw6dhYmlsaWRhZGUuCgojIyBEYWRvcwoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoaGVyZSkKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KG9wZW5pbnRybykKbGlicmFyeShtb2RlbHIpCmxpYnJhcnkodGlkeW1vZGVscykKbGlicmFyeSh0aWR5cikKbGlicmFyeShwc2NsKQp0aGVtZV9zZXQodGhlbWVfYncoKSkKCmtuaXRyOjpvcHRzX2NodW5rJHNldCh0aWR5ID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBmaWcud2lkdGggPSA2LAogICAgICAgICAgICAgICAgICAgICAgZmlnLmhlaWdodCA9IDUpCgpkYWRvcyA8LSAgcmVhZF9jc3YoInNwb3RpZnlfZGF0YXNldC5jc3YiKQoKZGFkb3MgPC0gZGFkb3MgJT4lIGZpbHRlcighaXMubmEoRW5lcmd5KSAmICFpcy5uYShQb3B1bGFyaXR5KSAmICFpcy5uYShEYW5jZWFiaWxpdHkpICYgIWlzLm5hKFZhbGVuY2UpKSAlPiUKICBtdXRhdGUoZmFpeGFfcG9wdWxhcmlkYWRlID0gaWZlbHNlKFBvcHVsYXJpdHkgPj0gNTAsIlBvcHVsYXIiLCAiTsOjby1Qb3B1bGFyIiksIGZhaXhhX2RhbmNlYWJpbGl0eSA9IGlmZWxzZShEYW5jZWFiaWxpdHkgPiA1MCwiQmFpeGEiLCAiQWx0YSIpLCBmYWl4YV92YWxlbmNlID0gaWZlbHNlKFZhbGVuY2UgPiA1MCwiQmFpeGEiLCAiQWx0YSIpLCBmYWl4YV9lbmVyZ3kgPSBpZmVsc2UoRW5lcmd5ID4gNTAsIkJhaXhhIiwgIkFsdGEiKSkgJT4lCiAgbXV0YXRlKGBSZWxlYXNlIERhdGVgID0gc3RyaW5ncjo6c3RyX2V4dHJhY3QoYFJlbGVhc2UgRGF0ZWAsICJeLns0fSIpLCBWYWxlbmNlID0gVmFsZW5jZSAqIDEwMCwgRW5lcmd5ID0gRW5lcmd5ICogMTAwLCBEYW5jZWFiaWxpdHkgPSBEYW5jZWFiaWxpdHkgKiAxMDApCgoKCmBgYApPIGNvbmp1bnRvIGRlIGRhZG9zIGluY2x1aSB0b2RhcyBhcyBtw7pzaWNhcyBxdWUgZXN0aXZlcmFtIG5vIFRvcCAyMDAgZGFzIHBhcmFkYXMgc2VtYW5haXMgKGdsb2JhaXMpIGRvIFNwb3RpZnkgZW0gMjAyMCBlIDIwMjEuIE5lc3NlIGNvbmp1bnRvIGRlIGRhZG9zLCB0ZW1vcyBkaXZlcnNhcyB2YXJpw6F2ZWlzIHF1ZSBub3MgdHJhemVtIGluZm9ybWHDp8O1ZXMgc29icmUgbyBub21lIGRhIG3DunNpY2EsIG9zIGFydGlzdGFzLCBxdWFudGFzIHZlemVzIGEgbcO6c2ljYSBmaWNvdSBubyBUb3AgMjAwIGUgZW0gcXVhaXMgc2VtYW5hcywgc3RyZWFtcywgbsO6bWVybyBkZSBzZWd1aWRvcmVzIGRvIGFydGlzdGEsIGfDqm5lcm8sIHBvcHVsYXJpZGFkZSwgbyBxdWFudG8gYSBtw7pzaWNhIMOpIGFkZXF1YWRhIHBhcmEgZGFuw6dhciwgZXRjLgpBcXVpLCBxdWVyZW1vcyBzYWJlciBvIHF1ZSBsZXZhIHVtYSBtw7pzaWNhIGEgc2VyIHBvcHVsYXIgZSBjb21vIGFsZ3VtYXMgdmFyacOhdmVpcyBlc3TDo28gcmVsYWNpb25hZGFzIGNvbSBlc3NhIHBvcHVsYXJpZGFkZS4gUGFyYSBpc3NvLCB1c2FyZW1vcyBhcyBzZWd1aW50ZXMgdmFyacOhdmVpczoKCiogUG9wdWxhcml0eTogYSBwb3B1bGFyaWRhZGUgZGEgZmFpeGEuIE8gdmFsb3IgZXN0YXLDoSBlbnRyZSAwIGUgMTAwLCBzZW5kbyAxMDAgbyBtYWlzIHBvcHVsYXIuCiogRGFuY2VhYmlsaXR5OiBkZXNjcmV2ZSBjb21vIHVtYSBmYWl4YSDDqSBhZGVxdWFkYSBwYXJhIGRhbsOnYXIgY29tIGJhc2UgZW0gdW1hIGNvbWJpbmHDp8OjbyBkZSBlbGVtZW50b3MgbXVzaWNhaXMgaW5jbHVpbmRvIHRlbXBvLCBlc3RhYmlsaWRhZGUgZGUgcml0bW8sIGZvcsOnYSBkZSBiYXRpZGEgZSByZWd1bGFyaWRhZGUgZ2VyYWwuIFVtIHZhbG9yIGRlIDAsMCDDqSBtZW5vcyBkYW7Dp8OhdmVsIGUgMSwwIMOpIG1haXMgZGFuw6dhbnRlLgoqIFZhbGVuY3k6IMOpIHVtYSBtZWRpZGEgZGUgMCwwIGEgMSwwIHF1ZSBkZXNjcmV2ZSBhIHBvc2l0aXZpZGFkZSBtdXNpY2FsIHRyYW5zbWl0aWRhIHBvciB1bWEgZmFpeGEuIEZhaXhhcyBjb20gYWx0YSB2YWzDqm5jaWEgc29hbSBtYWlzIHBvc2l0aXZhcyAocG9yIGV4ZW1wbG8sIGZlbGl6LCBhbGVncmUsIGV1ZsOzcmljbyksIGVucXVhbnRvIGZhaXhhcyBjb20gYmFpeGEgdmFsw6puY2lhIHNvYW0gbWFpcyBuZWdhdGl2YXMgKHBvciBleGVtcGxvLCB0cmlzdGUsIGRlcHJpbWlkbywgY29tIHJhaXZhKS4KKiBFbmVyZ3k6IMOpIHVtYSBtZWRpZGEgZGUgMCwwIGEgMSwwIGUgcmVwcmVzZW50YSB1bWEgbWVkaWRhIHBlcmNlbnR1YWwgZGUgaW50ZW5zaWRhZGUgZSBhdGl2aWRhZGUuIAoKRXNzYXMgdmFyacOhdmVpcyBwYXNzYXJhbSBwb3IgcHJvY2Vzc2FtZW50byBlIGVzdMOjbyBlbSBwb3JjZW50YWdlbS4KCk9zIGRhZG9zIHBvZGVtIHNlciBlbmNvbnRyYWRvcyBlbTogaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9zYXNoYW5rcGlsbGFpL3Nwb3RpZnktdG9wLTIwMC1jaGFydHMtMjAyMDIwMjEKCiMjIEFuw6FsaXNlIEV4cGxvcmF0w7NyaWEKCkFiYWl4byBwb2RlbW9zIHZpc3VhbGl6YXIgYWxndW5zIHN1bcOhcmlvcyBjb21vIG8gdmFsb3IgbcOheGltbyBkZSBwb3B1bGFyaWRhZGUgZGFzIG3DunNpY2FzIHF1ZSDDqSAxMDAsIGEgbWVkaWFuYSBxdWUgw6kgNzMgaW5kaWNhbmRvIHF1ZSBhIG1haW9yIHBhcnRlIGRhcyBtw7pzaWNhcyBzw6NvIG11aXRvIHBvcHVsYXJlcyBlIGEgbcOpZGlhIGRlIDcwLDA4IHJlZm9yw6dhIGlzc28gYWluZGEgbWFpcy4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdW1hcmlvcyA9IGRhZG9zICU+JQogIHN1bW1hcmlzZShwb3BfbWF4ID0gbWF4KFBvcHVsYXJpdHkpLAogICAgICAgICAgICBtZWRpYW5hID0gbWVkaWFuKFBvcHVsYXJpdHkpLAogICAgICAgICAgICBtaW4gPSBtaW4oUG9wdWxhcml0eSksCiAgICAgICAgICAgIG1lZGlhID0gbWVhbihQb3B1bGFyaXR5KSkKZ2xpbXBzZShzdW1hcmlvcykKYGBgCgpPIGdyw6FmaWNvIGFiYWl4byBtb3N0cmEgY29tbyBlc3TDoSBkaXN0cmlidcOtZGEgYSB2YXJpw6F2ZWwgRGFuY2VhYmlsaXR5IGVtIHJlbGHDp8OjbyBhIHBvcHVsYXJpZGFkZS4gTmVsZSwgcG9kZW1vcyB2ZXIgY2xhcmFtZW50ZSBxdWUgYXMgbcO6c2ljYXMgbWFpcyBwb3B1bGFyZXMgc8OjbyBhcyBtYWlzIGRhbsOnYW50ZXMsIGrDoSBxdWUgb3MgdmFsb3JlcyBtYWlzIGFsdG9zIGRlIERhbmNlYWJpbGl0eSBlc3TDo28gYWNpbWEgZGUgNTAuIE3DunNpY2FzIHF1ZSBzw6NvIG1lbm9zIHBvcHVsYXJlcyBzw6NvIG1lbm9zIGRhbsOnYW50ZSB0YW1iw6ltLiBOZXNzYSBjYXRlZ29yaWEgZGUgbcO6c2ljYXMgb3MgZGFkb3Mgc8OjbyBkaXNwZXJzb3MuIEVtIGNvbnRyYXBhcnRpZGEsIG9zIHZhbG9yZXMgZGUgZmFpeGFzIG1haXMgcG9wdWxhcmVzIHPDo28gbWFpcyBjb25jZW50cmFkb3MgZSBmaWNhbSBtYWlzIGRpc3BlcnNvcyBhIG1lZGlkYSBxdWUgYSBwb3B1bGFyaWRhZGUgYXVtZW50YS4gT3UgcG9udG8gaW1wb3J0YW50ZSDDqSBhIG1lZGlhbmEgw6kgdW0gdmFsb3IgYWx0byBlIGlzc28gaW5kaWNhIHF1ZSBlc3NhIHBsYXlsaXN0IGNvbnRhIGNvbSBhIG1haW9yIHBhcnRlIGRhcyBtw7pzaWNhcyBzZW5kbyBtdWl0byBwb3B1bGFyZXMuIEFsw6ltIGRpc3NvLCBhcyBtw7pzaWNhcyBwb3B1bGFyZXMgc8OjbyBiZW0gZGFuw6dhbnRlcy4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJyxmaWcua2VlcD0nYWxsJ30KCmRhZG9zICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBQb3B1bGFyaXR5LCB5ID0gRGFuY2VhYmlsaXR5KSkgICsgCiAgICAgIGdlb21fc21vb3RoKHNpemUgPSAxLCBjb2xvciA9ICJvcmFuZ2UiKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRhZG9zJFBvcHVsYXJpdHkpLCAgY29sb3IgPSdyZWQnKSAKICAjZmFjZXRfd3JhcCh+IGZhaXhhX3BvcHVsYXJpZGFkZSwgbmNvbCA9IDEpIAogICMgZ2VvbV90ZXh0KCkgKyAKICAgICAgI3NjYWxlX3lfbG9nMTAoKSArIAogICAgICAjZ2VvbV9ydWcoKQpgYGAKCgoKTyBncsOhZmljbyBhYmFpeG8gbW9zdHJhIGNvbW8gZXN0w6EgZGlzdHJpYnXDrWRhIGEgdmFyacOhdmVsIEVuZXJneSBlbSByZWxhw6fDo28gYSBwb3B1bGFyaWRhZGUuIE5lbGUsIHBvZGVtb3MgdmVyIGNsYXJhbWVudGUgcXVlIGFzIG3DunNpY2FzIG1haXMgcG9wdWxhcmVzIHPDo28gYXMgbWFpcyBhZ2l0YWRhcywgasOhIHF1ZSBvcyB2YWxvcmVzIG1haXMgYWx0b3MgZGUgRW5lcmd5IGVzdMOjbyBhY2ltYSBkZSA1MC4gT3MgdmFsb3JlcyBkYSB2YXJpw6F2ZWwgRW5lcmd5IHNlIGNvb21wb3J0YW0gZGUgZm9ybWEgc2VtZWxoYW50ZSBhb3MgdmFsb3JlcyBkYSB2YXJpw6F2ZWwgRGFuY2VhYmlsaXR5LiBPIHNlbnNvIGNvbXVtIHNvYnJlIGlzc28gw6kgcXVlIHVtYSBtw7pzaWNhIG1haXMgYWdpdGFkYSBpbmRpY2EgcXVlIGVsYSDDqSBtYWlzIGRhbsOnYW50ZSwgYXNzaW0gY29tbyB1bWEgbcO6c2ljYSBtYWlzIGxlbnRhIHRlbmRlIGEgc2VyIG1lbm9zIGRhbsOnYW50ZS4gUG9yw6ltLCBzZSBvYnNlcnZhcm1vcyB2YWxvcmVzIGRlIHBvcHVsYXJpZGFkZSBwcsOzeGltb3MgYSAxMDAsIG5vdGFtb3MgcXVlIG9zIHZhbG9yZXMgc8OjbyBtYWlzIGRpc3BlcnNvcyB0YW50byBlbSBFbmVyZ3kgcXVhbnRvIGVtIERhbmNlYWJpbGl0eS4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsZmlnLmtlZXA9J2FsbCd9CmRhZG9zICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBQb3B1bGFyaXR5LCB5ID0gRW5lcmd5KSkgICsgCiAgZ2VvbV9zbW9vdGgoc2l6ZSA9IDEsIGNvbG9yID0gInB1cnBsZSIpKwogICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtZWRpYW4oZGFkb3MkUG9wdWxhcml0eSksICBjb2xvciA9J3JlZCcpIAogICNmYWNldF93cmFwKH4gZmFpeGFfcG9wdWxhcmlkYWRlLCBuY29sID0gMSkgKwogICAgICAgICAjIGdlb21fdGV4dCgpICsgCiAgICAgICNzY2FsZV95X2xvZzEwKCkgKyAKICAgICAgI2dlb21fcnVnKCkKYGBgCgoKTyBncsOhZmljbyBhYmFpeG8gbW9zdHJhIGNvbW8gZXN0w6EgZGlzdHJpYnXDrWRhIGEgdmFyacOhdmVsIFZhbGVuY2UgZW0gcmVsYcOnw6NvIGEgcG9wdWxhcmlkYWRlLiBOZWxlLCBwb2RlbW9zIHZlciBxdWUgb3MgdmFsb3JlcyBwYXJhIG3DunNpY2FzIG1lbm9zIHBvcHVsYXJlcyBzw6NvIG11aXRvIGRpc3BlcnNvcyBpbmRpY2FuZG8gcXVlIGEgcG91Y2EgcG9wdWxhcmlkYWRlIGNvbnTDqW0gbcO6c2ljYXMgdHJpc3RlcyBlIGZlbGl6ZXMuIEVudHJldGFudG8gYSBtw6lkaWEgZGUgdmFsZW5jaWEgc2VndWUgYWNpbWEgNTAgZW0gdG9kbyBvIGdyw6FmaWNvLiBQYXJhIG3DunNpY2FzIG1haXMgcG9wdWxhcmVzIGEgdmFsZW5jaWEgdGFtYsOpbSB2YXJpYSBtdWl0by4gSXNzbyBpbmRpY2EgcXVlIGEgcG9wdWxhcmlkYWRlIGRlIHVtYSBtw7pzaWNhIGluZGVwZW5kZSBkZWxhIHNlciBtYWlzIGZlbGl6IG91IG1haXMgdHJpc3RlLiAgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCByZXN1bHRzPSdoaWRlJyxmaWcua2VlcD0nYWxsJ30KZGFkb3MgJT4lIAogIGdncGxvdChhZXMoeCA9IFBvcHVsYXJpdHksIHkgPSBWYWxlbmNlKSkgICsgCiAgICAgIGdlb21fc21vb3RoKHNpemUgPSAxLCBjb2xvciA9ICJjb3JhbCIpICsKICAjZmFjZXRfd3JhcCh+IGZhaXhhX3BvcHVsYXJpZGFkZSwgbmNvbCA9IDEpICsKICAgICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVhbihkYWRvcyRQb3B1bGFyaXR5KSwgIGNvbG9yID0nYmx1ZScpIAogICAgICAjIGdlb21fdGV4dCgpICsgCiAgICAgICNzY2FsZV95X2xvZzEwKCkgKyAKICAgICAgI2dlb21fcnVnKCkKYGBgCgpQYXJhIHZlcmlmaWNhciBkZSBzZSByZWFsbWVudGUgYSB2YWxlbmNpYSBuw6NvIGVzdMOhIHJlbGFjaW9uYWRhIGEgcG9wdWxhcmlkYWRlLCB2ZXJpZmljYW1vcyBvIGNvZWZpY2llbnRlIGRlIFNwZWFybWFuIChqw6EgcXVlIG7Do28gw6kgbGluZWFyIGUgYSBhbW9zdHJhIMOpIHVtIHBvdWNvIGdyYW5kZSkuIE8gcmVzdWx0YWRvIGFiYWl4byAgZGUgMC4wMyBtb3N0cmEgcXVlLCBkZSBmYXRvLCBhIGNvcnJlbGHDp8OjbyBlbnRyZSBlc3NhcyBkdWFzIHZhcmnDoXZlaXMgw6kgbXVpdG8gZnJhY2EsIHF1YXNlIGluZXhpc3RlbnRlLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KY29yKGRhZG9zJFZhbGVuY2UsIGRhZG9zJFBvcHVsYXJpdHksIG1ldGhvZCA9ICJzcGVhcm1hbiIpCmBgYAojIyBSZWdyZXNzw6NvIExvZ8Otc3RpY2EKClBhcmEgZGVzY29icmlyIG8gZWZlaXRvIGRlc3NhcyB2YXJpw6F2ZWlzIHNvYnJlIGEgbcO6c2ljYSBzZXIgcG9wdWxhciBvdSBuw6NvLCBmb2kgZmVpdG8gdW0gZXhwZXJpbWVudG8gdXNhbmRvIFJlZ3Jlc3PDo28gbG9nw61zdGljYS4gTm8gY2Fzbywgbm9zc2EgdmFyacOhdmVsIGRlIGludGVyZXNzZSDDqSBhIGZhaXhhX3BvcHVsYXJpZGFkZSBxdWUgaW5kaWNhIHNlIGEgbcO6c2ljYSDDqSBwb3B1bGFyIChQb3B1bGFyaXR5ID49IDUwKSBvdSBuw6NvIChQb3B1bGFyaXR5IDwgNTApLgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsZmlnLmtlZXA9J2FsbCd9CmEgPC0gZGFkb3MgJT4lIG11dGF0ZShmYWl4YV9wb3B1bGFyaWRhZGUgPSBpZmVsc2UoZmFpeGFfcG9wdWxhcmlkYWRlID09IlBvcHVsYXIiLCAxLCAwKSkKYm0gPC0gZ2xtKGZhaXhhX3BvcHVsYXJpZGFkZSB+IEVuZXJneSArIFZhbGVuY2UgKyBEYW5jZWFiaWxpdHksIAogICAgICAgICAgZGF0YSA9IGEsIAogICAgICAgICAgZmFtaWx5ID0gImJpbm9taWFsIikKCgoKYGBgCkFiYWl4bywgYSB0YWJlbGEgbm9zIG1vc3RyYSBxdWUgYSBlc3RpbWF0aXZhIG8gb2RkcyDDqSBtdWx0aXBsaWNhZG8gcG9yIDEuMDIgZGUgZW5lcmdpYSwgb3Ugc2VqYSwgYXVtZW50YSBvIG9kZHMgZW0gMiUsIGxvZ28gYSBtw7pzaWNhIHNlciBtYWlzIGVuZXJnw6l0aWNhLCB0ZW0gdW0gZWZlaXRvIHBvc2l0aXZvIHNvYnJlIGEgdmFyacOhdmVsIGRlIHJlc3Bvc3RhLiBFeGVtcGxvOiBzZSBkdWFzIG3DunNpY2FzIHRlbSBkaWZlcmVuw6dhIGRlIDMwIG5vIHZhbG9yIGRlIEVuZXJneSwgKDEuMDJeMzApIGltcGxpY2EgbnVtIGF1bWVudG8gZGUgMSw4MiBubyBvZGRzIGRhIG3DunNpY2Egc2VyIHBvcHVsYXIuICAKCkrDoSBhIHZhcmnDoXZlbCB2YWxlbmNlIG8gb2RkcyDDqSBtdWx0aXBsaWNhZG8gcG9yIDAuOTcsIG91IHNlamEsIGRpbWludWkgbyBvZGRzIGVtIDMlLCBsb2dvIGVzc2EgdmFyacOhdmVsIHRlbSB1bSBlZmVpdG8gbmVnYXRpdm8gc29icmUgYSB2YXJpw6F2ZWwgZGUgcmVzcG9zdGEuIEV4ZW1wbG86IHNlIGR1YXMgbcO6c2ljYXMgdGVtIGRpZmVyZW7Dp2EgZGUgMzAgbm8gdmFsb3IgZGUgVmFsZW5jZSwgKDAuOTdeMzApIGltcGxpY2EgbnVtIGRlY3LDqXNjaW1vIGRlIDAuNDAgbm8gb2RkcyBkYSBtw7pzaWNhIHNlciBwb3B1bGFyLiAgCgpBIHZhcmnDoXZlbCBEYW5jZWFiaWxpdHkgbXVsdGlwbGljYSBvIG9kZHMgZW0gMS4wMywgb3Ugc2VqYSwgYXVtZW50YSBvIG9kZHMgZW0gMyUsIGxvZ28gZXNzYSB2YXJpw6F2ZWwgdGVtIHVtIGVmZWl0byBwb3NpdGl2byBzb2JyZSBhIHZhcmnDoXZlbCBkZSByZXNwb3N0YS4gRXhlbXBsbzogc2UgZHVhcyBtw7pzaWNhcyB0ZW0gZGlmZXJlbsOnYSBkZSAzMCBubyB2YWxvciBkZSBEYW5jZWFiaWxpdHksICgxLjAzXjMwKSBpbXBsaWNhIG51bSBhdW1lbnRvIGRlIDIuNDIgbm8gb2RkcyBkYSBtw7pzaWNhIHNlciBwb3B1bGFyLiAgCgpBc3NpbSwgYSBtw7pzaWNhIHNlciBkYW7Dp2FudGUgw6kgbyBmYXRvciBxdWUgbWFpcyB0ZW0gZWZlaXRvIG5hIGNoYW5jZSBkYSBtw7pzaWNhIHNlciBtYWlzIHBvcHVsYXIgbm8gVG9wIDIwMCBkYXMgcGFyYWRhcyBzZW1hbmFpcywgZGVudHJvIGRhcyB2YXJpw6F2ZWlzIGVzdHVkYWRhcy4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0aWR5KGJtLCBjb25mLmludCA9IFRSVUUsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JSBzZWxlY3QoLXAudmFsdWUpCgpgYGAKCk5lc3NlIHRpcG8gZGUgYW7DoWxpc2UgY29tIHJlZ3Jlc3PDo28gbG9nw61zdGljYSBuw6NvIHRlbW9zIHVtIFLCsiBhbsOhbG9nbyBhbyBSwrIgZGEgcmVncmVzc8OjbyBsaW5lYXIuIEFxdWksIHRlbW9zIHVtIHBzZXVkby1SwrIgb25kZSB1c2FyZW1vcyBvIFLCsiBNY0ZhZGRlbiBxdWUgw6kgbWFpcyBvdSBtZW5vcyBlcXVpdmFsZW50ZSBhbyBkYSByZWdyZXNzw6NvIGxpbmVhciwgbWFzIGNvbSBsaW1pdGHDp8O1ZXMuIFZlbmRvIGVzc2UgZGFkbywgdGVtb3MgcXVlIG8gbW9kZWxvIHNlIGFqdXN0YSBhb3MgZGFkb3MgZW0gMC4wNTk5ICg1Ljk5JSksIG91IHNlamEsIG8gbW9kZWxvIG7Do28gc2UgYWRlcXVhIHTDo28gYmVtIGFvcyBkYWRvcy4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcFIyKGJtKQpgYGAKCkFiYWl4byB0ZW1vcyBhIGN1cnZhIGVzdGltYWRhIGRhIHBvcHVsYXJpZGFkZSBkYXMgbcO6c2ljYXMgZGUgYWNvcmRvIGNvbSBzdWEgZW5lcmdpYSBlbSBmdW7Dp8OjbyBkYSB2YWzDqm5jaWEgZGEgbcO6c2ljYS4gUG9kZW1vcyBvYnNlcnZhciBxdWUsIHF1YW5kbyBhIG3DunNpY2Egw6kgbGVudGEgYSBzdWEgcG9wdWxhcmlkYWRlIMOpIG1lbm9yIGRvIHF1ZSBzZSBlbGEgZm9yIG1haXMgZmVsaXouIExvZ28sIGZhaXhhcyBtYWlzIGxlbnRhcyBwcmVjaXNhbSB0ZXIgbXVpdGEgc29mcsOqbmNpYSBwYXJhIGNoZWdhciBhIHVtIG5pdmVsIGRlIDc1IGRlIHBvcHVsYXJpZGFkZS4gCkrDoSBlbSByZWxhw6fDo28gYSBtdXNpY2FzIG1haXMgZW5lcmfDqXRpY2FzLCBhIHBvcHVsYXJpZGFkZSDDqSBtdWl0byBtYWlvciwgbWFzIGEgbWVkaWRhIHF1ZSBhIG3DunNpY2EgdGVtIHVtYSBwZWdhZGEgbWFpcyBmZWxpeiwgdGVuZGUgYSBjYWlyIGEgcG9wdWxhcmlkYWRlLiAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm0gPSBhICU+JQogIGRhdGFfZ3JpZChFbmVyZ3kgPSBzZXFfcmFuZ2UoRW5lcmd5LCAyKSAsIAogICAgICAgICAgICBWYWxlbmNlID0gc2VxX3JhbmdlKFZhbGVuY2UsIDEwKSAsCiAgICAgICAgICAgIERhbmNlYWJpbGl0eT0gc2VxX3JhbmdlKERhbmNlYWJpbGl0eSwgMSkpCgptbSA9IGF1Z21lbnQoYm0sIAogICAgICAgICAgICAgbmV3ZGF0YSA9IG0sIAogICAgICAgICAgICAgdHlwZS5wcmVkaWN0ID0gInJlc3BvbnNlIikKCmdncGxvdChtbSwgYWVzKHggPSBWYWxlbmNlLCBjb2xvdXIgPSBmYWN0b3IoRGFuY2VhYmlsaXR5KSkpICsgCiAgZ2VvbV9saW5lKGFlcyh5ID0gLmZpdHRlZCkpICsgIAogIGZhY2V0X2dyaWQoLn4gcmVvcmRlcihFbmVyZ3ksIC5maXR0ZWQpKSArIAogICNzY2FsZV9jb2xvcl9icmV3ZXIoKSArCiAgTlVMTAoKYGBgCgpBYmFpeG8sIHBvZGVtb3MgdmVyIG8gaW1wYWN0byBkZSBkaWZlcmVudGVzIHZhbHJlcyBwYXJhIERhbmNlYWJpbGl0eSwgb25kZSBhIGxpbmhhIGNsYXJhIHPDo28gYXMgbcO6c2ljYXMgY29tIG1lbm9yIHZhbG9yIHBhcmEgRGFuY2VhYmlsaXR5IGUgYSBsaW5oYSBtYWlzIGVzY3VybyBvIG1haW9yIHZhbG9yLiBBc3NpbSwgbcO6c2ljYXMgcXVlIHRlbSBtYWlvciB2YWxvciBlbSBEYW5jZWFiaWxpdHksIHPDo28gbWFpcyBwb3B1bGFyZXMgc2VqYSBlbSBtw7pzaWNhcyBtYWlzIGxlbnRhcyBvdSBtYWlzIGVuZXJnw6l0aWNhcywgaW5kZXBlbmRlbnRlbWVudGUgc2Ugw6kgbWFpcyB0cmlzdGUgb3UgZmVsaXouCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9Cm0gPSBhICU+JQogIGRhdGFfZ3JpZChFbmVyZ3kgPSBzZXFfcmFuZ2UoRW5lcmd5LCAyKSAsIAogICAgICAgICAgICBWYWxlbmNlID0gc2VxX3JhbmdlKFZhbGVuY2UsIDEwKSAsCiAgICAgICAgICAgIERhbmNlYWJpbGl0eT0gc2VxX3JhbmdlKERhbmNlYWJpbGl0eSwgNSkpCgptbSA9IGF1Z21lbnQoYm0sIAogICAgICAgICAgICAgbmV3ZGF0YSA9IG0sIAogICAgICAgICAgICAgdHlwZS5wcmVkaWN0ID0gInJlc3BvbnNlIikKCmdncGxvdChtbSwgYWVzKHggPSBWYWxlbmNlLCBjb2xvdXIgPSBmYWN0b3IoRGFuY2VhYmlsaXR5KSkpICsgCiAgZ2VvbV9saW5lKGFlcyh5ID0gLmZpdHRlZCkpICsgIAogIGZhY2V0X2dyaWQoLn4gcmVvcmRlcihFbmVyZ3ksIC5maXR0ZWQpKSArIAogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gMTYpICsKICBOVUxMCgpgYGAKCkVtIHJlbGHDp8OjbyBhb3MgaW50ZXJ2YWxvcyBkZSBjb25maWFuw6dhLCBwb2RlbW9zIG9ic2VydmFyIHF1ZSBWYWxlbmNlIGVzdMOhIGNvbXBsZXRhbWVudGUgYWJhaXhvIGRlIDEgaW5kaWNhbmRvIHF1ZSBlc3NhIHZhcmnDoXZlbCB0ZW0gZWZlaXRvIG5lZ2F0aXZvIGUgZGltaW51aSBvIG9kZHMsIGVudMOjbyBkaW1pbnVpIGEgcHJvYmFiaWxpZGFkZSBkYSBtw7pzaWNhIHNlciBwb3B1bGFyLiBKw6EgRW5lcmd5IHRlbSBlZmVpdG8gcG9zaXRpdm8gbXVpdG8gcmVsZXZhbnRlLCBhdW1lbnRhbmRvIG8gb2Rkcywgb3Ugc2VqYSwgYXVtZW50YSBhIHByb2JhYmlsaWRhZGUgZGEgbcO6c2ljYSBzZXIgcG9wdWxhci4gRSwgZW0gcmVsYcOnw6NvIGEgRGFuY2VhYmlsaXR5LCBvIGNvbXBvcnRhbWVudG8gw6kgc2VtZWxoYW50ZSBhIEVuZXJneSwgYXVtZW50YW5kbyBvIG9kZHMgZGEgbcO6c2ljYSBzZXIgcG9wdWxhciwgY29tIGVmZWl0byBwb3NpdGl2by4gCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp0aWR5KGJtLCBjb25mLmludCA9IFRSVUUsIGV4cG9uZW50aWF0ZSA9IFRSVUUpICU+JSAKICBmaWx0ZXIodGVybSAhPSAiKEludGVyY2VwdCkiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gdGVybSwgeSA9IGVzdGltYXRlLCB5bWluID0gY29uZi5sb3csIHltYXggPSBjb25mLmhpZ2gpKSArIAogIGdlb21fcG9pbnQoKSArIAogIGdlb21fbGluZXJhbmdlKCkgKyAKICBjb29yZF9mbGlwKCkKYGBgCgojIyMgQ29uY2x1c8O1ZXMKCk5hIGFuw6FsaXNlIGV4cGxvcmF0w7NyaWEgcGVyY2ViZW1vcyBxdWUgYXMgbcO6c2ljYXMgbWFpcyBwb3B1bGFyZXMgZXJhbSBtw7pzaWNhcyBtYWlzIGRhbsOnYW50ZXMgZSBlbmVyZ8OpdGljYXMuIEFsw6ltIGRpc3NvLCB2aW1vcyBxdWUgbyBmYXRvIGRhIG3DunNpY2Egc2VyIG1haXMgdHJpc3RlIG91IG1haXMgZmVsaXogbsOjbyBpbmRpY2Egc3VhIHBvcHVsYXJpZGFkZS4gTmEgcmVncmVzc8OjbyBsaW5lYXIgcHVkZW1vcyBjb25maXJtYXIgZXNzYXMgY29uY2x1c8O1ZXMsIG1lc21vIHF1ZSBvIG1vZGVsbyBuw6NvIHJlcHJlc2VudGUgdMOjbyBiZW0gb3MgZGFkb3MuIA==