#!/bin/bash
# instala-gateway.sh - gateway.py corrigido (Python 3.9 + slowapi + body JSON)
# Uso:  bash instala-gateway.sh  &&  systemctl restart assistant
set -e
DEST=/var/www/html/assistant/gateway.py
cp "$DEST" "$DEST.bak.$(date +%s)" 2>/dev/null || true
base64 -d > "$DEST" << 'FIM_B64'
IyBnYXRld2F5LnB5IOKAlCBGYXN0QVBJICsgTW9vZGxlICsgR2VtaW5pICsgUkFHICh2ZXJzw6NvIHJlZm9yw6dhZGEpCiMKIyBOb3ZpZGFkZXMgZmFjZSDDoCB2ZXJzw6NvIGFudGVyaW9yOgojICAgMS4gUmF0ZSBsaW1pdGluZyBwb3IgSVAgKHNsb3dhcGkpICAgICAgICAgICAgLT4gdHJhdmEgYWJ1c28vc2NyaXB0cyBhdXRvbcOhdGljb3MKIyAgIDIuIFNlZ3JlZG8gaW50ZXJubyBwYXJ0aWxoYWRvIChYLUFzc2lzdGFudC1TZWNyZXQpIC0+IHPDsyBvIHByb3h5IFBIUCBkbyBNb29kbGUgY2hhbWEKIyAgIDMuIFN1cG9ydGUgYSBoaXN0w7NyaWNvIGRlIGNvbnZlcnNhICAgICAgICAgICAtPiB0dXRvciBjb20gIm1lbcOzcmlhIiBjdXJ0YQojCiMgUmVxdWlzaXRvcyBleHRyYToKIyAgIHBpcCBpbnN0YWxsIHNsb3dhcGkKIwojIC5lbnYg4oCUIGFjcmVzY2VudGE6CiMgICBJTlRFUk5BTF9TRUNSRVQ9InVtYS1mcmFzZS1sb25nYS1hbGVhdG9yaWEtYXF1aSIgICAjIGdlcmEgY29tOiBvcGVuc3NsIHJhbmQgLWhleCAzMgoKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgbG9nZ2luZwpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKCmltcG9ydCByZXF1ZXN0cwpmcm9tIGRvdGVudiBpbXBvcnQgbG9hZF9kb3RlbnYKCmZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbiwgUmVxdWVzdCwgSGVhZGVyCmZyb20gZmFzdGFwaS5taWRkbGV3YXJlLmNvcnMgaW1wb3J0IENPUlNNaWRkbGV3YXJlCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbCwgTGlzdApmcm9tIHB5ZGFudGljIGltcG9ydCBCYXNlTW9kZWwKCmZyb20gc2xvd2FwaSBpbXBvcnQgTGltaXRlciwgX3JhdGVfbGltaXRfZXhjZWVkZWRfaGFuZGxlcgpmcm9tIHNsb3dhcGkudXRpbCBpbXBvcnQgZ2V0X3JlbW90ZV9hZGRyZXNzCmZyb20gc2xvd2FwaS5lcnJvcnMgaW1wb3J0IFJhdGVMaW1pdEV4Y2VlZGVkCgpmcm9tIHJhZyBpbXBvcnQgUmV0cmlldmVyCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQ09ORklHCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQkFTRV9ESVIgPSBQYXRoKF9fZmlsZV9fKS5yZXNvbHZlKCkucGFyZW50CmxvYWRfZG90ZW52KEJBU0VfRElSIC8gIi5lbnYiKQoKTU9ERUxfQVBJX1VSTCA9IG9zLmdldGVudigiTU9ERUxfQVBJX1VSTCIsICIiKS5zdHJpcCgpCk1PREVMX0FQSV9LRVkgPSBvcy5nZXRlbnYoIk1PREVMX0FQSV9LRVkiLCAiIikuc3RyaXAoKQoKTU9ERUxfTkFNRSA9IG9zLmdldGVudigKICAgICJNT0RFTF9NT0RFTCIsCiAgICBvcy5nZXRlbnYoIk1PREVMX05BTUUiLCAiZ2VtaW5pLTIuNS1mbGFzaCIpCikuc3RyaXAoKQoKUkVRVUVTVF9USU1FT1VUID0gaW50KG9zLmdldGVudigiUkVRVUVTVF9USU1FT1VUIiwgIjMwIikpCgpBTExPV0VEX09SSUdJTlMgPSBbCiAgICB4LnN0cmlwKCkKICAgIGZvciB4IGluIG9zLmdldGVudigiQUxMT1dFRF9PUklHSU5TIiwgIioiKS5zcGxpdCgiLCIpCiAgICBpZiB4LnN0cmlwKCkKXQoKIyBTZWdyZWRvIHBhcnRpbGhhZG8gZW50cmUgbyBwcm94eSBQSFAgKE1vb2RsZSkgZSBlc3RlIGdhdGV3YXkuCiMgU2UgZXN0aXZlciB2YXppbywgYSB2ZXJpZmljYcOnw6NvIMOpIERFU0xJR0FEQSAobW9kbyBkZSB0cmFuc2nDp8OjbykuCklOVEVSTkFMX1NFQ1JFVCA9IG9zLmdldGVudigiSU5URVJOQUxfU0VDUkVUIiwgIiIpLnN0cmlwKCkKCiMgTGltaXRlIGRlIHBlZGlkb3MgcG9yIElQLiBBanVzdGEgw6AgdHVhIHR1cm1hLgpSQVRFX0xJTUlUID0gb3MuZ2V0ZW52KCJSQVRFX0xJTUlUIiwgIjIwL21pbnV0ZSIpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTE9HR0lORwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmxvZ2dpbmcuYmFzaWNDb25maWcoCiAgICBsZXZlbD1sb2dnaW5nLklORk8sCiAgICBmb3JtYXQ9IiUoYXNjdGltZSlzIFslKGxldmVsbmFtZSlzXSAlKG1lc3NhZ2UpcyIsCikKCmxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJhc3Npc3RhbnQiKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEZBU1RBUEkgKyBSQVRFIExJTUlURVIKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpsaW1pdGVyID0gTGltaXRlcihrZXlfZnVuYz1nZXRfcmVtb3RlX2FkZHJlc3MpCgphcHAgPSBGYXN0QVBJKAogICAgdGl0bGU9IkFzc2lzdGFudCBHYXRld2F5IiwKICAgIHZlcnNpb249IjIuMC4wIiwKKQoKYXBwLnN0YXRlLmxpbWl0ZXIgPSBsaW1pdGVyCmFwcC5hZGRfZXhjZXB0aW9uX2hhbmRsZXIoUmF0ZUxpbWl0RXhjZWVkZWQsIF9yYXRlX2xpbWl0X2V4Y2VlZGVkX2hhbmRsZXIpCgphcHAuYWRkX21pZGRsZXdhcmUoCiAgICBDT1JTTWlkZGxld2FyZSwKICAgIGFsbG93X29yaWdpbnM9QUxMT1dFRF9PUklHSU5TIGlmIEFMTE9XRURfT1JJR0lOUyBlbHNlIFsiKiJdLAogICAgYWxsb3dfY3JlZGVudGlhbHM9VHJ1ZSwKICAgIGFsbG93X21ldGhvZHM9WyIqIl0sCiAgICBhbGxvd19oZWFkZXJzPVsiKiJdLAopCgpzZXNzaW9uID0gcmVxdWVzdHMuU2Vzc2lvbigpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUkVRVUVTVCBNT0RFTAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmNsYXNzIFR1cm4oQmFzZU1vZGVsKToKICAgIHJvbGU6IHN0ciA9ICIiCiAgICBjb250ZW50OiBzdHIgPSAiIgoKCmNsYXNzIENoYXRSZXF1ZXN0KEJhc2VNb2RlbCk6CiAgICBjb3Vyc2VpZDogaW50CiAgICBxdWVzdGlvbjogc3RyCiAgICBjb3Vyc2VfbmFtZTogc3RyID0gIkN1cnNvIE1vb2RsZSIKICAgIGhpc3Rvcnk6IExpc3RbVHVybl0gPSBbXSAgICMgb3BjaW9uYWw7IGVudmlhZG8gcGVsbyB3aWRnZXQKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTRUdVUkFOw4dBIOKAlCBzZWdyZWRvIGludGVybm8KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgdmVyaWZ5X2ludGVybmFsX3NlY3JldCh4X2Fzc2lzdGFudF9zZWNyZXQ6IE9wdGlvbmFsW3N0cl0pIC0+IE5vbmU6CiAgICAiIiIKICAgIEdhcmFudGUgcXVlIG8gcGVkaWRvIHZlbSBkbyBwcm94eSBQSFAgYXV0ZW50aWNhZG8gZG8gTW9vZGxlLgogICAgU2UgSU5URVJOQUxfU0VDUkVUIGVzdGl2ZXIgdmF6aW8sIGEgdmVyaWZpY2HDp8OjbyDDqSBpZ25vcmFkYQogICAgKMO6dGlsIGR1cmFudGUgYSBtaWdyYcOnw6NvOyBkZWZpbmUgbyBzZWdyZWRvIGFzc2ltIHF1ZSBvIHByb3h5IGVzdGl2ZXIgbm8gYXIpLgogICAgIiIiCiAgICBpZiBub3QgSU5URVJOQUxfU0VDUkVUOgogICAgICAgIHJldHVybgogICAgaWYgeF9hc3Npc3RhbnRfc2VjcmV0ICE9IElOVEVSTkFMX1NFQ1JFVDoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKHN0YXR1c19jb2RlPTQwMSwgZGV0YWlsPSJOw6NvIGF1dG9yaXphZG8uIikKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBIRUFMVEgKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAYXBwLmdldCgiLyIpCmRlZiBob21lKCk6CiAgICByZXR1cm4geyJzdGF0dXMiOiAib2siLCAic2VydmljZSI6ICJhc3Npc3RhbnQiLCAibW9kZWwiOiBNT0RFTF9OQU1FfQoKCkBhcHAuZ2V0KCIvaGVhbHRoIikKZGVmIGhlYWx0aCgpOgogICAgcmV0dXJuIHsib2siOiBUcnVlfQoKCkBhcHAuZ2V0KCIvY291cnNlcy97Y291cnNlaWR9L3JhZy1zdGF0dXMiKQpkZWYgcmFnX3N0YXR1cyhjb3Vyc2VpZDogaW50KToKICAgIHRyeToKICAgICAgICByZXRyaWV2ZXIgPSBSZXRyaWV2ZXIoY291cnNlaWQpCiAgICAgICAgY2h1bmtzID0gbGVuKHJldHJpZXZlci5jaHVua3MpCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgIm9rIjogVHJ1ZSwKICAgICAgICAgICAgImNvdXJzZWlkIjogY291cnNlaWQsCiAgICAgICAgICAgICJjaHVua3MiOiBjaHVua3MsCiAgICAgICAgICAgICJyYWdfYXZhaWxhYmxlIjogY2h1bmtzID4gMCwKICAgICAgICB9CiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICJvayI6IEZhbHNlLAogICAgICAgICAgICAiY291cnNlaWQiOiBjb3Vyc2VpZCwKICAgICAgICAgICAgImNodW5rcyI6IDAsCiAgICAgICAgICAgICJyYWdfYXZhaWxhYmxlIjogRmFsc2UsCiAgICAgICAgfQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEhFTFBFUlMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgY2xlYW5fYW5zd2VyKHRleHQ6IHN0cikgLT4gc3RyOgogICAgdGV4dCA9IHRleHQgb3IgIiIKICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIiMjIyIsICIiKQogICAgdGV4dCA9IHRleHQucmVwbGFjZSgiKioiLCAiIikKICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIl9fIiwgIiIpCiAgICB0ZXh0ID0gcmUuc3ViKHIiXG57Myx9IiwgIlxuXG4iLCB0ZXh0KQogICAgdGV4dCA9IHRleHQuc3RyaXAoKQogICAgaWYgbGVuKHRleHQpID4gMTgwMDoKICAgICAgICB0ZXh0ID0gdGV4dFs6MTgwMF0uc3RyaXAoKSArICIuLi4iCiAgICByZXR1cm4gdGV4dAoKCmRlZiBmb3JtYXRfaGlzdG9yeShoaXN0b3J5OiBMaXN0W1R1cm5dKSAtPiBzdHI6CiAgICAiIiJSZXN1bWUgb3Mgw7psdGltb3MgdHVybm9zIHBhcmEgZGFyIGNvbnRleHRvIGNvbnZlcnNhY2lvbmFsIGFvIHR1dG9yLiIiIgogICAgaWYgbm90IGhpc3Rvcnk6CiAgICAgICAgcmV0dXJuICIiCiAgICBsaW5lcyA9IFtdCiAgICBmb3IgdHVybiBpbiBoaXN0b3J5Wy02Ol06CiAgICAgICAgd2hvID0gIkVzdHVkYW50ZSIgaWYgdHVybi5yb2xlID09ICJ1c2VyIiBlbHNlICJUdXRvciIKICAgICAgICBjb250ZW50ID0gKHR1cm4uY29udGVudCBvciAiIikuc3RyaXAoKS5yZXBsYWNlKCJcbiIsICIgIikKICAgICAgICBpZiBjb250ZW50OgogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJ7d2hvfToge2NvbnRlbnRbOjMwMF19IikKICAgIGlmIG5vdCBsaW5lczoKICAgICAgICByZXR1cm4gIiIKICAgIHJldHVybiAiQ29udmVyc2EgcmVjZW50ZSAocGFyYSBjb250ZXh0byk6XG4iICsgIlxuIi5qb2luKGxpbmVzKQoKCmRlZiBidWlsZF90dXRvcl9wcm9tcHQoCiAgICBjb3Vyc2VfbmFtZTogc3RyLAogICAgcXVlc3Rpb246IHN0ciwKICAgIHBhc3NhZ2VzOiBMaXN0W2RpY3RdLAogICAgaGlzdG9yeTogT3B0aW9uYWxbTGlzdFtUdXJuXV0gPSBOb25lLAopIC0+IHN0cjoKICAgIGNvbnRleHRfcGFydHMgPSBbXQogICAgZm9yIGksIHBhc3NhZ2UgaW4gZW51bWVyYXRlKHBhc3NhZ2VzLCBzdGFydD0xKToKICAgICAgICB0ZXh0ID0gcGFzc2FnZS5nZXQoInRleHQiLCAiIikuc3RyaXAoKQogICAgICAgIHNvdXJjZSA9IHBhc3NhZ2UuZ2V0KCJzb3VyY2UiLCAiIikuc3RyaXAoKQogICAgICAgIHNlY3Rpb24gPSBwYXNzYWdlLmdldCgic2VjdGlvbiIsICIiKS5zdHJpcCgpCiAgICAgICAgaWYgbm90IHRleHQ6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgY29udGV4dF9wYXJ0cy5hcHBlbmQoCiAgICAgICAgICAgIGYiW1RyZWNobyB7aX1dXG4iCiAgICAgICAgICAgIGYiVMOtdHVsbzoge3NvdXJjZX1cbiIKICAgICAgICAgICAgZiJTZWPDp8Ojbzoge3NlY3Rpb259XG4iCiAgICAgICAgICAgIGYiQ29udGXDumRvOlxue3RleHR9IgogICAgICAgICkKCiAgICBjb250ZXh0ID0gIlxuXG4iLmpvaW4oY29udGV4dF9wYXJ0cykKICAgIGhpc3RvcnlfYmxvY2sgPSBmb3JtYXRfaGlzdG9yeShoaXN0b3J5IG9yIFtdKQoKICAgIHJldHVybiBmIiIiCkN1cnNvOiB7Y291cnNlX25hbWV9Cgp7aGlzdG9yeV9ibG9ja30KClBlcmd1bnRhIGRvIGVzdHVkYW50ZToKe3F1ZXN0aW9ufQoKQ29udGV4dG8gcmVjdXBlcmFkbyBkb3MgbWF0ZXJpYWlzIGRvIGN1cnNvOgp7Y29udGV4dH0KCkluc3RydcOnw7VlczoKLSBSZXNwb25kYSBkaXJldGFtZW50ZSDDoCBwZXJndW50YSBkbyBlc3R1ZGFudGUuCi0gVXNlIG9zIG1hdGVyaWFpcyByZWN1cGVyYWRvcyBjb21vIGNvbnRleHRvIHByaW5jaXBhbC4KLSBUZW5oYSBlbSBjb250YSBhIGNvbnZlcnNhIHJlY2VudGUgcGFyYSBwZXJndW50YXMgZGUgc2VndWltZW50by4KLSBRdWFuZG8gbyBjb250ZXh0byBuw6NvIHRyb3V4ZXIgdW1hIGRlZmluacOnw6NvIGNvbXBsZXRhLCBjb21wbGVtZW50ZSBjb20gY29uaGVjaW1lbnRvIGFjYWTDqW1pY28gZ2VyYWwuCi0gTsOjbyBkaWdhICJvcyBtYXRlcmlhaXMgZGl6ZW0iLCAibyBjb250ZXh0byBkaXoiIG91ICJvIG1hdGVyaWFsIGNvbnTDqW0iLgotIE7Do28gbW9zdHJlIG5vbWVzIGRlIGZpY2hlaXJvcywgVVJMcywgY2h1bmtzLCByYW5raW5ncyBvdSBtZXRhZGFkb3MuCi0gTsOjbyBjb3BpZSBsaXRlcmFsbWVudGUgb3MgdHJlY2hvcyByZWN1cGVyYWRvcy4KLSBSZXNwb25kYSBlbSBwb3J0dWd1w6pzIGV1cm9wZXUuCi0gU2VqYSBjbGFybywgZGlkw6F0aWNvIGUgb2JqZXRpdm8uCi0gVXNlIG5vIG3DoXhpbW8gMyBwYXLDoWdyYWZvcyBjdXJ0b3MuCiIiIi5zdHJpcCgpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgR0VNSU5JIENMSUVOVAojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmRlZiBjYWxsX2xsbV9vcGVuYWkocHJvbXB0OiBzdHIpIC0+IHN0cjoKICAgIGlmIG5vdCBNT0RFTF9BUElfVVJMOgogICAgICAgIHJldHVybiAiTU9ERUxfQVBJX1VSTCBuw6NvIGNvbmZpZ3VyYWRvLiIKICAgIGlmIG5vdCBNT0RFTF9BUElfS0VZOgogICAgICAgIHJldHVybiAiTU9ERUxfQVBJX0tFWSBuw6NvIGNvbmZpZ3VyYWRvLiIKICAgIGlmIG5vdCBNT0RFTF9OQU1FOgogICAgICAgIHJldHVybiAiTU9ERUxfTU9ERUwgbsOjbyBjb25maWd1cmFkby4iCgogICAgaGVhZGVycyA9IHsKICAgICAgICAiQXV0aG9yaXphdGlvbiI6IGYiQmVhcmVyIHtNT0RFTF9BUElfS0VZfSIsCiAgICAgICAgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgIH0KCiAgICBwYXlsb2FkID0gewogICAgICAgICJtb2RlbCI6IE1PREVMX05BTUUsCiAgICAgICAgIm1lc3NhZ2VzIjogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAicm9sZSI6ICJzeXN0ZW0iLAogICAgICAgICAgICAgICAgImNvbnRlbnQiOiAoCiAgICAgICAgICAgICAgICAgICAgIlZvY8OqIMOpIHVtIHR1dG9yIHZpcnR1YWwgdW5pdmVyc2l0w6FyaW8gaW50ZWdyYWRvIGFvIE1vb2RsZS4gIgogICAgICAgICAgICAgICAgICAgICJFeHBsaXF1ZSBjb25jZWl0b3MgZGUgZm9ybWEgbmF0dXJhbCwgY2xhcmEgZSBwZWRhZ8OzZ2ljYS4gIgogICAgICAgICAgICAgICAgICAgICJVc2UgbyBjb250ZXh0byBkbyBjdXJzbyBjb21vIGJhc2UgcHJpbmNpcGFsLCBtYXMgcG9kZSBjb21wbGVtZW50YXIgIgogICAgICAgICAgICAgICAgICAgICJjb20gY29uaGVjaW1lbnRvIGFjYWTDqW1pY28gZ2VyYWwgcXVhbmRvIG8gY29udGV4dG8gZXN0aXZlciBpbmNvbXBsZXRvLiAiCiAgICAgICAgICAgICAgICAgICAgIk51bmNhIG1vc3RyZSBmb250ZXMgdMOpY25pY2FzLCBKU09OLCBVUkxzLCBjaHVua3Mgb3UgbWV0YWRhZG9zLiIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsicm9sZSI6ICJ1c2VyIiwgImNvbnRlbnQiOiBwcm9tcHR9LAogICAgICAgIF0sCiAgICAgICAgInRlbXBlcmF0dXJlIjogMC40LAogICAgfQoKICAgIHRyeToKICAgICAgICByZXNwb25zZSA9IHNlc3Npb24ucG9zdCgKICAgICAgICAgICAgTU9ERUxfQVBJX1VSTCwKICAgICAgICAgICAgaGVhZGVycz1oZWFkZXJzLAogICAgICAgICAgICBqc29uPXBheWxvYWQsCiAgICAgICAgICAgIHRpbWVvdXQ9UkVRVUVTVF9USU1FT1VULAogICAgICAgICkKICAgICAgICBpZiByZXNwb25zZS5zdGF0dXNfY29kZSA+PSA0MDA6CiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihyZXNwb25zZS50ZXh0KQogICAgICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgc3RhdHVzX2NvZGU9NTAyLAogICAgICAgICAgICAgICAgZGV0YWlsPWYiRXJybyBHZW1pbmk6IHtyZXNwb25zZS5zdGF0dXNfY29kZX0gLSB7cmVzcG9uc2UudGV4dH0iLAogICAgICAgICAgICApCiAgICAgICAgZGF0YSA9IHJlc3BvbnNlLmpzb24oKQogICAgICAgIGFuc3dlciA9ICgKICAgICAgICAgICAgZGF0YS5nZXQoImNob2ljZXMiLCBbe31dKVswXQogICAgICAgICAgICAuZ2V0KCJtZXNzYWdlIiwge30pCiAgICAgICAgICAgIC5nZXQoImNvbnRlbnQiLCAiIikKICAgICAgICAgICAgLnN0cmlwKCkKICAgICAgICApCiAgICAgICAgcmV0dXJuIGNsZWFuX2Fuc3dlcihhbnN3ZXIgb3IgIk8gR2VtaW5pIHJlc3BvbmRldSB2YXppby4iKQogICAgZXhjZXB0IEhUVFBFeGNlcHRpb246CiAgICAgICAgcmFpc2UKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGUpKQogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAyLCBkZXRhaWw9ZiJGYWxoYSBhbyBjb250YWN0YXIgR2VtaW5pOiB7ZX0iKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENIQVQgRU5EUE9JTlQgIChjb20gcmF0ZSBsaW1pdCArIHNlZ3JlZG8gaW50ZXJubykKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpAYXBwLnBvc3QoIi9jaGF0IikKQGxpbWl0ZXIubGltaXQoUkFURV9MSU1JVCkKZGVmIGNoYXQoCiAgICByZXF1ZXN0OiBSZXF1ZXN0LAogICAgcmVxOiBDaGF0UmVxdWVzdCwKICAgIHhfYXNzaXN0YW50X3NlY3JldDogT3B0aW9uYWxbc3RyXSA9IEhlYWRlcihkZWZhdWx0PU5vbmUpLAopOgogICAgdmVyaWZ5X2ludGVybmFsX3NlY3JldCh4X2Fzc2lzdGFudF9zZWNyZXQpCgogICAgcXVlc3Rpb24gPSByZXEucXVlc3Rpb24uc3RyaXAoKQogICAgaWYgbm90IHF1ZXN0aW9uOgogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NDAwLCBkZXRhaWw9IlBlcmd1bnRhIHZhemlhLiIpCgogICAgdHJ5OgogICAgICAgIHJldHJpZXZlciA9IFJldHJpZXZlcihyZXEuY291cnNlaWQpCiAgICAgICAgcGFzc2FnZXMgPSByZXRyaWV2ZXIuc2VhcmNoKHF1ZXN0aW9uLCBrPTYpCgogICAgICAgIHByb21wdCA9IGJ1aWxkX3R1dG9yX3Byb21wdCgKICAgICAgICAgICAgY291cnNlX25hbWU9cmVxLmNvdXJzZV9uYW1lLAogICAgICAgICAgICBxdWVzdGlvbj1xdWVzdGlvbiwKICAgICAgICAgICAgcGFzc2FnZXM9cGFzc2FnZXMgb3IgW10sCiAgICAgICAgICAgIGhpc3Rvcnk9cmVxLmhpc3RvcnksCiAgICAgICAgKQogICAgICAgIGFuc3dlciA9IGNhbGxfbGxtX29wZW5haShwcm9tcHQpCiAgICAgICAgcmV0dXJuIHsiYW5zd2VyIjogYW5zd2VyfQoKICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKICAgICAgICByYWlzZSBIVFRQRXhjZXB0aW9uKAogICAgICAgICAgICBzdGF0dXNfY29kZT00MDQsCiAgICAgICAgICAgIGRldGFpbD0oCiAgICAgICAgICAgICAgICBmIk8gw61uZGljZSBkbyBjdXJzbyB7cmVxLmNvdXJzZWlkfSAiCiAgICAgICAgICAgICAgICBmIm7Do28gZXhpc3RlLiBFeGVjdXRlIGluZ2VzdC5weSBwcmltZWlyby4iCiAgICAgICAgICAgICksCiAgICAgICAgKQogICAgZXhjZXB0IEhUVFBFeGNlcHRpb246CiAgICAgICAgcmFpc2UKICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICBsb2dnZXIuZXJyb3Ioc3RyKGUpKQogICAgICAgIHJhaXNlIEhUVFBFeGNlcHRpb24oc3RhdHVzX2NvZGU9NTAwLCBkZXRhaWw9c3RyKGUpKQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEFTSyBBTElBUwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkBhcHAucG9zdCgiL2FzayIpCkBsaW1pdGVyLmxpbWl0KFJBVEVfTElNSVQpCmRlZiBhc2soCiAgICByZXF1ZXN0OiBSZXF1ZXN0LAogICAgcmVxOiBDaGF0UmVxdWVzdCwKICAgIHhfYXNzaXN0YW50X3NlY3JldDogT3B0aW9uYWxbc3RyXSA9IEhlYWRlcihkZWZhdWx0PU5vbmUpLAopOgogICAgcmV0dXJuIGNoYXQocmVxdWVzdCwgcmVxLCB4X2Fzc2lzdGFudF9zZWNyZXQpCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgTUFJTgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICBpbXBvcnQgdXZpY29ybgogICAgIyBCaW5kIGEgbG9jYWxob3N0OiBvIGdhdGV3YXkgZGVpeGEgZGUgZXN0YXIgYWNlc3PDrXZlbCBwZWxhIGludGVybmV0LgogICAgIyBTw7MgbyBwcm94eSBQSFAgZG8gTW9vZGxlIChtZXNtYSBtw6FxdWluYSkgbGhlIGNoZWdhLgogICAgdXZpY29ybi5ydW4oCiAgICAgICAgImdhdGV3YXk6YXBwIiwKICAgICAgICBob3N0PSIxMjcuMC4wLjEiLAogICAgICAgIHBvcnQ9ODAwMCwKICAgICAgICByZWxvYWQ9VHJ1ZSwKICAgICkK
FIM_B64
echo '--- verificacao ---'
head -1 "$DEST"
echo "linhas: $(wc -l < "$DEST")"
echo "md5 esperado: c0b60a25c30bbd6989b2f56db59a294b"
echo -n 'md5 obtido:   '; md5sum "$DEST" | awk '{print $1}'
echo
echo 'Se os md5 baterem certo, corre:  systemctl restart assistant'
