diff --git a/.github/workflows/assemble-updater34.yml b/.github/workflows/assemble-updater34.yml deleted file mode 100644 index 821de9a..0000000 --- a/.github/workflows/assemble-updater34.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Assemble Updater 3.4 Worker - -on: - push: - branches: - - feature/updater-3.4-lifecycle - pull_request: - branches: - - main - types: [opened, synchronize, reopened] - -permissions: - contents: write - -concurrency: - group: assemble-updater-34 - cancel-in-progress: false - -jobs: - assemble: - if: ${{ github.actor != 'github-actions[bot]' }} - runs-on: ubuntu-latest - steps: - - name: Branch auschecken - uses: actions/checkout@v6 - with: - ref: ${{ github.event.pull_request.head.ref || github.ref_name }} - fetch-depth: 0 - - - name: Worker bytegenau zusammensetzen - shell: bash - run: | - set -euo pipefail - mkdir -p scripts/updater - gzip -dc .updater34/worker.ps1.gz > scripts/updater/Vendoo.Updater.Worker34.ps1 - echo '00e62be18ea17a41a5472a085488a601cd9f226e6a33a57adfe0d47083b18791 scripts/updater/Vendoo.Updater.Worker34.ps1' | sha256sum --check --strict - rm -rf .updater34 - rm -f .github/workflows/assemble-updater34.yml - - - name: Zusammengesetzten Worker committen - shell: bash - run: | - git config user.name 'vendoo-updater-build' - git config user.email 'vendoo-updater-build@users.noreply.github.com' - git add --all - git commit -m 'feat: add production updater 3.4 worker' - git push origin HEAD:feature/updater-3.4-lifecycle diff --git a/.updater34/trigger.txt b/.updater34/trigger.txt deleted file mode 100644 index 07c4965..0000000 --- a/.updater34/trigger.txt +++ /dev/null @@ -1 +0,0 @@ -assemble diff --git a/.updater34/worker.part01.b64 b/.updater34/worker.part01.b64 deleted file mode 100644 index 66bb78f..0000000 --- a/.updater34/worker.part01.b64 +++ /dev/null @@ -1 +0,0 @@ -77u/W0NtZGxldEJpbmRpbmcoKV0KcGFyYW0oCiAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXVtzdHJpbmddJFN0YXR1c0ZpbGUsCiAgW1BhcmFtZXRlcihNYW5kYXRvcnk9JHRydWUpXVtzdHJpbmddJEV2ZW50RmlsZSwKICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldW3N0cmluZ10kSW5wdXRGaWxlLAogIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV1bc3RyaW5nXSRDYW5jZWxGaWxlLAogIFtQYXJhbWV0ZXIoTWFuZGF0b3J5PSR0cnVlKV1bc3RyaW5nXSRTZXNzaW9uRmlsZSwKICBbUGFyYW1ldGVyKE1hbmRhdG9yeT0kdHJ1ZSldW3N0cmluZ10kTG9nRmlsZSwKICBbc3dpdGNoXSRTa2lwUHJvZHVjdGlvbkRlcGxveSwKICBbc3dpdGNoXSRTZWxmVGVzdCwKICBbc3RyaW5nXSRTZWxmVGVzdEZhaWxBdCA9ICcnCikKClNldC1TdHJpY3RNb2RlIC1WZXJzaW9uIDIuMAokRXJyb3JBY3Rpb25QcmVmZXJlbmNlPSdTdG9wJzskUHJvZ3Jlc3NQcmVmZXJlbmNlPSdTaWxlbnRseUNvbnRpbnVlJwpBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5OZXQuSHR0cApbTmV0LlNlcnZpY2VQb2ludE1hbmFnZXJdOjpTZWN1cml0eVByb3RvY29sID0gW05ldC5TZWN1cml0eVByb3RvY29sVHlwZV06OlRsczEyCiRQYWNrYWdlUm9vdD0oUmVzb2x2ZS1QYXRoIC1MaXRlcmFsUGF0aCAoSm9pbi1QYXRoICRQU1NjcmlwdFJvb3QgJy4uXC4uJykgLUVycm9yQWN0aW9uIFN0b3ApLlByb3ZpZGVyUGF0aC5UcmltRW5kKFtTeXN0ZW0uSU8uUGF0aF06OkRpcmVjdG9yeVNlcGFyYXRvckNoYXIsW1N5c3RlbS5JTy5QYXRoXTo6QWx0RGlyZWN0b3J5U2VwYXJhdG9yQ2hhcikKJFJlcG9zaXRvcnk9J01hc3Rlcmx1a2U3Ny92ZW5kb28nOyRCYXNlQnJhbmNoPSdtYWluJzskVGFyZ2V0VmVyc2lvbj0nMS40My4wJzskVXBkYXRlclZlcnNpb249JzMuNC4wJzskUHVibGljQmFzZVVybD0naHR0cHM6Ly92ZW5kb28uZmxhdGxpbmVkLmRlJwokQnJhbmNoPSJyZWxlYXNlLyRUYXJnZXRWZXJzaW9uLXByb2R1Y3Rpb24tdXBkYXRlLXY0IgokTG9jYWxSb290PUpvaW4tUGF0aCAkZW52OkxPQ0FMQVBQREFUQSAnVmVuZG9vXFVwZGF0ZXInOyRUb29sc1Jvb3Q9Sm9pbi1QYXRoICRMb2NhbFJvb3QgJ3Rvb2xzJzskTG9nc1Jvb3Q9Sm9pbi1QYXRoICRMb2NhbFJvb3QgJ2xvZ3MnOyRXb3JrUm9vdD1Kb2luLVBhdGggJExvY2FsUm9vdCAid29ya1wkVGFyZ2V0VmVyc2lvbi12NCI7JENsb25lRGlyPUpvaW4tUGF0aCAkV29ya1Jvb3QgJ3JlcG9zaXRvcnknCk5ldy1JdGVtIC1JdGVtVHlwZSBEaXJlY3RvcnkgLVBhdGggJFRvb2xzUm9vdCwkTG9nc1Jvb3QsKFNwbGl0LVBhdGggLVBhcmVudCAkU2Vzc2lvbkZpbGUpIC1Gb3JjZXxPdXQtTnVsbAokU3RhbXA9R2V0LURhdGUgLUZvcm1hdCAneXl5eU1NZGQtSEhtbXNzJzskc2NyaXB0OlRvb2xzPUB7fTskc2NyaXB0OkN1cnJlbnRTdGVwPSdwYWNrYWdlJzskc2NyaXB0Okxhc3RIZWFydGJlYXQ9R2V0LURhdGU7JHNjcmlwdDpMYXN0Q2hlY2tMb2c9W0RhdGVUaW1lXTo6TWluVmFsdWUKJExpZmVjeWNsZVNjcmlwdD1Kb2luLVBhdGggJFBhY2thZ2VSb290ICd0b29sc1x1cGRhdGVyLWxpZmVjeWNsZS0zLjQubWpzJwokUGF5bG9hZEd1YXJkU2NyaXB0PUpvaW4tUGF0aCAkUGFja2FnZVJvb3QgJ3Rvb2xzXGNoZWNrLXJlbGVhc2UtcGF5bG9hZC0zLjQubWpzJwokc2NyaXB0OlN0ZXBzPUAoCiAgW29yZGVyZWRdQHtpZD0ncGFja2FnZSc7dGl0bGU9J1Bha2V0IHByw7xmZW4nO3N0YXRlPSdwZW5kaW5nJ30sW29yZGVyZWRdQHtpZD0ndG9vbHMnO3RpdGxlPSdTeXN0ZW0gcHLDvGZlbic7c3RhdGU9J3BlbmRpbmcnfSxbb3JkZXJlZF1Ae2lkPSdnaXRodWInO3RpdGxlPSdHaXRIdWIgdmVyYmluZGVuJztzdGF0ZT0ncGVuZGluZyd9LAogIFtvcmRlcmVkXUB7aWQ9J3Byb2R1Y3Rpb24nO3RpdGxlPSdaaWVsenVzdGFuZCBlcmtlbm5lbic7c3RhdGU9J3BlbmRpbmcnfSxbb3JkZXJlZF1Ae2lkPSd3b3Jrc3BhY2UnO3RpdGxlPSdQYXlsb2FkIHNpY2hlciB2b3JiZXJlaXRlbic7c3RhdGU9J3BlbmRpbmcnfSxbb3JkZXJlZF1Ae2lkPSd0ZXN0cyc7dGl0bGU9J1ZvbGxzdMOkbmRpZyB0ZXN0ZW4nO3N0YXRlPSdwZW5kaW5nJ30sCiAgW29yZGVyZWRdQHtpZD0ncHVsbHJlcXVlc3QnO3RpdGxlPSdQdWxsIFJlcXVlc3QgYWJnbGVpY2hlbic7c3RhdGU9J3BlbmRpbmcnfSxbb3JkZXJlZF1Ae2lkPSdtZXJnZSc7dGl0bGU9J0ZpbmFsZW4gSGVhZCBwcsO8ZmVuIHVuZCBtZXJnZW4nO3N0YXRlPSdwZW5kaW5nJ30sW29yZGVyZWRdQHtpZD0nZGVwbG95Jzt0aXRsZT0nQ29vbGlmeSBkZXBsb3llbic7c3RhdGU9J3BlbmRpbmcnfSxbb3JkZXJlZF1Ae2lkPSd2ZXJpZnknO3RpdGxlPSdQcm9kdWt0aW9uIGJlc3TDpHRpZ2VuJztzdGF0ZT0ncGVuZGluZyd9CikKCmZ1bmN0aW9uIFdyaXRlLUV2ZW50KFtzdHJpbmddJExldmVsLFtzdHJpbmddJE1lc3NhZ2UpewogICRzYWZlPSRNZXNzYWdlIC1yZXBsYWNlICcoP2kpKGh0dHBzOi8vW15cc10qKD86dG9rZW58d2ViaG9vaylbXlxzXSopJywnW1ZFUkRFQ0tUXScKICAkZW50cnk9W29yZGVyZWRdQHthdD0oR2V0LURhdGUpLlRvU3RyaW5nKCdvJyk7bGV2ZWw9JExldmVsLlRvVXBwZXJJbnZhcmlhbnQoKTttZXNzYWdlPSRzYWZlfXxDb252ZXJ0VG8tSnNvbiAtQ29tcHJlc3MKICBbSU8uRmlsZV06OkFwcGVuZEFsbFRleHQoJEV2ZW50RmlsZSwkZW50cnkrW0Vudmlyb25tZW50XTo6TmV3TGluZSwoTmV3LU9iamVjdCBUZXh0LlVURjhFbmNvZGluZygkZmFsc2UpKSkKICBbSU8uRmlsZV06OkFwcGVuZEFsbFRleHQoJExvZ0ZpbGUsIiQoR2V0LURhdGUgLUZvcm1hdCAneXl5eS1NTS1kZCBISDptbTpzcycpIFskKCRMZXZlbC5Ub1VwcGVySW52YXJpYW50KCkpXSAkc2FmZSQoW0Vudmlyb25tZW50XTo6TmV3TGluZSkiLChOZXctT2JqZWN0IFRleHQuVVRGOEVuY29kaW5nKCRmYWxzZSkpKQp9CmZ1bmN0aW9uIFdyaXRlLVN0YXRlKFtpbnRdJFBlcmNlbnQsW3N0cmluZ10kUGhhc2UsW3N0cmluZ10kRGV0YWlsLFtzdHJpbmddJFN0YXRlPSdydW5uaW5nJyxbc3RyaW5nXSRFcnJvcj0nJyxbc3RyaW5nXSRSZW1lZGlhdGlvbj0nJywgJFJlcXVlc3Q9JG51bGwpewogICRwYXlsb2FkPVtvcmRlcmVkXUB7dmVyc2lvbj0kVGFyZ2V0VmVyc2lvbjt1cGRhdGVyVmVyc2lvbj0kVXBkYXRlclZlcnNpb247cGVyY2VudD1bTWF0aF06Ok1heCgwLFtNYXRoXTo6TWluKDEwMCwkUGVyY2VudCkpO3BoYXNlPSRQaGFzZTtkZXRhaWw9JERldGFpbDtzdGF0ZT0kU3RhdGU7ZXJyb3I9JEVycm9yO3JlbWVkaWF0aW9uPSRSZW1lZGlhdGlvbjt1cGRhdGVkQXQ9KEdldC1EYXRlKS5Ub1N0cmluZygnbycpO2xvZ0ZpbGU9JExvZ0ZpbGU7c2Vzc2lvbkZpbGU9JFNlc3Npb25GaWxlO3N0ZXBzPSRzY3JpcHQ6U3RlcHM7cmVxdWVzdD0kUmVxdWVzdH18Q29udmVydFRvLUpzb24gLURlcHRoIDEwCiAgJHRtcD0iJFN0YXR1c0ZpbGUuJFBJRC50bXAiO1tJTy5GaWxlXTo6V3JpdGVBbGxUZXh0KCR0bXAsJHBheWxvYWQsKE5ldy1PYmplY3QgVGV4dC5VVEY4RW5jb2RpbmcoJGZhbHNlKSkpO01vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJHRtcCAtRGVzdGluYXRpb24gJFN0YXR1c0ZpbGUgLUZvcmNlCn0KZnVuY3Rpb24gU2V0LVN0ZXAoW3N0cmluZ10kSWQsW3N0cmluZ10kU3RhdGUpe2ZvcmVhY2goJHMgaW4gJHNjcmlwdDpTdGVwcyl7aWYoJHMuaWQgLWVxICRJZCl7JHMuc3RhdGU9JFN0YXRlfWVsc2VpZigkU3RhdGUgLWVxICdhY3RpdmUnIC1hbmQgJHMuc3RhdGUgLWVxICdhY3RpdmUnKXskcy5zdGF0ZT0ncGVuZGluZyd9fTskc2NyaXB0OkN1cnJlbnRTdGVwPSRJZH0KZnVuY3Rpb24gQ29tcGxldGUtU3RlcChbc3RyaW5nXSRJZCl7Zm9yZWFjaCgkcyBpbiAkc2NyaXB0OlN0ZXBzKXtpZigkcy5pZCAtZXEgJElkKXskcy5zdGF0ZT0nZG9uZSd9fX0KZnVuY3Rpb24gU2tpcC1TdGVwKFtzdHJpbmddJElkKXtmb3JlYWNoKCRzIGluICRzY3JpcHQ6U3RlcHMpe2lmKCRzLmlkIC1lcSAkSWQpeyRzLnN0YXRlPSdza2lwcGVkJ319fQpmdW5jdGlvbiBGYWlsLVN0ZXB7Zm9yZWFjaCgkcyBpbiAkc2NyaXB0OlN0ZXBzKXtpZigkcy5pZCAtZXEgJHNjcmlwdDpDdXJyZW50U3RlcCl7JHMuc3RhdGU9J2ZhaWxlZCd9fX0KZnVuY3Rpb24gQXNzZXJ0LU5vdENhbmNlbGxlZHtpZihUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRDYW5jZWxGaWxlKXt0aHJvdyBbU3lzdGVtLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uXTo6bmV3KCdEYXMgVXBkYXRlIHd1cmRlIGR1cmNoIGRlbiBCZW51dHplciBhYmdlYnJvY2hlbi4nKX19CmZ1bmN0aW9uIEFkZC1PclNldFByb3BlcnR5KCRPYmplY3QsW3N0cmluZ10kTmFtZSwkVmFsdWUpe2lmKCRPYmplY3QuUFNPYmplY3QuUHJvcGVydGllcy5OYW1lIC1jb250YWlucyAkTmFtZSl7JE9iamVjdC4kTmFtZT0kVmFsdWV9ZWxzZXskT2JqZWN0fEFkZC1NZW1iZXIgLU5vdGVQcm9wZXJ0eU5hbWUgJE5hbWUgLU5vdGVQcm9wZXJ0eVZhbHVlICRWYWx1ZX19CmZ1bmN0aW9uIFNhdmUtU2Vzc2lvbigkRGF0YSl7CiAgQWRkLU9yU2V0UHJvcGVydHkgJERhdGEgJ3NjaGVtYScgJ3ZlbmRvby11cGRhdGVyLXNlc3Npb24tdjInO0FkZC1PclNldFByb3BlcnR5ICREYXRhICdyZXBvc2l0b3J5JyAkUmVwb3NpdG9yeTtBZGQtT3JTZXRQcm9wZXJ0eSAkRGF0YSAndGFyZ2V0VmVyc2lvbicgJFRhcmdldFZlcnNpb247QWRkLU9yU2V0UHJvcGVydHkgJERhdGEgJ3VwZGF0ZXJWZXJzaW9uJyAkVXBkYXRlclZlcnNpb247QWRkLU9yU2V0UHJvcGVydHkgJERhdGEgJ3BheWxvYWRIYXNoJyAkc2NyaXB0Ok1hbmlmZXN0LnBheWxvYWRIYXNoO0FkZC1PclNldFByb3BlcnR5ICREYXRhICdicmFuY2gnICRCcmFuY2g7QWRkLU9yU2V0UHJvcGVydHkgJERhdGEgJ3VwZGF0ZWRBdCcgKEdldC1EYXRlKS5Ub1N0cmluZygnbycpCiAgJHRtcD0iJFNlc3Npb25GaWxlLnRtcCI7JGpzb249JERhdGF8Q29udmVydFRvLUpzb24gLURlcHRoIDEwO1tJTy5GaWxlXTo6V3JpdGVBbGxUZXh0KCR0bXAsJGpzb24sKE5ldy1PYmplY3QgVGV4dC5VVEY4RW5jb2RpbmcoJGZhbHNlKSkpO01vdmUtSXRlbSAkdG1wICRTZXNzaW9uRmlsZSAtRm9yY2UKfQpmdW5jdGlvbiBOZXctU2Vzc2lvbntyZXR1cm4gW3BzY3VzdG9tb2JqZWN0XUB7c2NoZW1hPSd2ZW5kb28tdXBkYXRlci1zZXNzaW9uLXYyJztyZXBvc2l0b3J5PSRSZXBvc2l0b3J5O3RhcmdldFZlcnNpb249JFRhcmdldFZlcnNpb247dXBkYXRlclZlcnNpb249JFVwZGF0ZXJWZXJzaW9uO3BheWxvYWRIYXNoPVtzdHJpbmddJHNjcmlwdDpNYW5pZmVzdC5wYXlsb2FkSGFzaDticmFuY2g9JEJyYW5jaDtyZWxlYXNlU3RhdGU9J25ldyc7cHJOdW1iZXI9JG51bGw7cHJVcmw9Jyc7ZmluYWxQckhlYWRTaGE9Jyc7bWVyZ2VDb21taXQ9Jyc7cHJvZHVjdGlvblZlcnNpb249Jyc7Y29tcGxldGVkQXQ9Jyc7dXBkYXRlZEF0PScnfX0KZnVuY3Rpb24gTG9hZC1TZXNzaW9uewogIGlmKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFNlc3Npb25GaWxlKXt0cnl7JHNhdmVkPUdldC1Db250ZW50ICRTZXNzaW9uRmlsZSAtUmF3IC1FbmNvZGluZyBVVEY4fENvbnZlcnRGcm9tLUpzb247aWYoW3N0cmluZ10kc2F2ZWQuc2NoZW1hLWVxJ3ZlbmRvby11cGRhdGVyLXNlc3Npb24tdjInIC1hbmQgW3N0cmluZ10kc2F2ZWQucmVwb3NpdG9yeS1lcSRSZXBvc2l0b3J5IC1hbmQgW3N0cmluZ10kc2F2ZWQudGFyZ2V0VmVyc2lvbi1lcSRUYXJnZXRWZXJzaW9uIC1hbmQgW3N0cmluZ10kc2F2ZWQucGF5bG9hZEhhc2gtZXFbc3RyaW5nXSRzY3JpcHQ6TWFuaWZlc3QucGF5bG9hZEhhc2gpe3JldHVybiAkc2F2ZWR9O1dyaXRlLUV2ZW50ICdJTkZPJyAnVmVyYWx0ZXRlciBvZGVyIGFuZGVyZXIgVXBkYXRlci1TaXR6dW5nc3N0YW5kIHdpcmQgbmljaHQgw7xiZXJub21tZW4uJ31jYXRjaHtXcml0ZS1FdmVudCAnV0FSTicgJ0dlc3BlaWNoZXJ0ZXIgU2l0enVuZ3NzdGFuZCBpc3QgdW5nw7xsdGlnIHVuZCB3aXJkIHZlcndvcmZlbi4nfX0KICByZXR1cm4gTmV3LVNlc3Npb24KfQpmdW5jdGlvbiBRdW90ZS1BcmcoW3N0cmluZ10kVmFsdWUpe2lmKCRudWxsIC1lcSAkVmFsdWUpe3JldHVybiAnIiInfTtpZigkVmFsdWUgLW5vdG1hdGNoICdbXHMiXScpe3JldHVybiAkVmFsdWV9O3JldHVybiAnIicrKCRWYWx1ZSAtcmVwbGFjZSAnKFxcKikiJywnJDEkMVwiJyAtcmVwbGFjZSAnKFxcKykkJywnJDEkMScpKyciJ30KZnVuY3Rpb24gU3RvcC1UcmVlKFtpbnRdJFByb2Nlc3NJZCl7dHJ5eyYgdGFza2tpbGwuZXhlIC9QSUQgJFByb2Nlc3NJZCAvVCAvRiAyPiRudWxsfE91dC1OdWxsfWNhdGNoe3RyeXtTdG9wLVByb2Nlc3MgLUlkICRQcm9jZXNzSWQgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlfWNhdGNoe319fQpmdW5jdGlvbiBHZXQtVGFpbFRleHQoW3N0cmluZ10kVGV4dCxbaW50XSRNYXhMZW5ndGgpe2lmKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJFRleHQpKXtyZXR1cm4gJyd9OyR2YWx1ZT0kVGV4dC5UcmltKCk7aWYoJHZhbHVlLkxlbmd0aCAtZ3QgJE1heExlbmd0aCl7cmV0dXJuICR2YWx1ZS5TdWJzdHJpbmcoJHZhbHVlLkxlbmd0aC0kTWF4TGVuZ3RoKX07cmV0dXJuICR2YWx1ZX0KZnVuY3Rpb24gR2V0LVByb2Nlc3NGYWlsdXJlU3VtbWFyeShbc3RyaW5nXSRTdGRFcnIsW3N0cmluZ10kU3RkT3V0KXskcGFydHM9TmV3LU9iamVjdCBDb2xsZWN0aW9ucy5HZW5lcmljLkxpc3Rbc3RyaW5nXTskZT1HZXQtVGFpbFRleHQgJFN0ZEVyciAyMjAwOyRvPUdldC1UYWlsVGV4dCAkU3RkT3V0IDEyMDA7aWYoJGUpeyRwYXJ0cy5BZGQoIkZlaGxlcmF1c2dhYmU6YG4kZSIpfTtpZigkbyl7JHBhcnRzLkFkZCgiTGV0enRlIFN0YW5kYXJkYXVzZ2FiZTpgbiRvIil9O2lmKCRwYXJ0cy5Db3VudC1lcTApe3JldHVybiAnRGVyIFByb3plc3MgbGllZmVydGUga2VpbmUgRGlhZ25vc2VhdXNnYWJlLid9O3JldHVybigkcGFydHMtam9pbiJgbmBuIil9CmZ1bmN0aW9uIEludm9rZS1FeHRlcm5hbHsKICBwYXJhbShbc3RyaW5nXSRGaWxlLFtzdHJpbmdbXV0kQXJndW1lbnRzLFtzdHJpbmddJFdvcmtpbmdEaXJlY3Rvcnk9JFBhY2thZ2VSb290LFtpbnRdJFRpbWVvdXRTZWNvbmRzPTEyMCxbc3dpdGNoXSRBbGxvd0ZhaWx1cmUsW3N0cmluZ10kSW5wdXRUZXh0PScnLFtzdHJpbmddJExhYmVsPSdQcm96ZXNzJyxbc3dpdGNoXSRRdWlldCkKICBBc3NlcnQtTm90Q2FuY2VsbGVkCiAgJHBzaT1OZXctT2JqZWN0IERpYWdub3N0aWNzLlByb2Nlc3NTdGFydEluZm87JHBzaS5GaWxlTmFtZT0kRmlsZTskcHNpLkFyZ3VtZW50cz0oQCgkQXJndW1lbnRzfEZvckVhY2gtT2JqZWN0e1F1b3RlLUFyZyhbc3RyaW5nXSRfKX0pLWpvaW4nICcpOyRwc2kuV29ya2luZ0RpcmVjdG9yeT0kV29ya2luZ0RpcmVjdG9yeTskcHNpLlVzZVNoZWxsRXhlY3V0ZT0kZmFsc2U7JHBzaS5DcmVhdGVOb1dpbmRvdz0kdHJ1ZTskcHNpLlJlZGlyZWN0U3RhbmRhcmRPdXRwdXQ9JHRydWU7JHBzaS5SZWRpcmVjdFN0YW5kYXJkRXJyb3I9JHRydWU7JHBzaS5SZWRpcmVjdFN0YW5kYXJkSW5wdXQ9JHRydWUKICAkdXRmOD1OZXctT2JqZWN0IFRleHQuVVRGOEVuY29kaW5nKCRmYWxzZSk7aWYoJHBzaS5QU09iamVjdC5Qcm9wZXJ0aWVzLk5hbWUtY29udGFpbnMnU3RhbmRhcmRPdXRwdXRFbmNvZGluZycpeyRwc2kuU3RhbmRhcmRPdXRwdXRFbmNvZGluZz0kdXRmOH07aWYoJHBzaS5QU09iamVjdC5Qcm9wZXJ0aWVzLk5hbWUtY29udGFpbnMnU3RhbmRhcmRFcnJvckVuY29kaW5nJyl7JHBzaS5TdGFuZGFyZEVycm9yRW5jb2Rpbmc9JHV0Zjh9CiAgJHBzaS5FbnZpcm9ubWVudFZhcmlhYmxlc1snTk9fQ09MT1InXT0nMSc7JHBzaS5FbnZpcm9ubWVudFZhcmlhYmxlc1snRk9SQ0VfQ09MT1InXT0nMCc7JHBzaS5FbnZpcm9ubWVudFZhcmlhYmxlc1snTlBNX0NPTkZJR19DT0xPUiddPSdmYWxzZSc7JHBzaS5FbnZpcm9ubWVudFZhcmlhYmxlc1snTlBNX0NPTkZJR19VTklDT0RFJ109J3RydWUnCiAgJHA9TmV3LU9iamVjdCBEaWFnbm9zdGljcy5Qcm9jZXNzOyRwLlN0YXJ0SW5mbz0kcHNpO2lmKC1ub3QkUXVpZXQpe1dyaXRlLUV2ZW50ICdJTkZPJyAiJExhYmVsIGdlc3RhcnRldC4ifTtpZigtbm90JHAuU3RhcnQoKSl7dGhyb3cgIiRMYWJlbCBrb25udGUgbmljaHQgZ2VzdGFydGV0IHdlcmRlbi4ifTskb3V0VGFzaz0kcC5TdGFuZGFyZE91dHB1dC5SZWFkVG9FbmRBc3luYygpOyRlcnJUYXNrPSRwLlN0YW5kYXJkRXJyb3IuUmVhZFRvRW5kQXN5bmMoKTtpZigkSW5wdXRUZXh0KXskcC5TdGFuZGFyZElucHV0LldyaXRlKCRJbnB1dFRleHQpfTskcC5TdGFuZGFyZElucHV0LkNsb3NlKCk7JHN3PVtEaWFnbm9zdGljcy5TdG9wd2F0Y2hdOjpTdGFydE5ldygpCiAgd2hpbGUoLW5vdCRwLldhaXRGb3JFeGl0KDUwMCkpe2lmKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJENhbmNlbEZpbGUpe1N0b3AtVHJlZSAkcC5JZDt0aHJvdyBbU3lzdGVtLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uXTo6bmV3KCdEYXMgVXBkYXRlIHd1cmRlIGR1cmNoIGRlbiBCZW51dHplciBhYmdlYnJvY2hlbi4nKX07aWYoJHN3LkVsYXBzZWQuVG90YWxTZWNvbmRzLWd0JFRpbWVvdXRTZWNvbmRzKXtTdG9wLVRyZWUgJHAuSWQ7dGhyb3cgIiRMYWJlbCBoYXQgZGFzIFplaXRsaW1pdCB2b24gJFRpbWVvdXRTZWNvbmRzIFNla3VuZGVuIMO8YmVyc2Nocml0dGVuLiJ9O2lmKC1ub3QkUXVpZXQtYW5kKChHZXQtRGF0ZSktJHNjcmlwdDpMYXN0SGVhcnRiZWF0KS5Ub3RhbFNlY29uZHMtZ2U4KXtXcml0ZS1FdmVudCAnSU5GTycgKCIkTGFiZWwgbMOkdWZ0IHNlaXQgezA6bW1cOnNzfS4iLWYkc3cuRWxhcHNlZCk7JHNjcmlwdDpMYXN0SGVhcnRiZWF0PUdldC1EYXRlfX0KICAkcC5XYWl0Rm9yRXhpdCgpOyRzdGRvdXQ9W3N0cmluZ10kb3V0VGFzay5SZXN1bHQ7JHN0ZGVycj1bc3RyaW5nXSRlcnJUYXNr \ No newline at end of file diff --git a/.updater34/worker.part02.b64 b/.updater34/worker.part02.b64 deleted file mode 100644 index dab8b27..0000000 --- a/.updater34/worker.part02.b64 +++ /dev/null @@ -1 +0,0 @@ -LlJlc3VsdDskY29kZT0kcC5FeGl0Q29kZTskcC5EaXNwb3NlKCkKICBpZigtbm90JFF1aWV0KXtmb3JlYWNoKCRsaW5lIGluQCgkc3Rkb3V0LXNwbGl0ImByP2BuIikpe2lmKCRsaW5lLlRyaW0oKSl7V3JpdGUtRXZlbnQgJ09VVFBVVCcgJGxpbmUuVHJpbSgpfX07Zm9yZWFjaCgkbGluZSBpbkAoJHN0ZGVyci1zcGxpdCJgcj9gbiIpKXskY2xlYW49JGxpbmUuVHJpbSgpO2lmKC1ub3QkY2xlYW4pe2NvbnRpbnVlfTtpZigkY29kZS1uZTApe1dyaXRlLUV2ZW50ICdFUlJPUicgJGNsZWFufWVsc2VpZigkY2xlYW4tbWF0Y2gnKD9pKVxiKHdhcm58d2FybmluZ3xkZXByZWNhdGVkKVxiJyl7V3JpdGUtRXZlbnQgJ1dBUk4nICRjbGVhbn1lbHNle1dyaXRlLUV2ZW50ICdPVVRQVVQnICRjbGVhbn19fQogIGlmKC1ub3QkQWxsb3dGYWlsdXJlLWFuZCRjb2RlLW5lMCl7dGhyb3cgIiRMYWJlbCBpc3QgbWl0IEV4aXQtQ29kZSAkY29kZSBmZWhsZ2VzY2hsYWdlbi5gbiQoR2V0LVByb2Nlc3NGYWlsdXJlU3VtbWFyeSAkc3RkZXJyICRzdGRvdXQpIn07cmV0dXJuW3BzY3VzdG9tb2JqZWN0XUB7Q29kZT0kY29kZTtPdXRwdXQ9JHN0ZG91dDtFcnJvcj0kc3RkZXJyfQp9CmZ1bmN0aW9uIFJlc29sdmUtVG9vbChbc3RyaW5nXSROYW1lLFtzdHJpbmdbXV0kQ2FuZGlkYXRlcz1AKCkpe2lmKCRzY3JpcHQ6VG9vbHMuQ29udGFpbnNLZXkoJE5hbWUpLWFuZChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRzY3JpcHQ6VG9vbHNbJE5hbWVdKSl7cmV0dXJuJHNjcmlwdDpUb29sc1skTmFtZV19O2ZvcmVhY2goJGMgaW5AKCRDYW5kaWRhdGVzKSl7aWYoJGMtYW5kKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGMgLVBhdGhUeXBlIExlYWYpKXskc2NyaXB0OlRvb2xzWyROYW1lXT0oUmVzb2x2ZS1QYXRoICRjKS5QYXRoO3JldHVybiRzY3JpcHQ6VG9vbHNbJE5hbWVdfX07JGNtZD1HZXQtQ29tbWFuZCAkTmFtZSAtQ29tbWFuZFR5cGUgQXBwbGljYXRpb24gLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWV8U2VsZWN0LU9iamVjdCAtRmlyc3QgMTtpZigkY21kLWFuZCRjbWQuU291cmNlLWFuZChUZXN0LVBhdGggJGNtZC5Tb3VyY2UpKXskc2NyaXB0OlRvb2xzWyROYW1lXT0kY21kLlNvdXJjZTtyZXR1cm4kY21kLlNvdXJjZX07cmV0dXJuJG51bGx9CmZ1bmN0aW9uIEdldC1HaXRQYXRoe3JldHVybiBSZXNvbHZlLVRvb2wgJ2dpdC5leGUnIEAoIiRlbnY6UHJvZ3JhbUZpbGVzXEdpdFxjbWRcZ2l0LmV4ZSIsIiRlbnY6TE9DQUxBUFBEQVRBXFByb2dyYW1zXEdpdFxjbWRcZ2l0LmV4ZSIpfQpmdW5jdGlvbiBHZXQtTm9kZVBhdGh7cmV0dXJuIFJlc29sdmUtVG9vbCAnbm9kZS5leGUnIEAoIiRlbnY6UHJvZ3JhbUZpbGVzXG5vZGVqc1xub2RlLmV4ZSIsIiRlbnY6TE9DQUxBUFBEQVRBXFByb2dyYW1zXG5vZGVqc1xub2RlLmV4ZSIpfQpmdW5jdGlvbiBHZXQtTnBtUGF0aHtyZXR1cm4gUmVzb2x2ZS1Ub29sICducG0uY21kJyBAKCIkZW52OlByb2dyYW1GaWxlc1xub2RlanNcbnBtLmNtZCIsIiRlbnY6TE9DQUxBUFBEQVRBXFByb2dyYW1zXG5vZGVqc1xucG0uY21kIil9CmZ1bmN0aW9uIEludm9rZS1XZWJKc29uKFtzdHJpbmddJFVyaSl7Zm9yKCRpPTE7JGktbGUzOyRpKyspe3RyeXtyZXR1cm4gSW52b2tlLVJlc3RNZXRob2QgLVVyaSAkVXJpIC1IZWFkZXJzIEB7J1VzZXItQWdlbnQnPSJWZW5kb28tVXBkYXRlci8kVXBkYXRlclZlcnNpb24iOydBY2NlcHQnPSdhcHBsaWNhdGlvbi92bmQuZ2l0aHViK2pzb24nfSAtVGltZW91dFNlYyAzMH1jYXRjaHtpZigkaS1lcTMpe3Rocm93fTtTdGFydC1TbGVlcCAtU2Vjb25kcygyKiRpKX19fQpmdW5jdGlvbiBEb3dubG9hZC1GaWxlKFtzdHJpbmddJFVyaSxbc3RyaW5nXSREZXN0aW5hdGlvbixbc3RyaW5nXSRMYWJlbCl7Zm9yKCRhdHRlbXB0PTE7JGF0dGVtcHQtbGUzOyRhdHRlbXB0Kyspe3RyeXskaGFuZGxlcj1OZXctT2JqZWN0IE5ldC5IdHRwLkh0dHBDbGllbnRIYW5kbGVyOyRjbGllbnQ9W05ldC5IdHRwLkh0dHBDbGllbnRdOjpuZXcoJGhhbmRsZXIpOyRjbGllbnQuVGltZW91dD1bVGltZVNwYW5dOjpGcm9tTWludXRlcyg1KTskY2xpZW50LkRlZmF1bHRSZXF1ZXN0SGVhZGVycy5Vc2VyQWdlbnQuUGFyc2VBZGQoIlZlbmRvby1VcGRhdGVyLyRVcGRhdGVyVmVyc2lvbiIpOyRyZXNwPSRjbGllbnQuR2V0QXN5bmMoJFVyaSxbTmV0Lkh0dHAuSHR0cENvbXBsZXRpb25PcHRpb25dOjpSZXNwb25zZUhlYWRlcnNSZWFkKS5SZXN1bHQ7JG51bGw9JHJlc3AuRW5zdXJlU3VjY2Vzc1N0YXR1c0NvZGUoKTskaW5wdXQ9JHJlc3AuQ29udGVudC5SZWFkQXNTdHJlYW1Bc3luYygpLlJlc3VsdDskb3V0cHV0PVtJTy5GaWxlXTo6T3BlbigkRGVzdGluYXRpb24sW0lPLkZpbGVNb2RlXTo6Q3JlYXRlLFtJTy5GaWxlQWNjZXNzXTo6V3JpdGUsW0lPLkZpbGVTaGFyZV06Ok5vbmUpO3RyeXskYnVmPU5ldy1PYmplY3QgYnl0ZVtdIDY1NTM2O3doaWxlKCgkcmVhZD0kaW5wdXQuUmVhZCgkYnVmLDAsJGJ1Zi5MZW5ndGgpKS1ndDApe0Fzc2VydC1Ob3RDYW5jZWxsZWQ7JG91dHB1dC5Xcml0ZSgkYnVmLDAsJHJlYWQpfX1maW5hbGx5eyRvdXRwdXQuRGlzcG9zZSgpOyRpbnB1dC5EaXNwb3NlKCk7JHJlc3AuRGlzcG9zZSgpOyRjbGllbnQuRGlzcG9zZSgpOyRoYW5kbGVyLkRpc3Bvc2UoKX07cmV0dXJufWNhdGNoe2lmKCRhdHRlbXB0LWVxMyl7dGhyb3cgIiRMYWJlbCBrb25udGUgbmFjaCBkcmVpIFZlcnN1Y2hlbiBuaWNodCBnZWxhZGVuIHdlcmRlbjogJCgkXy5FeGNlcHRpb24uTWVzc2FnZSkifTtTdGFydC1TbGVlcCAtU2Vjb25kcygzKiRhdHRlbXB0KX19fQpmdW5jdGlvbiBFbnN1cmUtR2l0SHViQ2xpewogICRtYW5hZ2VkPUpvaW4tUGF0aCAkVG9vbHNSb290ICdnaXRodWItY2xpXGN1cnJlbnRcYmluXGdoLmV4ZSc7aWYoVGVzdC1QYXRoICRtYW5hZ2VkKXskdGVzdD1JbnZva2UtRXh0ZXJuYWwgJG1hbmFnZWQgQCgnLS12ZXJzaW9uJykgLVRpbWVvdXRTZWNvbmRzIDIwIC1BbGxvd0ZhaWx1cmUgLUxhYmVsICdHaXRIdWIgQ0xJIHByw7xmZW4nIC1RdWlldDtpZigkdGVzdC5Db2RlLWVxMCl7JHNjcmlwdDpUb29sc1snZ2guZXhlJ109JG1hbmFnZWQ7cmV0dXJuJG1hbmFnZWR9fQogIFdyaXRlLVN0YXRlIDE4ICdHaXRIdWIgQ0xJJyAnRGllIG9mZml6aWVsbGUgcG9ydGFibGUgR2l0SHViIENMSSB3aXJkIHNpY2hlciBnZWxhZGVuIHVuZCBwZXIgU0hBLTI1NiBnZXByw7xmdC4nOyRyZWxlYXNlPUludm9rZS1XZWJKc29uICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2NsaS9jbGkvcmVsZWFzZXMvbGF0ZXN0JzskYXJjaD1pZihbRW52aXJvbm1lbnRdOjpJczY0Qml0T3BlcmF0aW5nU3lzdGVtKXsnYW1kNjQnfWVsc2V7JzM4Nid9OyRhc3NldD1AKCRyZWxlYXNlLmFzc2V0c3xXaGVyZS1PYmplY3R7JF8ubmFtZS1saWtlImdoXypfd2luZG93c18kYXJjaC56aXAifXxTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKTskY2hlY2tzPUAoJHJlbGVhc2UuYXNzZXRzfFdoZXJlLU9iamVjdHskXy5uYW1lLWxpa2UnKl9jaGVja3N1bXMudHh0J318U2VsZWN0LU9iamVjdCAtRmlyc3QgMSk7aWYoLW5vdCRhc3NldC1vci1ub3QkY2hlY2tzKXt0aHJvdydEaWUgb2ZmaXppZWxsZW4gR2l0SHViLUNMSS1SZWxlYXNlLURhdGVpZW4ga29ubnRlbiBuaWNodCBlcm1pdHRlbHQgd2VyZGVuLid9CiAgJHRtcD1Kb2luLVBhdGggJGVudjpURU1QICJ2ZW5kb28tZ2gtJFBJRCI7TmV3LUl0ZW0gLUl0ZW1UeXBlIERpcmVjdG9yeSAtUGF0aCAkdG1wIC1Gb3JjZXxPdXQtTnVsbDskemlwPUpvaW4tUGF0aCAkdG1wICRhc3NldC5uYW1lOyRjaGVja0ZpbGU9Sm9pbi1QYXRoICR0bXAgJGNoZWNrcy5uYW1lOyRleHRyYWN0PUpvaW4tUGF0aCAkdG1wICdleHRyYWN0JwogIHRyeXtEb3dubG9hZC1GaWxlICRhc3NldC5icm93c2VyX2Rvd25sb2FkX3VybCAkemlwICdHaXRIdWIgQ0xJJztEb3dubG9hZC1GaWxlICRjaGVja3MuYnJvd3Nlcl9kb3dubG9hZF91cmwgJGNoZWNrRmlsZSAnUHLDvGZzdW1tZW4nOyRsaW5lPUdldC1Db250ZW50ICRjaGVja0ZpbGV8V2hlcmUtT2JqZWN0eyRfLW1hdGNoW3JlZ2V4XTo6RXNjYXBlKCRhc3NldC5uYW1lKX18U2VsZWN0LU9iamVjdCAtRmlyc3QgMTtpZigtbm90JGxpbmUpe3Rocm93J0bDvHIgZGFzIEdpdEh1Yi1DTEktQXJjaGl2IHd1cmRlIGtlaW5lIG9mZml6aWVsbGUgUHLDvGZzdW1tZSBnZWZ1bmRlbi4nfTskZXhwZWN0ZWQ9KCRsaW5lLXNwbGl0J1xzKycpWzBdLlRvTG93ZXJJbnZhcmlhbnQoKTskYWN0dWFsPShHZXQtRmlsZUhhc2ggJHppcCAtQWxnb3JpdGhtIFNIQTI1NikuSGFzaC5Ub0xvd2VySW52YXJpYW50KCk7aWYoJGFjdHVhbC1uZSRleHBlY3RlZCl7dGhyb3cnU0hBLTI1Ni1QcsO8ZnVuZyBkZXIgR2l0SHViIENMSSBmZWhsZ2VzY2hsYWdlbi4nfTtOZXctSXRlbSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1QYXRoICRleHRyYWN0IC1Gb3JjZXxPdXQtTnVsbDtFeHBhbmQtQXJjaGl2ZSAkemlwICRleHRyYWN0IC1Gb3JjZTskc291cmNlPUdldC1DaGlsZEl0ZW0gJGV4dHJhY3QgLUZpbHRlciBnaC5leGUgLUZpbGUgLVJlY3Vyc2V8U2VsZWN0LU9iamVjdCAtRmlyc3QgMTtpZigtbm90JHNvdXJjZSl7dGhyb3cnRGFzIGdlcHLDvGZ0ZSBHaXRIdWItQ0xJLUFyY2hpdiBlbnRow6RsdCBrZWluZSBnaC5leGUuJ307JHRhcmdldFJvb3Q9U3BsaXQtUGF0aCAtUGFyZW50KFNwbGl0LVBhdGggLVBhcmVudCAkbWFuYWdlZCk7aWYoVGVzdC1QYXRoICR0YXJnZXRSb290KXtSZW1vdmUtSXRlbSAkdGFyZ2V0Um9vdCAtUmVjdXJzZSAtRm9yY2V9O05ldy1JdGVtIC1JdGVtVHlwZSBEaXJlY3RvcnkgLVBhdGgoU3BsaXQtUGF0aCAtUGFyZW50ICRtYW5hZ2VkKS1Gb3JjZXxPdXQtTnVsbDtDb3B5LUl0ZW0gJHNvdXJjZS5GdWxsTmFtZSAkbWFuYWdlZCAtRm9yY2U7JG51bGw9SW52b2tlLUV4dGVybmFsICRtYW5hZ2VkIEAoJy0tdmVyc2lvbicpIC1UaW1lb3V0U2Vjb25kcyAyMCAtTGFiZWwgJ0dpdEh1YiBDTEkgdmFsaWRpZXJlbic7JHNjcmlwdDpUb29sc1snZ2guZXhlJ109JG1hbmFnZWQ7V3JpdGUtRXZlbnQgJ09LJyAiR2l0SHViIENMSSAkKCRyZWxlYXNlLnRhZ19uYW1lKSB3dXJkZSBnZXByw7xmdCB1bmQgbG9rYWwgYmVyZWl0Z2VzdGVsbHQuIjtyZXR1cm4kbWFuYWdlZH1maW5hbGx5e1JlbW92ZS1JdGVtICR0bXAgLVJlY3Vyc2UgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlfQp9CmZ1bmN0aW9uIFRlc3QtR2l0SHViQXV0aGVudGljYXRpb24oW3N0cmluZ10kR2hQYXRoKXskc3RhdHVzPUludm9rZS1FeHRlcm5hbCAkR2hQYXRoIEAoJ2F1dGgnLCdzdGF0dXMnLCctLWhvc3RuYW1lJywnZ2l0aHViLmNvbScpIC1UaW1lb3V0U2Vjb25kcyAyMCAtQWxsb3dGYWlsdXJlIC1MYWJlbCAnR2l0SHViLUFubWVsZHVuZyBwcsO8ZmVuJyAtUXVpZXQ7cmV0dXJuKCRzdGF0dXMuQ29kZS1lcTApfQpmdW5jdGlvbiBJbnZva2UtVmlzaWJsZUdpdEh1YkxvZ2luKFtzdHJpbmddJEdoUGF0aCl7CiAgJHJ1bnRpbWVEaXJlY3Rvcnk9U3BsaXQtUGF0aCAtUGFyZW50ICRTdGF0dXNGaWxlOyRsb2dpblNjcmlwdD1Kb2luLVBhdGggJHJ1bnRpbWVEaXJlY3RvcnkgJ2dpdGh1Yi1sb2dpbi5jbWQnOyRlc2NhcGVkR2g9JEdoUGF0aC5SZXBsYWNlKCciJywnIiInKTskbGluZXM9QCgnQGVjaG8gb2ZmJywnY2hjcCA2NTAwMSA+bnVsJywndGl0bGUgVmVuZG9vIC0gR2l0SHViIEFubWVsZHVuZycsJ2VjaG8gVmVuZG9vIC0gU2ljaGVyZSBHaXRIdWIgQW5tZWxkdW5nJywnZWNoby4nLCdlY2hvIEZvbGdlIGRlbSBCcm93c2VyZGlhbG9nIHp1ciBHaXRIdWItQW5tZWxkdW5nLicsJ2VjaG8uJywoJyJ7MH0iIGF1dGggbG9naW4gLS1ob3N0bmFtZSBnaXRodWIuY29tIC0tZ2l0LXByb3RvY29sIGh0dHBzIC0td2ViIC0tY2xpcGJvYXJkJy1mJGVzY2FwZWRHaCksJ2V4aXQgL2IgJUVSUk9STEVWRUwlJyk7W0lPLkZpbGVdOjpXcml0ZUFsbExpbmVzKCRsb2dpblNjcmlwdCwkbGluZXMsKE5ldy1PYmplY3QgVGV4dC5VVEY4RW5jb2RpbmcoJGZhbHNlKSkpO1dyaXRlLVN0YXRlIDI2ICdHaXRIdWItQW5tZWxkdW5nJyAnSW0gZ2XDtmZmbmV0ZW4gRmVuc3RlciBkZW4gR2Vyw6R0ZWNvZGUgYmVzdMOkdGlnZW4uJyAnd2FpdGluZyc7JGxvZ2luUHJvY2Vzcz1TdGFydC1Qcm9jZXNzIC1GaWxlUGF0aCAnY21kLmV4ZScgLUFyZ3VtZW50TGlzdCBAKCcvZCcsJy9jJywoJyJ7MH0iJy1mJGxvZ2luU2NyaXB0KSktV29ya2luZ0RpcmVjdG9yeSAkcnVudGltZURpcmVjdG9yeSAtV2luZG93U3R5bGUgTm9ybWFsIC1QYXNzVGhydTskZGVhZGxpbmU9KEdldC1EYXRlKS5BZGRNaW51dGVzKDEwKTt3aGlsZSgoR2V0LURhdGUpLWx0JGRlYWRsaW5lKXtBc3NlcnQtTm90Q2FuY2VsbGVkO2lmKFRlc3QtR2l0SHViQXV0aGVudGljYXRpb24gJEdoUGF0aCl7cmV0dXJufTtpZigkbG9naW5Qcm9jZXNzLkhhc0V4aXRlZCl7dGhyb3cnRGllIEdpdEh1Yi1Bbm1lbGR1bmcgd3VyZGUgbmljaHQgYWJnZXNjaGxvc3Nlbi4nfTtTdGFydC1TbGVlcCAtU2Vjb25kcyAyfTt0aHJvdydEaWUgR2l0SHViLUFubWVsZHVuZyB3dXJkZSBuaWNodCBpbm5lcmhhbGIgdm9uIHplaG4gTWludXRlbiBhYmdlc2NobG9zc2VuLicKfQpmdW5jdGlvbiBDaGVjay1Qcm9kdWN0aW9uVmVyc2lvbnt0cnl7JHI9SW52b2tlLVJlc3RNZXRob2QgLVVyaSAiJFB1YmxpY0Jhc2VVcmwvcmVhZHl6P3VwZGF0ZXI9JFN0YW1wIiAtVGltZW91dFNlYyAyMCAtSGVhZGVycyBAeydDYWNoZS1Db250cm9sJz0nbm8tY2FjaGUnOydVc2VyLUFnZW50Jz0iVmVuZG9vLVVwZGF0ZXIvJFVwZGF0ZXJWZXJzaW9uIn07cmV0dXJuW3BzY3VzdG9tb2JqZWN0XUB7UmVhZHk9W2Jvb2xdJHIub2s7VmVyc2lvbj1bc3RyaW5nXSRyLnZlcnNpb259fWNhdGNoe3JldHVybltwc2N1c3RvbW9iamVjdF1Ae1JlYWR5PSRmYWxzZTtWZXJzaW9uPSd1bmJla2FubnQnfX19CmZ1bmN0aW9uIEludm9rZS1MaWZlY3ljbGUoW3N0cmluZ10kQ29tbWFuZCwkSW5wdXRPYmplY3QpeyRqc29uPSRJbnB1dE9iamVjdHxDb252ZXJ0VG8tSnNvbiAtRGVwdGggMjAgLUNvbXByZXNzOyRyPUludm9rZS1FeHRlcm5hbCAkc2NyaXB0Ok5vZGUgQCgkTGlmZWN5Y2xlU2NyaXB0LCRDb21tYW5kKS1JbnB1dFRleHQgJGpzb24gLVRpbWVvdXRTZWNvbmRzIDYwIC1MYWJlbCAiTGlmZWN5Y2xlICRDb21tYW5kIiAtUXVpZXQ7cmV0dXJuKCRyLk91dHB1dHxDb252ZXJ0RnJvbS1Kc29uKX0KZnVuY3Rpb24gQXNzZXJ0LVBhY2thZ2V7CiAgZm9yZWFjaCgkZiBpbkAoJ3BhY2thZ2UuanNvbicsJ3BhY2thZ2UtbG9jay5qc29uJywndXBkYXRlLW1hbmlmZXN0Lmpzb24nLCdyZWxlYXNlLW1hbmlmZXN0Lmpzb24nLCdkYlxzY2hlbWEuc3FsJywndG9vbHNcYXBwbHktcmVsZWFzZS1tYW5pZmVzdC5tanMnLCd0b29sc1x1cGRhdGVyLWxpZmVjeWNsZS0zLjQubWpzJywndG9vbHNcY2hlY2stcmVsZWFzZS1wYXlsb2FkLTMuNC5tanMnKSl7aWYoLW5vdChUZXN0LVBhdGgoSm9pbi1QYXRoICRQYWNrYWdlUm9vdCAkZikpKXt0aHJvdyJQYWtldGRhdGVpIGZlaGx0OiAkZiJ9fQogICRwPUdldC1Db250ZW50KEpvaW4tUGF0aCAkUGFja2FnZVJvb3QgJ3BhY2thZ2UuanNvbicpLVJhdy1FbmNvZGluZyBVVEY4fENvbnZlcnRGcm9tLUpzb247JG09R2V0LUNvbnRlbnQoSm9pbi1QYXRoICRQYWNrYWdlUm9vdCAndXBkYXRlLW1hbmlmZXN0Lmpzb24nKS1SYXctRW5jb2RpbmcgVVRGOHxDb252ZXJ0RnJvbS1Kc29uOyRyPUdldC1Db250ZW50KEpvaW4tUGF0aCAkUGFja2FnZVJvb3QgJ3JlbGVhc2UtbWFuaWZlc3QuanNvbicpLVJhdy1FbmNvZGluZyBVVEY4fENvbnZlcnRGcm9tLUpzb24KICBpZihbc3RyaW5nXSRwLnZlcnNpb24tbmUkVGFyZ2V0VmVyc2lvbi1vcltzdHJpbmddJG0udmVyc2lvbi1uZSRUYXJnZXRWZXJzaW9uLW9yW3N0cmluZ10kci50YXJnZXRWZXJzaW9uLW5lJFRhcmdldFZlcnNpb24pe3Rocm93IlBha2V0LSwgVXBkYXRlLSB1bmQgUmVsZWFzZS1NYW5pZmVzdC1WZXJzaW9uIG3DvHNzZW4gZXhha3QgJFRhcmdldFZlcnNpb24gc2Vpbi4ifTtpZihbc3RyaW5nXSRyLnNjaGVtYS1uZSd2ZW5kb28tcmVsZWFzZS1wYWNrYWdlLXYyJyl7aWYoLW5vdCRTZWxmVGVzdCl7dGhyb3ciQXVzbGllZmVyYmFyZXMgUGFrZXQgYmVuw7Z0aWd0IE1hbmlmZXN0LVNjaGVtYSB2ZW5kb28tcmVsZWFzZS1wYWNrYWdlLXYyLCBnZWZ1bmRlbjogJCgkci5zY2hlbWEpIn19O2lmKFtzdHJpbmddJHIudXBkYXRlclZlcnNpb24tbmUkVXBkYXRlclZlcnNpb24pe3Rocm93IlJlbGVhc2UtTWFuaWZlc3QgZ2Vow7ZydCB6dSBVcGRhdGVyICQoJHIudXBkYXRlclZlcnNpb24pLCBlcndhcnRldCB3aXJkICRVcGRhdGVyVmVyc2lvbi4ifTtmb3JlYWNoKCRuYW1lIGluQCgnc291cmNlQ29tbWl0JywnYmFzZUNvbW1pdCcsJ2NyZWF0ZWRBdCcsJ3BheWxvYWRIYXNoJykpe2lmKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoW3N0cmluZ10kci4kbmFtZSkpe2lmKC1ub3QkU2VsZlRlc3Qpe3Rocm93IlJlbGVhc2UtTWFuaWZlc3QgZW50aMOkbHQga2VpbmUgZ8O8bHRpZ2UgSGVya3VuZnQ6ICRuYW1lIGZlaGx0LiJ9fX07JHNjcmlwdDpNYW5pZmVzdD0kcgp9CmZ1bmN0aW9uIEdldC1NYWluVmVyc2lvbihbc3RyaW5nXSRHaFBhdGgpeyRlbmNvZGVkPShJbnZva2UtRXh0ZXJuYWwgJEdoUGF0aCBAKCdhcGknLCJyZXBvcy8kUmVwb3NpdG9yeS9jb250ZW50cy9wYWNrYWdlLmpzb24/cmVmPSRCYXNlQnJhbmNoIiwnLS1qcScsJy5jb250ZW50JyktVGltZW91dFNlY29uZHMgNjAgLUxhYmVsICdtYWluLVZlcnNpb24gbGVzZW4nIC1RdWlldCkuT3V0cHV0IC1yZXBsYWNlJ1xzJywnJzskdGV4dD1bVGV4dC5FbmNvZGluZ106OlVURjguR2V0U3RyaW5nKFtDb252ZXJ0XTo6RnJvbUJhc2U2NFN0cmluZygkZW5jb2RlZCkpO3JldHVybltzdHJpbmddKCgkdGV4dHxDb252ZXJ0RnJvbS1Kc29uKS52ZXJz \ No newline at end of file diff --git a/.updater34/worker.part03.b64 b/.updater34/worker.part03.b64 deleted file mode 100644 index b778f77..0000000 --- a/.updater34/worker.part03.b64 +++ /dev/null @@ -1 +0,0 @@ -aW9uKX0KZnVuY3Rpb24gR2V0LVJlbGVhc2VPYnNlcnZhdGlvbihbc3RyaW5nXSRHaFBhdGgpewogICRzaGE9KEludm9rZS1FeHRlcm5hbCAkR2hQYXRoIEAoJ2FwaScsInJlcG9zLyRSZXBvc2l0b3J5L2NvbW1pdHMvJEJhc2VCcmFuY2giLCctLWpxJywnLnNoYScpLVRpbWVvdXRTZWNvbmRzIDYwIC1MYWJlbCAnbWFpbi1TSEEgbGVzZW4nIC1RdWlldCkuT3V0cHV0LlRyaW0oKTskdmVyc2lvbj1HZXQtTWFpblZlcnNpb24gJEdoUGF0aDskcHJvZD1DaGVjay1Qcm9kdWN0aW9uVmVyc2lvbgogICRwclJlc3VsdD1JbnZva2UtRXh0ZXJuYWwgJEdoUGF0aCBAKCdwcicsJ2xpc3QnLCctLXJlcG8nLCRSZXBvc2l0b3J5LCctLWhlYWQnLCRCcmFuY2gsJy0tc3RhdGUnLCdhbGwnLCctLWxpbWl0JywnMTAwJywnLS1qc29uJywnbnVtYmVyLHVybCxzdGF0ZSxtZXJnZWRBdCxjbG9zZWRBdCx1cGRhdGVkQXQsaGVhZFJlZk9pZCx0aXRsZScpLVRpbWVvdXRTZWNvbmRzIDYwIC1BbGxvd0ZhaWx1cmUgLUxhYmVsICdSZWxlYXNlLVBScyBlcm1pdHRlbG4nIC1RdWlldDskcHJzPUAoKTtpZigkcHJSZXN1bHQuQ29kZS1lcTAtYW5kJHByUmVzdWx0Lk91dHB1dC5UcmltKCkpeyRyYXc9QCgkcHJSZXN1bHQuT3V0cHV0fENvbnZlcnRGcm9tLUpzb24pO2ZvcmVhY2goJHByIGluJHJhdyl7JHBycys9W3BzY3VzdG9tb2JqZWN0XUB7dGFyZ2V0VmVyc2lvbj0kVGFyZ2V0VmVyc2lvbjtudW1iZXI9JHByLm51bWJlcjt1cmw9JHByLnVybDtzdGF0ZT0kcHIuc3RhdGU7bWVyZ2VkQXQ9JHByLm1lcmdlZEF0O2Nsb3NlZEF0PSRwci5jbG9zZWRBdDt1cGRhdGVkQXQ9JHByLnVwZGF0ZWRBdDtoZWFkUmVmT2lkPSRwci5oZWFkUmVmT2lkO3RpdGxlPSRwci50aXRsZX19fQogIHJldHVybltwc2N1c3RvbW9iamVjdF1Ae01haW5TaGE9JHNoYTtNYWluVmVyc2lvbj0kdmVyc2lvbjtQcm9kdWN0aW9uPSRwcm9kO1B1bGxSZXF1ZXN0cz0kcHJzfQp9CmZ1bmN0aW9uIEdldC1EZWNpc2lvbigkT2JzZXJ2YXRpb24sJFNlc3Npb24pe3JldHVybiBJbnZva2UtTGlmZWN5Y2xlICdkZWNpZGUnIChbb3JkZXJlZF1Ae3RhcmdldFZlcnNpb249JFRhcmdldFZlcnNpb247bWFpblZlcnNpb249JE9ic2VydmF0aW9uLk1haW5WZXJzaW9uO3Byb2R1Y3Rpb25SZWFkeT0kT2JzZXJ2YXRpb24uUHJvZHVjdGlvbi5SZWFkeTtwcm9kdWN0aW9uVmVyc2lvbj0kT2JzZXJ2YXRpb24uUHJvZHVjdGlvbi5WZXJzaW9uO3B1bGxSZXF1ZXN0cz0kT2JzZXJ2YXRpb24uUHVsbFJlcXVlc3RzO3Nlc3Npb249JFNlc3Npb259KX0KZnVuY3Rpb24gQ29tcGxldGUtV2l0aG91dFNvdXJjZShbc3RyaW5nXSRSZWFzb24sJE9ic2VydmF0aW9uLCRTZXNzaW9uKXtmb3JlYWNoKCRpZCBpbkAoJ3dvcmtzcGFjZScsJ3Rlc3RzJywncHVsbHJlcXVlc3QnLCdtZXJnZScsJ2RlcGxveScsJ3ZlcmlmeScpKXtTa2lwLVN0ZXAgJGlkfTskU2Vzc2lvbi5yZWxlYXNlU3RhdGU9J2NvbXBsZXRlZCc7JFNlc3Npb24ucHJvZHVjdGlvblZlcnNpb249JE9ic2VydmF0aW9uLlByb2R1Y3Rpb24uVmVyc2lvbjskU2Vzc2lvbi5jb21wbGV0ZWRBdD0oR2V0LURhdGUpLlRvU3RyaW5nKCdvJyk7U2F2ZS1TZXNzaW9uICRTZXNzaW9uO1dyaXRlLVN0YXRlIDEwMCAnQmVyZWl0cyB2b2xsc3TDpG5kaWcgYWt0dWVsbCcgIlZlbmRvbyAkVGFyZ2V0VmVyc2lvbiBpc3QgaW4gbWFpbiB1bmQgUHJvZHVrdGlvbiBiZXJlaXRzIGJlc3TDpHRpZ3QuIEdydW5kOiAkUmVhc29uIiAnc3VjY2Vzcyc7V3JpdGUtRXZlbnQgJ09LJyAnWmllbHp1c3RhbmQgYmVyZWl0cyBlcnJlaWNodDsga2VpbiBCcmFuY2gsIGtlaW4gUFIgdW5kIGtlaW4gUmVkZXBsb3kgZXJmb3JkZXJsaWNoLid9CmZ1bmN0aW9uIEdldC1PcGVuUHJGcm9tRGVjaXNpb24oJERlY2lzaW9uKXtpZigkRGVjaXNpb24uUFNPYmplY3QuUHJvcGVydGllcy5OYW1lLWNvbnRhaW5zJ3B1bGxSZXF1ZXN0Jyl7cmV0dXJuJERlY2lzaW9uLnB1bGxSZXF1ZXN0fTtyZXR1cm4kbnVsbH0KZnVuY3Rpb24gV2FpdC1SZXF1aXJlZEdpdEh1YkNoZWNrcyhbc3RyaW5nXSRHaFBhdGgsW3N0cmluZ10kUHJVcmwsJFNlc3Npb24pewogICRkZWFkbGluZT0oR2V0LURhdGUpLkFkZE1pbnV0ZXMoNDUpOyRoZWFkPScnOyRoZWFkU2luY2U9R2V0LURhdGU7JGxhc3RNYXRyaXg9JycKICB3aGlsZSgkdHJ1ZSl7QXNzZXJ0LU5vdENhbmNlbGxlZDskcHI9KEludm9rZS1FeHRlcm5hbCAkR2hQYXRoIEAoJ3ByJywndmlldycsJFByVXJsLCctLXJlcG8nLCRSZXBvc2l0b3J5LCctLWpzb24nLCdudW1iZXIsdXJsLHN0YXRlLG1lcmdlZEF0LGhlYWRSZWZPaWQsc3RhdHVzQ2hlY2tSb2xsdXAnKS1UaW1lb3V0U2Vjb25kcyA5MCAtTGFiZWwgJ1BSLUhlYWQgdW5kIENoZWNrcyBsZXNlbicgLVF1aWV0KS5PdXRwdXR8Q29udmVydEZyb20tSnNvbgogICAgaWYoJHByLm1lcmdlZEF0KXtyZXR1cm5bcHNjdXN0b21vYmplY3RdQHtNZXJnZWQ9JHRydWU7SGVhZFNoYT1bc3RyaW5nXSRwci5oZWFkUmVmT2lkO1ByPSRwcn19CiAgICAkY3VycmVudD1bc3RyaW5nXSRwci5oZWFkUmVmT2lkO2lmKC1ub3QkY3VycmVudCl7dGhyb3cnRGVyIFB1bGwgUmVxdWVzdCBtZWxkZXQga2VpbmVuIEhlYWQtU0hBLid9O2lmKCRjdXJyZW50LW5lJGhlYWQpeyRoZWFkPSRjdXJyZW50OyRoZWFkU2luY2U9R2V0LURhdGU7JFNlc3Npb24uZmluYWxQckhlYWRTaGE9JGhlYWQ7U2F2ZS1TZXNzaW9uICRTZXNzaW9uO1dyaXRlLUV2ZW50ICdJTkZPJyAiQWt0dWVsbGVyIFBSLUhlYWQtU0hBOiAkaGVhZC4gQ2hlY2stR3JhY2UtUGVyaW9kIHd1cmRlIG5ldSBnZXN0YXJ0ZXQuIn0KICAgICRydW5zUmVzdWx0PUludm9rZS1FeHRlcm5hbCAkR2hQYXRoIEAoJ2FwaScsInJlcG9zLyRSZXBvc2l0b3J5L2FjdGlvbnMvcnVucz9oZWFkX3NoYT0kaGVhZCZwZXJfcGFnZT0xMDAiKS1UaW1lb3V0U2Vjb25kcyA5MCAtQWxsb3dGYWlsdXJlIC1MYWJlbCAnV29ya2Zsb3ctUnVucyBkZXMgZmluYWxlbiBIZWFkcyBsZXNlbicgLVF1aWV0OyRydW5zPUAoKTtpZigkcnVuc1Jlc3VsdC5Db2RlLWVxMC1hbmQkcnVuc1Jlc3VsdC5PdXRwdXQuVHJpbSgpKXt0cnl7JHJ1bnM9QCgoJHJ1bnNSZXN1bHQuT3V0cHV0fENvbnZlcnRGcm9tLUpzb24pLndvcmtmbG93X3J1bnMpfWNhdGNoeyRydW5zPUAoKX19CiAgICAkZWxhcHNlZD1baW50XSgoR2V0LURhdGUpLSRoZWFkU2luY2UpLlRvdGFsU2Vjb25kczskdGltZWRPdXQ9KEdldC1EYXRlKS1nZSRkZWFkbGluZTskY2xhc3NpZmljYXRpb249SW52b2tlLUxpZmVjeWNsZSAnY2xhc3NpZnktY2hlY2tzJyAoW29yZGVyZWRdQHtjaGVja3M9QCgkcHIuc3RhdHVzQ2hlY2tSb2xsdXApO3dvcmtmbG93UnVucz0kcnVucztlbGFwc2VkU2Vjb25kcz0kZWxhcHNlZDtncmFjZVBlcmlvZFNlY29uZHM9OTA7dGltZWRPdXQ9JHRpbWVkT3V0fSkKICAgICRtYXRyaXg9QCgkY2xhc3NpZmljYXRpb24ucm93c3xGb3JFYWNoLU9iamVjdHsiJCgkXy5uYW1lKTogJCgkXy5zdGF0ZSkgKCQoJF8uY29uY2x1c2lvbikkKCRfLnN0YXR1cykpIn0pLWpvaW4nOyAnCiAgICBpZigkbWF0cml4LW5lJGxhc3RNYXRyaXgtb3IoKEdldC1EYXRlKS0kc2NyaXB0Okxhc3RDaGVja0xvZykuVG90YWxTZWNvbmRzLWdlMzApe1dyaXRlLUV2ZW50ICdJTkZPJyAiR2l0SHViLVN0YXR1cyBmw7xyICRoZWFkOiAkbWF0cml4IjskbGFzdE1hdHJpeD0kbWF0cml4OyRzY3JpcHQ6TGFzdENoZWNrTG9nPUdldC1EYXRlfQogICAgaWYoW3N0cmluZ10kY2xhc3NpZmljYXRpb24uc3RhdGUtZXEnZmFpbGVkJyl7dGhyb3ciRWluIGVyZm9yZGVybGljaGVyIEdpdEh1Yi1DaGVjayBpc3QgZmVobGdlc2NobGFnZW4uYG4kbWF0cml4In0KICAgIGlmKFtzdHJpbmddJGNsYXNzaWZpY2F0aW9uLnN0YXRlLWVxJ3RpbWVvdXQnKXt0aHJvdyJaZWl0bGltaXQgYmVpbSBXYXJ0ZW4gYXVmIEdpdEh1Yi1DaGVja3MgZsO8ciBmaW5hbGVuIEhlYWQgJGhlYWQuYG4kbWF0cml4In0KICAgIGlmKFtzdHJpbmddJGNsYXNzaWZpY2F0aW9uLnN0YXRlLWVxJ3N1Y2Nlc3MnKXskdmVyaWZ5PShJbnZva2UtRXh0ZXJuYWwgJEdoUGF0aCBAKCdwcicsJ3ZpZXcnLCRQclVybCwnLS1yZXBvJywkUmVwb3NpdG9yeSwnLS1qc29uJywnaGVhZFJlZk9pZCcpLVRpbWVvdXRTZWNvbmRzIDYwIC1MYWJlbCAnRmluYWxlbiBQUi1IZWFkIGJlc3TDpHRpZ2VuJyAtUXVpZXQpLk91dHB1dHxDb252ZXJ0RnJvbS1Kc29uO2lmKFtzdHJpbmddJHZlcmlmeS5oZWFkUmVmT2lkLWVxJGhlYWQpe3JldHVybltwc2N1c3RvbW9iamVjdF1Ae01lcmdlZD0kZmFsc2U7SGVhZFNoYT0kaGVhZDtQcj0kcHJ9fTtXcml0ZS1FdmVudCAnSU5GTycgJ1BSLUhlYWQgw6RuZGVydGUgc2ljaCBuYWNoIGVyZm9sZ3JlaWNoZXIgQ2hlY2stQXVzd2VydHVuZzsgQXVzd2VydHVuZyB3aXJkIGbDvHIgZGVuIG5ldWVuIEhlYWQgd2llZGVyaG9sdC4nfQogICAgV3JpdGUtU3RhdGUgODAgJ0dpdEh1Yi1DaGVja3MnICJGaW5hbGVyIEhlYWQgJGhlYWQ6ICQoJGNsYXNzaWZpY2F0aW9uLnJlYXNvbikuIjtTdGFydC1TbGVlcCAtU2Vjb25kcyAxMAogIH0KfQpmdW5jdGlvbiBFbnN1cmUtRGVwbG95bWVudCgkU2Vzc2lvbil7CiAgJHByb2Q9Q2hlY2stUHJvZHVjdGlvblZlcnNpb247aWYoJHByb2QuUmVhZHktYW5kJHByb2QuVmVyc2lvbi1lcSRUYXJnZXRWZXJzaW9uKXtXcml0ZS1FdmVudCAnT0snICdQcm9kdWt0aW9uIG1lbGRldCBkaWUgWmllbHZlcnNpb24gYmVyZWl0czsgUmVkZXBsb3ktV2FydGVwaGFzZSBlbnRmw6RsbHQuJztDb21wbGV0ZS1TdGVwICdkZXBsb3knO3JldHVybiRwcm9kfQogIGlmKCRTa2lwUHJvZHVjdGlvbkRlcGxveSl7U2tpcC1TdGVwICdkZXBsb3knO1NraXAtU3RlcCAndmVyaWZ5JztXcml0ZS1TdGF0ZSAxMDAgJ1NvdXJjZSBha3R1YWxpc2llcnQnICdHaXRIdWIgd3VyZGUgYWt0dWFsaXNpZXJ0OyBkYXMgUHJvZHVrdGlvbnNkZXBsb3ltZW50IHd1cmRlIGF1ZiBXdW5zY2ggw7xiZXJzcHJ1bmdlbi4nICdzdWNjZXNzJztyZXR1cm4kbnVsbH0KICBTZXQtU3RlcCAnZGVwbG95JyAnYWN0aXZlJztXcml0ZS1TdGF0ZSA4OCAnQ29vbGlmeSBBdXRvIERlcGxveScgJ21haW4gaXN0IGF1ZiBaaWVsc3RhbmQuIENvb2xpZnkgw7xiZXJuaW1tdCBkYXMgRGVwbG95bWVudCDDvGJlciBkaWUgYmVzdGVoZW5kZSBHaXRIdWItVmVya27DvHBmdW5nLic7JFNlc3Npb24ucmVsZWFzZVN0YXRlPSdkZXBsb3lpbmcnO1NhdmUtU2Vzc2lvbiAkU2Vzc2lvbjskZGVhZGxpbmU9KEdldC1EYXRlKS5BZGRNaW51dGVzKDE1KTskbmV4dExvZz1HZXQtRGF0ZTskbGFzdD0nJwogIGRve0Fzc2VydC1Ob3RDYW5jZWxsZWQ7JHByb2Q9Q2hlY2stUHJvZHVjdGlvblZlcnNpb247JGxhc3Q9InJlYWR5PSQoJHByb2QuUmVhZHkpLCB2ZXJzaW9uPSQoJHByb2QuVmVyc2lvbikiO2lmKChHZXQtRGF0ZSktZ2UkbmV4dExvZyl7V3JpdGUtRXZlbnQgJ0lORk8nICJDb29saWZ5IEF1dG8gRGVwbG95OiAkbGFzdCI7JG5leHRMb2c9KEdldC1EYXRlKS5BZGRTZWNvbmRzKDMwKX07aWYoJHByb2QuUmVhZHktYW5kJHByb2QuVmVyc2lvbi1lcSRUYXJnZXRWZXJzaW9uKXticmVha307U3RhcnQtU2xlZXAgLVNlY29uZHMgMTB9d2hpbGUoKEdldC1EYXRlKS1sdCRkZWFkbGluZSkKICBpZigtbm90KCRwcm9kLlJlYWR5LWFuZCRwcm9kLlZlcnNpb24tZXEkVGFyZ2V0VmVyc2lvbikpe3Rocm93IkNvb2xpZnkgaGF0IGRpZSBaaWVsdmVyc2lvbiBpbm5lcmhhbGIgdm9uIDE1IE1pbnV0ZW4gbmljaHQgYmVyZWl0Z2VzdGVsbHQuIExldHp0ZXIgU3RhbmQ6ICRsYXN0LiJ9O0NvbXBsZXRlLVN0ZXAgJ2RlcGxveSc7cmV0dXJuJHByb2QKfQoKdHJ5ewogIFdyaXRlLUV2ZW50ICdJTkZPJyAiVmVuZG9vIFByb2R1Y3Rpb24gVXBkYXRlciAkVXBkYXRlclZlcnNpb24gZ2VzdGFydGV0LiBaaWVsdmVyc2lvbiAkVGFyZ2V0VmVyc2lvbi4iCiAgU2V0LVN0ZXAgJ3BhY2thZ2UnICdhY3RpdmUnO1dyaXRlLVN0YXRlIDMgJ1Bha2V0cHLDvGZ1bmcnICdWZXJzaW9uLCBIZXJrdW5mdCwgUGF5bG9hZC1IYXNoIHVuZCBNYW5pZmVzdCB3ZXJkZW4gZ2VwcsO8ZnQuJztBc3NlcnQtUGFja2FnZTskc2Vzc2lvbj1Mb2FkLVNlc3Npb247aWYoJFNlbGZUZXN0RmFpbEF0LWVxJ3BhY2thZ2UnKXt0aHJvdydTaW11bGllcnRlciBQYWtldGZlaGxlci4nfTtDb21wbGV0ZS1TdGVwICdwYWNrYWdlJztXcml0ZS1FdmVudCAnT0snICJQYWtldHByw7xmdW5nIGVyZm9sZ3JlaWNoLiBwYXlsb2FkSGFzaD0kKCRzY3JpcHQ6TWFuaWZlc3QucGF5bG9hZEhhc2gpLCBzb3VyY2VDb21taXQ9JCgkc2NyaXB0Ok1hbmlmZXN0LnNvdXJjZUNvbW1pdCksIGJhc2VDb21taXQ9JCgkc2NyaXB0Ok1hbmlmZXN0LmJhc2VDb21taXQpLiIKICBTZXQtU3RlcCAndG9vbHMnICdhY3RpdmUnO1dyaXRlLVN0YXRlIDkgJ1N5c3RlbXByw7xmdW5nJyAnR2l0LCBOb2RlLmpzLCBucG0gdW5kIEdpdEh1YiBDTEkgd2VyZGVuIGdlcHLDvGZ0Lic7JHNjcmlwdDpHaXQ9R2V0LUdpdFBhdGg7aWYoLW5vdCRzY3JpcHQ6R2l0KXt0aHJvdydHaXQgZsO8ciBXaW5kb3dzIHd1cmRlIG5pY2h0IGdlZnVuZGVuLid9OyRzY3JpcHQ6Tm9kZT1HZXQtTm9kZVBhdGg7JHNjcmlwdDpOcG09R2V0LU5wbVBhdGg7aWYoLW5vdCRzY3JpcHQ6Tm9kZS1vci1ub3Qkc2NyaXB0Ok5wbSl7dGhyb3cnTm9kZS5qcyAyMiBMVFMgb2RlciBucG0gd3VyZGUgbmljaHQgZ2VmdW5kZW4uJ307JG52PUludm9rZS1FeHRlcm5hbCAkc2NyaXB0Ok5vZGUgQCgnLS12ZXJzaW9uJyktVGltZW91dFNlY29uZHMgMjAgLUxhYmVsICdOb2RlLmpzIHByw7xmZW4nO2lmKCRudi5PdXRwdXQtbm90bWF0Y2gndj8oXGQrKVwuJy1vcltpbnRdJE1hdGNoZXNbMV0tbHQyMil7dGhyb3cnTm9kZS5qcyAyMiBvZGVyIG5ldWVyIGlzdCBlcmZvcmRlcmxpY2guJ307JGdoPUVuc3VyZS1HaXRIdWJDbGk7Q29tcGxldGUtU3RlcCAndG9vbHMnCiAgU2V0LVN0ZXAgJ2dpdGh1YicgJ2FjdGl2ZSc7V3JpdGUtU3RhdGUgMjIgJ0dpdEh1Yi1WZXJiaW5kdW5nJyAnQW5tZWxkdW5nIHVuZCBSZXBvc2l0b3J5LUJlcmVjaHRpZ3VuZ2VuIHdlcmRlbiBnZXByw7xmdC4nO2lmKC1ub3QoVGVzdC1HaXRIdWJBdXRoZW50aWNhdGlvbiAkZ2gpKXtJbnZva2UtVmlzaWJsZUdpdEh1YkxvZ2luICRnaH07SW52b2tlLUV4dGVybmFsICRnaCBAKCdhdXRoJywnc2V0dXAtZ2l0JywnLS1ob3N0bmFtZScsJ2dpdGh1Yi5jb20nKS1UaW1lb3V0U2Vjb25kcyA2MCAtTGFiZWwgJ0dpdC1Bbm1lbGR1bmcga29uZmlndXJpZXJlbid8T3V0LU51bGw7JHJlcG89KEludm9rZS1FeHRlcm5hbCAkZ2ggQCgncmVwbycsJ3ZpZXcnLCRSZXBvc2l0b3J5LCctLWpzb24nLCd2aWV3ZXJQZXJtaXNzaW9uLGRlZmF1bHRCcmFuY2hSZWYsaXNQcml2YXRlJyktVGltZW91dFNlY29uZHMgNjAgLUxhYmVsICdSZXBvc2l0b3J5LVp1Z3JpZmYgcHLDvGZlbicpLk91dHB1dHxDb252ZXJ0RnJvbS1Kc29uO2lmKFtzdHJpbmddJHJlcG8udmlld2VyUGVybWlzc2lvbi1ub3RpbkAoJ0FETUlOJywnTUFJTlRBSU4nLCdXUklURScpKXt0aHJvdyJGw7xyICRSZXBvc2l0b3J5IGZlaGx0IFNjaHJlaWJ6dWdyaWZmLiJ9O0NvbXBsZXRlLVN0ZXAgJ2dpdGh1YicKICBTZXQtU3RlcCAncHJvZHVjdGlvbicgJ2FjdGl2ZSc7V3JpdGUtU3RhdGUgMzEgJ1ppZWx6dXN0YW5kJyAnbWFpbiwgUHJvZHVrdGlvbiwgYmVzdGVoZW5kZSBQUnMgdW5kIFNpdHp1bmcgd2VyZGVuIHZvciBqZWRlciDDhG5kZXJ1bmcgYWJnZWdsaWNoZW4uJzskb2JzZXJ2YXRpb249R2V0LVJlbGVhc2VPYnNlcnZhdGlvbiAkZ2g7JGRlY2lzaW9uPUdldC1EZWNpc2lvbiAkb2JzZXJ2YXRpb24gJHNlc3Npb247V3JpdGUtRXZlbnQgJ0lORk8nICJMaWZlY3ljbGUtRW50c2NoZWlkdW5nOiAkKCRkZWNpc2lvbi5hY3Rpb24pIC8gJCgkZGVjaXNpb24ucmVhc29uKTsgbWFpbj0kKCRvYnNlcnZhdGlvbi5NYWluVmVyc2lvbilAJCgkb2JzZXJ2YXRpb24uTWFpblNoYSk7IHByb2R1Y3Rpb249JCgkb2JzZXJ2YXRpb24uUHJvZHVjdGlvbi5WZXJzaW9uKS4iO0NvbXBsZXRlLVN0ZXAgJ3Byb2R1Y3Rpb24nCiAgaWYoJFNlbGZUZXN0KXtmb3JlYWNoKCRpZCBpbkAoJ3dvcmtzcGFjZScsJ3Rlc3RzJywncHVsbHJlcXVlc3QnLCdtZXJnZScsJ2RlcGxveScsJ3ZlcmlmeScpKXtTZXQtU3RlcCAkaWQgJ2FjdGl2ZSc7U3RhcnQtU2xlZXAgLU1pbGxpc2Vjb25kcyAxMjA7Q29tcGxldGUtU3RlcCAkaWR9O1dyaXRlLVN0YXRlIDEwMCAnU2VsYnN0dGVzdCBlcmZvbGdyZWljaCcgJ1VwZGF0ZXItMy40LU9iZXJmbMOkY2hlIHVuZCBIb3N0LVZlcnRyYWcgZnVua3Rpb25pZXJlbi4nICdzdWNjZXNzJztyZXR1cm59CiAgaWYoW3N0cmluZ10kZGVjaXNpb24uYWN0aW9uLWVxJ2NvbXBsZXRlJyl7Q29tcGxldGUtV2l0aG91dFNvdXJjZSAkZGVjaXNpb24ucmVhc29uICRvYnNlcnZhdGlvbiAkc2Vzc2lvbjtyZXR1cm59CiAgJHByVXJsPScnOyRwck51bWJlcj0kbnVsbDskc291cmNlUmVxdWlyZWQ9KFtzdHJpbmddJGRlY2lzaW9uLmFjdGlvbi1lcSdzb3VyY2UnKQogIGlmKFtzdHJpbmddJGRlY2lzaW9uLmFjdGlvbi1lcSdyZXN1bWUtcHInKXskcHI9R2V0LU9wZW5QckZyb21EZWNpc2lvbiAkZGVjaXNpb247JHByVXJsPVtzdHJpbmddJHByLnVybDskcHJOdW1iZXI9JHByLm51bWJlcjskc2Vzc2lvbi5wclVybD0kcHJVcmw7JHNlc3Npb24ucHJOdW1iZXI9JHByTnVtYmVyOyRzZXNzaW9uLnJlbGVhc2VTdGF0ZT0nY2hlY2tzJztTYXZlLVNlc3Npb24gJHNlc3Npb247Zm9yZWFjaCgkaWQgaW4AKCd3b3Jrc3BhY2UnLCd0ZXN0cycpKXtTa2lwLVN0ZXAgJGlkfTtDb21wbGV0ZS1TdGVwICdwdWxscmVxdWVzdCc7V3JpdGUtRXZlbnQgJ0lORk8nICJWb3JoYW5kZW5lciBvZmZlbmVyIFB1bGwgUmVxdWVzdCB3aXJkIMO8YmVybm9tbWVuOiAkcHJVcmwifQogIGVsc2VpZihbc3RyaW5nXSRkZWNpc2lvbi5hY3Rpb24tZXEnZGVwbG95Jyl7Zm9y \ No newline at end of file diff --git a/.updater34/worker.part04.b64 b/.updater34/worker.part04.b64 deleted file mode 100644 index b7f958a..0000000 --- a/.updater34/worker.part04.b64 +++ /dev/null @@ -1 +0,0 @@ -ZWFjaCgkaWQgaW4AKCd3b3Jrc3BhY2UnLCd0ZXN0cycsJ3B1bGxyZXF1ZXN0JywnbWVyZ2UnKSl7U2tpcC1TdGVwICRpZH07JHNvdXJjZVJlcXVpcmVkPSRmYWxzZX0KICBpZigkc291cmNlUmVxdWlyZWQpewogICAgU2V0LVN0ZXAgJ3dvcmtzcGFjZScgJ2FjdGl2ZSc7V3JpdGUtU3RhdGUgNDAgJ1BheWxvYWQtU2ljaGVyaGVpdHNwcsO8ZnVuZycgJ21haW4gd2lyZCBpc29saWVydCBnZWtsb250OyBIZXJrdW5mdCB1bmQgbcO2Z2xpY2hlIFLDvGNrc2Nocml0dGUgd2VyZGVuIHZvciBkZW0gT3ZlcmxheSBnZXByw7xmdC4nO2lmKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJFdvcmtSb290KXtSZW1vdmUtSXRlbSAkV29ya1Jvb3QgLVJlY3Vyc2UgLUZvcmNlfTtOZXctSXRlbSAtSXRlbVR5cGUgRGlyZWN0b3J5IC1QYXRoICRXb3JrUm9vdCAtRm9yY2V8T3V0LU51bGw7SW52b2tlLUV4dGVybmFsICRnaCBAKCdyZXBvJywnY2xvbmUnLCRSZXBvc2l0b3J5LCRDbG9uZURpciwnLS0nLCctLWJyYW5jaCcsJEJhc2VCcmFuY2gsJy0tc2luZ2xlLWJyYW5jaCcpLVdvcmtpbmdEaXJlY3RvcnkgJFdvcmtSb290IC1UaW1lb3V0U2Vjb25kcyAzMDAgLUxhYmVsICdSZXBvc2l0b3J5IGtsb25lbid8T3V0LU51bGwKICAgICRndWFyZD1JbnZva2UtRXh0ZXJuYWwgJHNjcmlwdDpOb2RlIEAoJFBheWxvYWRHdWFyZFNjcmlwdCwkUGFja2FnZVJvb3QsJENsb25lRGlyLFtzdHJpbmddJHNjcmlwdDpNYW5pZmVzdC5iYXNlQ29tbWl0LFtzdHJpbmddJG9ic2VydmF0aW9uLk1haW5TaGEpLVRpbWVvdXRTZWNvbmRzIDMwMCAtQWxsb3dGYWlsdXJlIC1MYWJlbCAnVmVyYWx0ZXRlbiBQYXlsb2FkIGF1c3NjaGxpZcOfZW4nO2lmKCRndWFyZC5Db2RlLW5lMCl7JGRldGFpbD0nJzt0cnl7JGc9JGd1YXJkLk91dHB1dHxDb252ZXJ0RnJvbS1Kc29uOyRkZXRhaWw9QCgkZy5jb25mbGljdHMpLWpvaW4nLCAnfWNhdGNoeyRkZXRhaWw9JGd1YXJkLk91dHB1dH07dGhyb3ciUGF5bG9hZC1Sw7xja3NjaHJpdHQgYmxvY2tpZXJ0LiBiYXNlQ29tbWl0PSQoJHNjcmlwdDpNYW5pZmVzdC5iYXNlQ29tbWl0KSwgbWFpbj0kKCRvYnNlcnZhdGlvbi5NYWluU2hhKS4gS29uZmxpa3RlOiAkZGV0YWlsIn0KICAgIEludm9rZS1FeHRlcm5hbCAkc2NyaXB0OkdpdCBAKCdzd2l0Y2gnLCctYycsJEJyYW5jaCwkb2JzZXJ2YXRpb24uTWFpblNoYSktV29ya2luZ0RpcmVjdG9yeSAkQ2xvbmVEaXIgLVRpbWVvdXRTZWNvbmRzIDYwIC1MYWJlbCAnRGV0ZXJtaW5pc3Rpc2NoZW4gUmVsZWFzZS1CcmFuY2ggZXJzdGVsbGVuJ3xPdXQtTnVsbDtJbnZva2UtRXh0ZXJuYWwgJHNjcmlwdDpOb2RlIEAoKEpvaW4tUGF0aCAkUGFja2FnZVJvb3QgJ3Rvb2xzXGFwcGx5LXJlbGVhc2UtbWFuaWZlc3QubWpzJyksJFBhY2thZ2VSb290LCRDbG9uZURpciktVGltZW91dFNlY29uZHMgMzAwIC1MYWJlbCAnU0hBLTI1Ni1nZXByw7xmdGVzIFJlbGVhc2UtTWFuaWZlc3QgYW53ZW5kZW4nfE91dC1OdWxsO0NvbXBsZXRlLVN0ZXAgJ3dvcmtzcGFjZScKICAgIFNldC1TdGVwICd0ZXN0cycgJ2FjdGl2ZSc7V3JpdGUtU3RhdGUgNTUgJ0FibmFobWV0ZXN0cycgJ25wbSBjaSB1bmQgZGVyIHZvbGxzdMOkbmRpZ2UgUmVsZWFzZXZlcnRyYWcgd2VyZGVuIGF1ZiBkZW0gc2ljaGVyZW4gT3ZlcmxheSBhdXNnZWbDvGhydC4nO0ludm9rZS1FeHRlcm5hbCAkc2NyaXB0Ok5wbSBAKCdjaScsJy0tbm8tYXVkaXQnLCctLW5vLWZ1bmQnKS1Xb3JraW5nRGlyZWN0b3J5ICRDbG9uZURpciAtVGltZW91dFNlY29uZHMgMTIwMCAtTGFiZWwgJ25wbSBjaSd8T3V0LU51bGw7SW52b2tlLUV4dGVybmFsICRzY3JpcHQ6TnBtIEAoJ3J1bicsJ3ZlcmlmeTphbGwnKS1Xb3JraW5nRGlyZWN0b3J5ICRDbG9uZURpciAtVGltZW91dFNlY29uZHMgMzYwMCAtTGFiZWwgJ25wbSBydW4gdmVyaWZ5OmFsbCd8T3V0LU51bGw7Q29tcGxldGUtU3RlcCAndGVzdHMnCiAgICAkbGF0ZXN0PUdldC1SZWxlYXNlT2JzZXJ2YXRpb24gJGdoOyRsYXRlRGVjaXNpb249R2V0LURlY2lzaW9uICRsYXRlc3QgJHNlc3Npb247aWYoW3N0cmluZ10kbGF0ZURlY2lzaW9uLmFjdGlvbi1lcSdjb21wbGV0ZScpe0NvbXBsZXRlLVdpdGhvdXRTb3VyY2UgJ3RhcmdldC1yZWFjaGVkLWR1cmluZy1sb2NhbC10ZXN0cycgJGxhdGVzdCAkc2Vzc2lvbjtyZXR1cm59ZWxzZWlmKFtzdHJpbmddJGxhdGVEZWNpc2lvbi5hY3Rpb24tZXEncmVzdW1lLXByJyl7JHByPUdldC1PcGVuUHJGcm9tRGVjaXNpb24gJGxhdGVEZWNpc2lvbjskcHJVcmw9W3N0cmluZ10kcHIudXJsOyRwck51bWJlcj0kcHIubnVtYmVyO1dyaXRlLUV2ZW50ICdJTkZPJyAiUGFyYWxsZWxlciBMYXVmIGhhdCBiZXJlaXRzIGVpbmVuIFBSIGVyemV1Z3Q7IGRpZXNlciB3aXJkIMO8YmVybm9tbWVuOiAkcHJVcmwifWVsc2VpZihbc3RyaW5nXSRsYXRlRGVjaXNpb24uYWN0aW9uLWVxJ2RlcGxveScpe2ZvcmVhY2goJGlkIGluQCgncHVsbHJlcXVlc3QnLCdtZXJnZScpKXtTa2lwLVN0ZXAgJGlkfTskc291cmNlUmVxdWlyZWQ9JGZhbHNlfWVsc2V7CiAgICAgIFNldC1TdGVwICdwdWxscmVxdWVzdCcgJ2FjdGl2ZSc7V3JpdGUtU3RhdGUgNzAgJ1B1bGwgUmVxdWVzdCcgJ0JyYW5jaCB1bmQgUHVsbCBSZXF1ZXN0IHdlcmRlbiBpZGVtcG90ZW50IGFiZ2VnbGljaGVuLic7SW52b2tlLUV4dGVybmFsICRzY3JpcHQ6R2l0IEAoJ2NvbmZpZycsJ3VzZXIubmFtZScsJ1ZlbmRvbyBQcm9kdWN0aW9uIFVwZGF0ZXInKS1Xb3JraW5nRGlyZWN0b3J5ICRDbG9uZURpciAtTGFiZWwgJ0dpdC1OYW1lIHNldHplbid8T3V0LU51bGw7JHVpZD0oSW52b2tlLUV4dGVybmFsICRnaCBAKCdhcGknLCd1c2VyJywnLS1qcScsJy5pZCcpLUxhYmVsICdHaXRIdWItQmVudXR6ZXItSUQnKS5PdXRwdXQuVHJpbSgpOyR1bG9naW49KEludm9rZS1FeHRlcm5hbCAkZ2ggQCgnYXBpJywndXNlcicsJy0tanEnLCcubG9naW4nKS1MYWJlbCAnR2l0SHViLUJlbnV0emVybmFtZScpLk91dHB1dC5UcmltKCk7SW52b2tlLUV4dGVybmFsICRzY3JpcHQ6R2l0IEAoJ2NvbmZpZycsJ3VzZXIuZW1haWwnLCIkdWlkKyR1bG9naW5AdXNlcnMubm9yZXBseS5naXRodWIuY29tIiktV29ya2luZ0RpcmVjdG9yeSAkQ2xvbmVEaXIgLUxhYmVsICdHaXQtRS1NYWlsIHNldHplbid8T3V0LU51bGw7SW52b2tlLUV4dGVybmFsICRzY3JpcHQ6R2l0IEAoJ2FkZCcsJy0tYWxsJyktV29ya2luZ0RpcmVjdG9yeSAkQ2xvbmVEaXIgLUxhYmVsICfDhG5kZXJ1bmdlbiB2b3JtZXJrZW4nfE91dC1OdWxsOyRkaWZmPUludm9rZS1FeHRlcm5hbCAkc2NyaXB0OkdpdCBAKCdkaWZmJywnLS1jYWNoZWQnLCctLXF1aWV0JyktV29ya2luZ0RpcmVjdG9yeSAkQ2xvbmVEaXIgLUFsbG93RmFpbHVyZSAtTGFiZWwgJ8OEbmRlcnVuZ2VuIHByw7xmZW4nO2lmKCRkaWZmLkNvZGUtbmUxKXt0aHJvdydQYXlsb2FkIGVyemV1Z3QgZ2VnZW7DvGJlciBtYWluIGtlaW5lbiBnw7xsdGlnZW4gbmV1ZW4gU291cmNlLVN0YW5kLid9O0ludm9rZS1FeHRlcm5hbCAkc2NyaXB0OkdpdCBAKCdjb21taXQnLCctbScsInJlbGVhc2U6IFZlbmRvbyAkVGFyZ2V0VmVyc2lvbiBwcm9kdWN0aW9uIHVwZGF0ZSB2aWEgdXBkYXRlciAzLjQiKS1Xb3JraW5nRGlyZWN0b3J5ICRDbG9uZURpciAtVGltZW91dFNlY29uZHMgMTIwIC1MYWJlbCAnUmVsZWFzZSBjb21taXR0ZW4nfE91dC1OdWxsCiAgICAgICRyZW1vdGVMaW5lPShJbnZva2UtRXh0ZXJuYWwgJHNjcmlwdDpHaXQgQCgnbHMtcmVtb3RlJywnLS1oZWFkcycsJ29yaWdpbicsInJlZnMvaGVhZHMvJEJyYW5jaCIpLVdvcmtpbmdEaXJlY3RvcnkgJENsb25lRGlyIC1UaW1lb3V0U2Vjb25kcyA2MCAtQWxsb3dGYWlsdXJlIC1MYWJlbCAnUmVtb3RlLUJyYW5jaCBwcsO8ZmVuJyAtUXVpZXQpLk91dHB1dC5UcmltKCk7aWYoJHJlbW90ZUxpbmUpeyRyZW1vdGVTaGE9KCRyZW1vdGVMaW5lLXNwbGl0J1xzKycpWzBdO0ludm9rZS1FeHRlcm5hbCAkc2NyaXB0OkdpdCBAKCdwdXNoJywiLS1mb3JjZS13aXRoLWxlYXNlPXJlZnMvaGVhZHMvJEJyYW5jaGA6JHJlbW90ZVNoYSIsJy0tc2V0LXVwc3RyZWFtJywnb3JpZ2luJywkQnJhbmNoKS1Xb3JraW5nRGlyZWN0b3J5ICRDbG9uZURpciAtVGltZW91dFNlY29uZHMgMzAwIC1MYWJlbCAnQmVzdGVoZW5kZW4gUmVsZWFzZS1CcmFuY2ggc2ljaGVyIGFrdHVhbGlzaWVyZW4nfE91dC1OdWxsfWVsc2V7SW52b2tlLUV4dGVybmFsICRzY3JpcHQ6R2l0IEAoJ3B1c2gnLCctLXNldC11cHN0cmVhbScsJ29yaWdpbicsJEJyYW5jaCktV29ya2luZ0RpcmVjdG9yeSAkQ2xvbmVEaXIgLVRpbWVvdXRTZWNvbmRzIDMwMCAtTGFiZWwgJ1JlbGVhc2UtQnJhbmNoIHB1c2hlbid8T3V0LU51bGx9CiAgICAgICRleGlzdGluZz1JbnZva2UtRXh0ZXJuYWwgJGdoIEAoJ3ByJywnbGlzdCcsJy0tcmVwbycsJFJlcG9zaXRvcnksJy0taGVhZCcsJEJyYW5jaCwnLS1zdGF0ZScsJ29wZW4nLCctLWpzb24nLCdudW1iZXIsdXJsJywnLS1qcScsJy5bMF0nKS1BbGxvd0ZhaWx1cmUgLUxhYmVsICdWb3JoYW5kZW5lbiBQdWxsIFJlcXVlc3QgZXJuZXV0IHN1Y2hlbicgLVF1aWV0O2lmKCRleGlzdGluZy5PdXRwdXQuVHJpbSgpKXskZXhpc3RpbmdPYmo9JGV4aXN0aW5nLk91dHB1dHxDb252ZXJ0RnJvbS1Kc29uOyRwclVybD1bc3RyaW5nXSRleGlzdGluZ09iai51cmw7JHByTnVtYmVyPSRleGlzdGluZ09iai5udW1iZXJ9ZWxzZXskYm9keT1Kb2luLVBhdGggJFdvcmtSb290ICdwci1ib2R5Lm1kJzskYm9keVRleHQ9IiMjIFZlbmRvbyAkVGFyZ2V0VmVyc2lvbiDigJMgUHJvZHVjdGlvbiBVcGRhdGVgcmBuYHJgbkVyc3RlbGx0IGR1cmNoIFZlbmRvbyBQcm9kdWN0aW9uIFVwZGF0ZXIgJFVwZGF0ZXJWZXJzaW9uLmByYG5gcmBuLSB2b2xsc3TDpG5kaWdlcyBgYG5wbSBydW4gdmVyaWZ5OmFsbGBgIGVyZm9sZ3JlaWNoYHJgbi0gUGF5bG9hZC1IZXJrdW5mdCB1bmQgUsO8Y2tzY2hyaXR0c2NodXR6IGdlcHLDvGZ0YHJgbi0ga2VpbmUgRGF0ZW5iYW5rZW4sIFVwbG9hZHMsIFNlY3JldHMgb2RlciBgYC9hcHAvZGF0YWBgLUluaGFsdGVgcmBuLSBHaXRIdWItQ2hlY2tzIHdlcmRlbiBhbSBmaW5hbGVuIEhlYWQtU0hBIGF1c2dld2VydGV0YHJgbiI7W0lPLkZpbGVdOjpXcml0ZUFsbFRleHQoJGJvZHksJGJvZHlUZXh0LChOZXctT2JqZWN0IFRleHQuVVRGOEVuY29kaW5nKCRmYWxzZSkpKTskY3JlYXRlZD0oSW52b2tlLUV4dGVybmFsICRnaCBAKCdwcicsJ2NyZWF0ZScsJy0tcmVwbycsJFJlcG9zaXRvcnksJy0tYmFzZScsJEJhc2VCcmFuY2gsJy0taGVhZCcsJEJyYW5jaCwnLS10aXRsZScsIlZlbmRvbyAkVGFyZ2V0VmVyc2lvbiDigJMgUHJvZHVjdGlvbiBVcGRhdGUiLCctLWJvZHktZmlsZScsJGJvZHkpLVdvcmtpbmdEaXJlY3RvcnkgJENsb25lRGlyIC1UaW1lb3V0U2Vjb25kcyAxODAgLUxhYmVsICdQdWxsIFJlcXVlc3QgZXJzdGVsbGVuJykuT3V0cHV0LlRyaW0oKTskcHJVcmw9JGNyZWF0ZWQ7JHBySW5mbz0oSW52b2tlLUV4dGVybmFsICRnaCBAKCdwcicsJ3ZpZXcnLCRwclVybCwnLS1yZXBvJywkUmVwb3NpdG9yeSwnLS1qc29uJywnbnVtYmVyJyktVGltZW91dFNlY29uZHMgNjAgLUxhYmVsICdQUi1OdW1tZXIgbGVzZW4nIC1RdWlldCkuT3V0cHV0fENvbnZlcnRGcm9tLUpzb247JHByTnVtYmVyPSRwckluZm8ubnVtYmVyfQogICAgICAkc2Vzc2lvbi5wclVybD0kcHJVcmw7JHNlc3Npb24ucHJOdW1iZXI9JHByTnVtYmVyOyRzZXNzaW9uLnJlbGVhc2VTdGF0ZT0nY2hlY2tzJztTYXZlLVNlc3Npb24gJHNlc3Npb247Q29tcGxldGUtU3RlcCAncHVsbHJlcXVlc3QnO1dyaXRlLUV2ZW50ICdPSycgIlB1bGwgUmVxdWVzdDogJHByVXJsIgogICAgfQogIH0KICBpZigkcHJVcmwpe1NldC1TdGVwICdtZXJnZScgJ2FjdGl2ZSc7V3JpdGUtU3RhdGUgNzggJ0dpdEh1Yi1DaGVja3MnICdXb3JrZmxvdy1SdW5zIHVuZCBQZmxpY2h0Y2hlY2tzIHdlcmRlbiBmw7xyIGRlbiBqZXdlaWxzIGFrdHVlbGxlbiBQUi1IZWFkIHZlcmZvbGd0Lic7JGNoZWNrUmVzdWx0PVdhaXQtUmVxdWlyZWRHaXRIdWJDaGVja3MgJGdoICRwclVybCAkc2Vzc2lvbjtpZigtbm90JGNoZWNrUmVzdWx0Lk1lcmdlZCl7V3JpdGUtU3RhdGUgODQgJ01lcmdlJyAnRGVyIGdlcHLDvGZ0ZSBmaW5hbGUgSGVhZCB3aXJkIGF0b21hciBwZXIgU3F1YXNoIG5hY2ggbWFpbiDDvGJlcm5vbW1lbi4nO0ludm9rZS1FeHRlcm5hbCAkZ2ggQCgncHInLCdtZXJnZScsJHByVXJsLCctLXJlcG8nLCRSZXBvc2l0b3J5LCctLXNxdWFzaCcsJy0tZGVsZXRlLWJyYW5jaCcsJy0tc3ViamVjdCcsIlZlbmRvbyAkVGFyZ2V0VmVyc2lvbiDigJMgUHJvZHVjdGlvbiBVcGRhdGUiLCctLW1hdGNoLWhlYWQtY29tbWl0Jyxbc3RyaW5nXSRjaGVja1Jlc3VsdC5IZWFkU2hhKS1Xb3JraW5nRGlyZWN0b3J5ICRDbG9uZURpciAtVGltZW91dFNlY29uZHMgMzAwIC1MYWJlbCAnUHVsbCBSZXF1ZXN0IG1lcmdlbid8T3V0LU51bGx9OyRtZXJnZWRJbmZvPShJbnZva2UtRXh0ZXJuYWwgJGdoIEAoJ3ByJywndmlldycsJHByVXJsLCctLXJlcG8nLCRSZXBvc2l0b3J5LCctLWpzb24nLCdtZXJnZWRBdCxtZXJnZUNvbW1pdCxoZWFkUmVmT2lkLHN0YXRlJyktVGltZW91dFNlY29uZHMgNjAgLUxhYmVsICdNZXJnZS1FcmdlYm5pcyBiZXN0w6R0aWdlbicgLVF1aWV0KS5PdXRwdXR8Q29udmVydEZyb20tSnNvbjtpZigtbm90JG1lcmdlZEluZm8ubWVyZ2VkQXQpe3Rocm93J0RlciBQdWxsIFJlcXVlc3Qgd3VyZGUgbmljaHQgYWxzIGdlbWVyZ3QgYmVzdMOkdGlndC4nfTskc2Vzc2lvbi5maW5hbFBySGVhZFNoYT1bc3RyaW5nXSRtZXJnZWRJbmZvLmhlYWRSZWZPaWQ7JHNlc3Npb24ubWVyZ2VDb21taXQ9W3N0cmluZ10kbWVyZ2VkSW5mby5tZXJnZUNvbW1pdC5vaWQ7JHNlc3Npb24ucmVsZWFzZVN0YXRlPSdtZXJnZWQnO1NhdmUtU2Vzc2lvbiAkc2Vzc2lvbjtDb21wbGV0ZS1TdGVwICdtZXJnZSc7V3JpdGUtRXZlbnQgJ09LJyAiTWVyZ2UgYmVzdMOkdGlndDogJCgkc2Vzc2lvbi5tZXJnZUNvbW1pdCkifQogICRwcm9kPUVuc3VyZS1EZXBsb3ltZW50ICRzZXNzaW9uO2lmKCRTa2lwUHJvZHVjdGlvbkRlcGxveSl7cmV0dXJufTtTZXQtU3RlcCAndmVyaWZ5JyAnYWN0aXZlJztXcml0ZS1TdGF0ZSA5NyAnUHJvZHVrdGlvbnNwcsO8ZnVuZycgJ0RpZSDDtmZmZW50bGljaGUgUmVhZGluZXNzIHVuZCBkaWUgZXhha3RlIFppZWx2ZXJzaW9uIHdlcmRlbiBhYnNjaGxpZcOfZW5kIGJlc3TDpHRpZ3QuJztpZigkbnVsbC1lcSRwcm9kKXskcHJvZD1DaGVjay1Qcm9kdWN0aW9uVmVyc2lvbn07aWYoLW5vdCgkcHJvZC5SZWFkeS1hbmQkcHJvZC5WZXJzaW9uLWVxJFRhcmdldFZlcnNpb24pKXt0aHJvdyJEaWUgYWJzY2hsaWXDn2VuZGUgUHJvZHVrdGlvbnNwcsO8ZnVuZyBpc3QgZmVobGdlc2NobGFnZW46IHJlYWR5PSQoJHByb2QuUmVhZHkpLCB2ZXJzaW9uPSQoJHByb2QuVmVyc2lvbikifTtDb21wbGV0ZS1TdGVwICd2ZXJpZnknOyRzZXNzaW9uLnByb2R1Y3Rpb25WZXJzaW9uPSRwcm9kLlZlcnNpb247JHNlc3Npb24ucmVsZWFzZVN0YXRlPSdjb21wbGV0ZWQnOyRzZXNzaW9uLmNvbXBsZXRlZEF0PShHZXQtRGF0ZSkuVG9TdHJpbmcoJ28nKTtTYXZlLVNlc3Npb24gJHNlc3Npb247V3JpdGUtU3RhdGUgMTAwICdVcGRhdGUgZXJmb2xncmVpY2gnICJWZW5kb28gJFRhcmdldFZlcnNpb24gbMOkdWZ0IGdlcHLDvGZ0IGluIFByb2R1a3Rpb24uIiAnc3VjY2Vzcyc7V3JpdGUtRXZlbnQgJ09LJyAiVmVuZG9vICRUYXJnZXRWZXJzaW9uIHd1cmRlIHZvbGxzdMOkbmRpZyB1bmQgaWRlbXBvdGVudCBha3R1YWxpc2llcnQuIgp9Y2F0Y2hbU3lzdGVtLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uXXtGYWlsLVN0ZXA7V3JpdGUtU3RhdGUgMTAwICdVcGRhdGUgYWJnZWJyb2NoZW4nICRfLkV4Y2VwdGlvbi5NZXNzYWdlICdjYW5jZWxsZWQnICRfLkV4Y2VwdGlvbi5NZXNzYWdlICdEZXIgZ2VzcGVpY2hlcnRlIFdpZWRlcmF1Zm5haG1lcHVua3QgYmxlaWJ0IGVyaGFsdGVuLic7V3JpdGUtRXZlbnQgJ1dBUk4nICRfLkV4Y2VwdGlvbi5NZXNzYWdlCn1jYXRjaHtGYWlsLVN0ZXA7JG1zZz0kXy5FeGNlcHRpb24uTWVzc2FnZTskcmVtZWRpYXRpb249aWYoJHNjcmlwdDpDdXJyZW50U3RlcC1pbkAoJ2RlcGxveScsJ3ZlcmlmeScpKXsnbWFpbiBrYW5uIGJlcmVpdHMgYWt0dWFsaXNpZXJ0IHNlaW4uIEVpbiBlcm5ldXRlciBTdGFydCBzZXR6dCBiZWkgRGVwbG95bWVudCB1bmQgUHJvZHVrdGlvbnNwcsO8ZnVuZyBmb3J0Lid9ZWxzZWlmKCRtc2ctbWF0Y2gnUGF5bG9hZC1Sw7xja3NjaHJpdHQnKXsnRGFzIFBha2V0IGlzdCBnZWdlbsO8YmVyIG1haW4gdmVyYWx0ZXQuIEtlaW4gQnJhbmNoIHVuZCBrZWluIFBSIHd1cmRlbiBhdXMgZGllc2VtIFBheWxvYWQgZXJzdGVsbHQuIEVpbiBuZXVlcyBQYWtldCBhdXMgYWt0dWVsbGVtIG1haW4gZXJ6ZXVnZW4uJ31lbHNleydFaW4gZXJuZXV0ZXIgU3RhcnQgZ2xlaWNodCBtYWluLCBQUiwgZmluYWxlbiBIZWFkLVNIQSB1bmQgU2l0enVuZyBlcm5ldXQgYWI7IGJlcmVpdHMgYWJnZXNjaGxvc3NlbmUgUGhhc2VuIHdlcmRlbiBuaWNodCBkdXBsaXppZXJ0Lid9O1dyaXRlLVN0YXRlIDEwMCAnVXBkYXRlIHNpY2hlciBnZXN0b3BwdCcgJG1zZyAnZmFpbGVkJyAkbXNnICRyZW1lZGlhdGlvbjtXcml0ZS1FdmVudCAnRVJST1InICRtc2cKfWZpbmFsbHl7aWYoVGVzdC1QYXRoICRJbnB1dEZpbGUpe1JlbW92ZS1JdGVtICRJbnB1dEZpbGUgLUZvcmNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlfX0K \ No newline at end of file diff --git a/.updater34/worker.ps1.gz b/.updater34/worker.ps1.gz deleted file mode 100644 index c2b4709..0000000 Binary files a/.updater34/worker.ps1.gz and /dev/null differ diff --git a/scripts/updater/Vendoo.Updater.Worker34.ps1 b/scripts/updater/Vendoo.Updater.Worker34.ps1 new file mode 100644 index 0000000..ba2818a --- /dev/null +++ b/scripts/updater/Vendoo.Updater.Worker34.ps1 @@ -0,0 +1,155 @@ +[CmdletBinding()] +param( + [Parameter(Mandatory=$true)][string]$StatusFile, + [Parameter(Mandatory=$true)][string]$EventFile, + [Parameter(Mandatory=$true)][string]$InputFile, + [Parameter(Mandatory=$true)][string]$CancelFile, + [Parameter(Mandatory=$true)][string]$SessionFile, + [Parameter(Mandatory=$true)][string]$LogFile, + [switch]$SkipProductionDeploy, + [switch]$SelfTest, + [string]$SelfTestFailAt = '' +) + +Set-StrictMode -Version 2.0 +$ErrorActionPreference='Stop';$ProgressPreference='SilentlyContinue' +Add-Type -AssemblyName System.Net.Http +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$PackageRoot=(Resolve-Path -LiteralPath (Join-Path $PSScriptRoot '..\..') -ErrorAction Stop).ProviderPath.TrimEnd([System.IO.Path]::DirectorySeparatorChar,[System.IO.Path]::AltDirectorySeparatorChar) +$Repository='Masterluke77/vendoo';$BaseBranch='main';$TargetVersion='1.43.0';$UpdaterVersion='3.4.0';$PublicBaseUrl='https://vendoo.flatlined.de' +$Branch="release/$TargetVersion-production-update-v4" +$LocalRoot=Join-Path $env:LOCALAPPDATA 'Vendoo\Updater';$ToolsRoot=Join-Path $LocalRoot 'tools';$LogsRoot=Join-Path $LocalRoot 'logs';$WorkRoot=Join-Path $LocalRoot "work\$TargetVersion-v4";$CloneDir=Join-Path $WorkRoot 'repository' +New-Item -ItemType Directory -Path $ToolsRoot,$LogsRoot,(Split-Path -Parent $SessionFile) -Force|Out-Null +$Stamp=Get-Date -Format 'yyyyMMdd-HHmmss';$script:Tools=@{};$script:CurrentStep='package';$script:LastHeartbeat=Get-Date;$script:LastCheckLog=[DateTime]::MinValue +$LifecycleScript=Join-Path $PackageRoot 'tools\updater-lifecycle-3.4.mjs' +$PayloadGuardScript=Join-Path $PackageRoot 'tools\check-release-payload-3.4.mjs' +$script:Steps=@( + [ordered]@{id='package';title='Paket prüfen';state='pending'},[ordered]@{id='tools';title='System prüfen';state='pending'},[ordered]@{id='github';title='GitHub verbinden';state='pending'}, + [ordered]@{id='production';title='Zielzustand erkennen';state='pending'},[ordered]@{id='workspace';title='Payload sicher vorbereiten';state='pending'},[ordered]@{id='tests';title='Vollständig testen';state='pending'}, + [ordered]@{id='pullrequest';title='Pull Request abgleichen';state='pending'},[ordered]@{id='merge';title='Finalen Head prüfen und mergen';state='pending'},[ordered]@{id='deploy';title='Coolify deployen';state='pending'},[ordered]@{id='verify';title='Produktion bestätigen';state='pending'} +) + +function Write-Event([string]$Level,[string]$Message){ + $safe=$Message -replace '(?i)(https://[^\s]*(?:token|webhook)[^\s]*)','[VERDECKT]' + $entry=[ordered]@{at=(Get-Date).ToString('o');level=$Level.ToUpperInvariant();message=$safe}|ConvertTo-Json -Compress + [IO.File]::AppendAllText($EventFile,$entry+[Environment]::NewLine,(New-Object Text.UTF8Encoding($false))) + [IO.File]::AppendAllText($LogFile,"$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [$($Level.ToUpperInvariant())] $safe$([Environment]::NewLine)",(New-Object Text.UTF8Encoding($false))) +} +function Write-State([int]$Percent,[string]$Phase,[string]$Detail,[string]$State='running',[string]$Error='',[string]$Remediation='', $Request=$null){ + $payload=[ordered]@{version=$TargetVersion;updaterVersion=$UpdaterVersion;percent=[Math]::Max(0,[Math]::Min(100,$Percent));phase=$Phase;detail=$Detail;state=$State;error=$Error;remediation=$Remediation;updatedAt=(Get-Date).ToString('o');logFile=$LogFile;sessionFile=$SessionFile;steps=$script:Steps;request=$Request}|ConvertTo-Json -Depth 10 + $tmp="$StatusFile.$PID.tmp";[IO.File]::WriteAllText($tmp,$payload,(New-Object Text.UTF8Encoding($false)));Move-Item -LiteralPath $tmp -Destination $StatusFile -Force +} +function Set-Step([string]$Id,[string]$State){foreach($s in $script:Steps){if($s.id -eq $Id){$s.state=$State}elseif($State -eq 'active' -and $s.state -eq 'active'){$s.state='pending'}};$script:CurrentStep=$Id} +function Complete-Step([string]$Id){foreach($s in $script:Steps){if($s.id -eq $Id){$s.state='done'}}} +function Skip-Step([string]$Id){foreach($s in $script:Steps){if($s.id -eq $Id){$s.state='skipped'}}} +function Fail-Step{foreach($s in $script:Steps){if($s.id -eq $script:CurrentStep){$s.state='failed'}}} +function Assert-NotCancelled{if(Test-Path -LiteralPath $CancelFile){throw [System.OperationCanceledException]::new('Das Update wurde durch den Benutzer abgebrochen.')}} +function Add-OrSetProperty($Object,[string]$Name,$Value){if($Object.PSObject.Properties.Name -contains $Name){$Object.$Name=$Value}else{$Object|Add-Member -NotePropertyName $Name -NotePropertyValue $Value}} +function Save-Session($Data){ + Add-OrSetProperty $Data 'schema' 'vendoo-updater-session-v2';Add-OrSetProperty $Data 'repository' $Repository;Add-OrSetProperty $Data 'targetVersion' $TargetVersion;Add-OrSetProperty $Data 'updaterVersion' $UpdaterVersion;Add-OrSetProperty $Data 'payloadHash' $script:Manifest.payloadHash;Add-OrSetProperty $Data 'branch' $Branch;Add-OrSetProperty $Data 'updatedAt' (Get-Date).ToString('o') + $tmp="$SessionFile.tmp";$json=$Data|ConvertTo-Json -Depth 10;[IO.File]::WriteAllText($tmp,$json,(New-Object Text.UTF8Encoding($false)));Move-Item $tmp $SessionFile -Force +} +function New-Session{return [pscustomobject]@{schema='vendoo-updater-session-v2';repository=$Repository;targetVersion=$TargetVersion;updaterVersion=$UpdaterVersion;payloadHash=[string]$script:Manifest.payloadHash;branch=$Branch;releaseState='new';prNumber=$null;prUrl='';finalPrHeadSha='';mergeCommit='';productionVersion='';completedAt='';updatedAt=''}} +function Load-Session{ + if(Test-Path -LiteralPath $SessionFile){try{$saved=Get-Content $SessionFile -Raw -Encoding UTF8|ConvertFrom-Json;if([string]$saved.schema-eq'vendoo-updater-session-v2' -and [string]$saved.repository-eq$Repository -and [string]$saved.targetVersion-eq$TargetVersion -and [string]$saved.payloadHash-eq[string]$script:Manifest.payloadHash){return $saved};Write-Event 'INFO' 'Veralteter oder anderer Updater-Sitzungsstand wird nicht übernommen.'}catch{Write-Event 'WARN' 'Gespeicherter Sitzungsstand ist ungültig und wird verworfen.'}} + return New-Session +} +function Quote-Arg([string]$Value){if($null -eq $Value){return '""'};if($Value -notmatch '[\s"]'){return $Value};return '"'+($Value -replace '(\\*)"','$1$1\"' -replace '(\\+)$','$1$1')+'"'} +function Stop-Tree([int]$ProcessId){try{& taskkill.exe /PID $ProcessId /T /F 2>$null|Out-Null}catch{try{Stop-Process -Id $ProcessId -Force -ErrorAction SilentlyContinue}catch{}}} +function Get-TailText([string]$Text,[int]$MaxLength){if([string]::IsNullOrWhiteSpace($Text)){return ''};$value=$Text.Trim();if($value.Length -gt $MaxLength){return $value.Substring($value.Length-$MaxLength)};return $value} +function Get-ProcessFailureSummary([string]$StdErr,[string]$StdOut){$parts=New-Object Collections.Generic.List[string];$e=Get-TailText $StdErr 2200;$o=Get-TailText $StdOut 1200;if($e){$parts.Add("Fehlerausgabe:`n$e")};if($o){$parts.Add("Letzte Standardausgabe:`n$o")};if($parts.Count-eq0){return 'Der Prozess lieferte keine Diagnoseausgabe.'};return($parts-join"`n`n")} +function Invoke-External{ + param([string]$File,[string[]]$Arguments,[string]$WorkingDirectory=$PackageRoot,[int]$TimeoutSeconds=120,[switch]$AllowFailure,[string]$InputText='',[string]$Label='Prozess',[switch]$Quiet) + Assert-NotCancelled + $psi=New-Object Diagnostics.ProcessStartInfo;$psi.FileName=$File;$psi.Arguments=(@($Arguments|ForEach-Object{Quote-Arg([string]$_)})-join' ');$psi.WorkingDirectory=$WorkingDirectory;$psi.UseShellExecute=$false;$psi.CreateNoWindow=$true;$psi.RedirectStandardOutput=$true;$psi.RedirectStandardError=$true;$psi.RedirectStandardInput=$true + $utf8=New-Object Text.UTF8Encoding($false);if($psi.PSObject.Properties.Name-contains'StandardOutputEncoding'){$psi.StandardOutputEncoding=$utf8};if($psi.PSObject.Properties.Name-contains'StandardErrorEncoding'){$psi.StandardErrorEncoding=$utf8} + $psi.EnvironmentVariables['NO_COLOR']='1';$psi.EnvironmentVariables['FORCE_COLOR']='0';$psi.EnvironmentVariables['NPM_CONFIG_COLOR']='false';$psi.EnvironmentVariables['NPM_CONFIG_UNICODE']='true' + $p=New-Object Diagnostics.Process;$p.StartInfo=$psi;if(-not$Quiet){Write-Event 'INFO' "$Label gestartet."};if(-not$p.Start()){throw "$Label konnte nicht gestartet werden."};$outTask=$p.StandardOutput.ReadToEndAsync();$errTask=$p.StandardError.ReadToEndAsync();if($InputText){$p.StandardInput.Write($InputText)};$p.StandardInput.Close();$sw=[Diagnostics.Stopwatch]::StartNew() + while(-not$p.WaitForExit(500)){if(Test-Path -LiteralPath $CancelFile){Stop-Tree $p.Id;throw [System.OperationCanceledException]::new('Das Update wurde durch den Benutzer abgebrochen.')};if($sw.Elapsed.TotalSeconds-gt$TimeoutSeconds){Stop-Tree $p.Id;throw "$Label hat das Zeitlimit von $TimeoutSeconds Sekunden überschritten."};if(-not$Quiet-and((Get-Date)-$script:LastHeartbeat).TotalSeconds-ge8){Write-Event 'INFO' ("$Label läuft seit {0:mm\:ss}."-f$sw.Elapsed);$script:LastHeartbeat=Get-Date}} + $p.WaitForExit();$stdout=[string]$outTask.Result;$stderr=[string]$errTask.Result;$code=$p.ExitCode;$p.Dispose() + if(-not$Quiet){foreach($line in@($stdout-split"`r?`n")){if($line.Trim()){Write-Event 'OUTPUT' $line.Trim()}};foreach($line in@($stderr-split"`r?`n")){$clean=$line.Trim();if(-not$clean){continue};if($code-ne0){Write-Event 'ERROR' $clean}elseif($clean-match'(?i)\b(warn|warning|deprecated)\b'){Write-Event 'WARN' $clean}else{Write-Event 'OUTPUT' $clean}}} + if(-not$AllowFailure-and$code-ne0){throw "$Label ist mit Exit-Code $code fehlgeschlagen.`n$(Get-ProcessFailureSummary $stderr $stdout)"};return[pscustomobject]@{Code=$code;Output=$stdout;Error=$stderr} +} +function Resolve-Tool([string]$Name,[string[]]$Candidates=@()){if($script:Tools.ContainsKey($Name)-and(Test-Path -LiteralPath $script:Tools[$Name])){return$script:Tools[$Name]};foreach($c in@($Candidates)){if($c-and(Test-Path -LiteralPath $c -PathType Leaf)){$script:Tools[$Name]=(Resolve-Path $c).Path;return$script:Tools[$Name]}};$cmd=Get-Command $Name -CommandType Application -ErrorAction SilentlyContinue|Select-Object -First 1;if($cmd-and$cmd.Source-and(Test-Path $cmd.Source)){$script:Tools[$Name]=$cmd.Source;return$cmd.Source};return$null} +function Get-GitPath{return Resolve-Tool 'git.exe' @("$env:ProgramFiles\Git\cmd\git.exe","$env:LOCALAPPDATA\Programs\Git\cmd\git.exe")} +function Get-NodePath{return Resolve-Tool 'node.exe' @("$env:ProgramFiles\nodejs\node.exe","$env:LOCALAPPDATA\Programs\nodejs\node.exe")} +function Get-NpmPath{return Resolve-Tool 'npm.cmd' @("$env:ProgramFiles\nodejs\npm.cmd","$env:LOCALAPPDATA\Programs\nodejs\npm.cmd")} +function Invoke-WebJson([string]$Uri){for($i=1;$i-le3;$i++){try{return Invoke-RestMethod -Uri $Uri -Headers @{'User-Agent'="Vendoo-Updater/$UpdaterVersion";'Accept'='application/vnd.github+json'} -TimeoutSec 30}catch{if($i-eq3){throw};Start-Sleep -Seconds(2*$i)}}} +function Download-File([string]$Uri,[string]$Destination,[string]$Label){for($attempt=1;$attempt-le3;$attempt++){try{$handler=New-Object Net.Http.HttpClientHandler;$client=[Net.Http.HttpClient]::new($handler);$client.Timeout=[TimeSpan]::FromMinutes(5);$client.DefaultRequestHeaders.UserAgent.ParseAdd("Vendoo-Updater/$UpdaterVersion");$resp=$client.GetAsync($Uri,[Net.Http.HttpCompletionOption]::ResponseHeadersRead).Result;$null=$resp.EnsureSuccessStatusCode();$input=$resp.Content.ReadAsStreamAsync().Result;$output=[IO.File]::Open($Destination,[IO.FileMode]::Create,[IO.FileAccess]::Write,[IO.FileShare]::None);try{$buf=New-Object byte[] 65536;while(($read=$input.Read($buf,0,$buf.Length))-gt0){Assert-NotCancelled;$output.Write($buf,0,$read)}}finally{$output.Dispose();$input.Dispose();$resp.Dispose();$client.Dispose();$handler.Dispose()};return}catch{if($attempt-eq3){throw "$Label konnte nach drei Versuchen nicht geladen werden: $($_.Exception.Message)"};Start-Sleep -Seconds(3*$attempt)}}} +function Ensure-GitHubCli{ + $managed=Join-Path $ToolsRoot 'github-cli\current\bin\gh.exe';if(Test-Path $managed){$test=Invoke-External $managed @('--version') -TimeoutSeconds 20 -AllowFailure -Label 'GitHub CLI prüfen' -Quiet;if($test.Code-eq0){$script:Tools['gh.exe']=$managed;return$managed}} + Write-State 18 'GitHub CLI' 'Die offizielle portable GitHub CLI wird sicher geladen und per SHA-256 geprüft.';$release=Invoke-WebJson 'https://api.github.com/repos/cli/cli/releases/latest';$arch=if([Environment]::Is64BitOperatingSystem){'amd64'}else{'386'};$asset=@($release.assets|Where-Object{$_.name-like"gh_*_windows_$arch.zip"}|Select-Object -First 1);$checks=@($release.assets|Where-Object{$_.name-like'*_checksums.txt'}|Select-Object -First 1);if(-not$asset-or-not$checks){throw'Die offiziellen GitHub-CLI-Release-Dateien konnten nicht ermittelt werden.'} + $tmp=Join-Path $env:TEMP "vendoo-gh-$PID";New-Item -ItemType Directory -Path $tmp -Force|Out-Null;$zip=Join-Path $tmp $asset.name;$checkFile=Join-Path $tmp $checks.name;$extract=Join-Path $tmp 'extract' + try{Download-File $asset.browser_download_url $zip 'GitHub CLI';Download-File $checks.browser_download_url $checkFile 'Prüfsummen';$line=Get-Content $checkFile|Where-Object{$_-match[regex]::Escape($asset.name)}|Select-Object -First 1;if(-not$line){throw'Für das GitHub-CLI-Archiv wurde keine offizielle Prüfsumme gefunden.'};$expected=($line-split'\s+')[0].ToLowerInvariant();$actual=(Get-FileHash $zip -Algorithm SHA256).Hash.ToLowerInvariant();if($actual-ne$expected){throw'SHA-256-Prüfung der GitHub CLI fehlgeschlagen.'};New-Item -ItemType Directory -Path $extract -Force|Out-Null;Expand-Archive $zip $extract -Force;$source=Get-ChildItem $extract -Filter gh.exe -File -Recurse|Select-Object -First 1;if(-not$source){throw'Das geprüfte GitHub-CLI-Archiv enthält keine gh.exe.'};$targetRoot=Split-Path -Parent(Split-Path -Parent $managed);if(Test-Path $targetRoot){Remove-Item $targetRoot -Recurse -Force};New-Item -ItemType Directory -Path(Split-Path -Parent $managed)-Force|Out-Null;Copy-Item $source.FullName $managed -Force;$null=Invoke-External $managed @('--version') -TimeoutSeconds 20 -Label 'GitHub CLI validieren';$script:Tools['gh.exe']=$managed;Write-Event 'OK' "GitHub CLI $($release.tag_name) wurde geprüft und lokal bereitgestellt.";return$managed}finally{Remove-Item $tmp -Recurse -Force -ErrorAction SilentlyContinue} +} +function Test-GitHubAuthentication([string]$GhPath){$status=Invoke-External $GhPath @('auth','status','--hostname','github.com') -TimeoutSeconds 20 -AllowFailure -Label 'GitHub-Anmeldung prüfen' -Quiet;return($status.Code-eq0)} +function Invoke-VisibleGitHubLogin([string]$GhPath){ + $runtimeDirectory=Split-Path -Parent $StatusFile;$loginScript=Join-Path $runtimeDirectory 'github-login.cmd';$escapedGh=$GhPath.Replace('"','""');$lines=@('@echo off','chcp 65001 >nul','title Vendoo - GitHub Anmeldung','echo Vendoo - Sichere GitHub Anmeldung','echo.','echo Folge dem Browserdialog zur GitHub-Anmeldung.','echo.',('"{0}" auth login --hostname github.com --git-protocol https --web --clipboard'-f$escapedGh),'exit /b %ERRORLEVEL%');[IO.File]::WriteAllLines($loginScript,$lines,(New-Object Text.UTF8Encoding($false)));Write-State 26 'GitHub-Anmeldung' 'Im geöffneten Fenster den Gerätecode bestätigen.' 'waiting';$loginProcess=Start-Process -FilePath 'cmd.exe' -ArgumentList @('/d','/c',('"{0}"'-f$loginScript))-WorkingDirectory $runtimeDirectory -WindowStyle Normal -PassThru;$deadline=(Get-Date).AddMinutes(10);while((Get-Date)-lt$deadline){Assert-NotCancelled;if(Test-GitHubAuthentication $GhPath){return};if($loginProcess.HasExited){throw'Die GitHub-Anmeldung wurde nicht abgeschlossen.'};Start-Sleep -Seconds 2};throw'Die GitHub-Anmeldung wurde nicht innerhalb von zehn Minuten abgeschlossen.' +} +function Check-ProductionVersion{try{$r=Invoke-RestMethod -Uri "$PublicBaseUrl/readyz?updater=$Stamp" -TimeoutSec 20 -Headers @{'Cache-Control'='no-cache';'User-Agent'="Vendoo-Updater/$UpdaterVersion"};return[pscustomobject]@{Ready=[bool]$r.ok;Version=[string]$r.version}}catch{return[pscustomobject]@{Ready=$false;Version='unbekannt'}}} +function Invoke-Lifecycle([string]$Command,$InputObject){$json=$InputObject|ConvertTo-Json -Depth 20 -Compress;$r=Invoke-External $script:Node @($LifecycleScript,$Command)-InputText $json -TimeoutSeconds 60 -Label "Lifecycle $Command" -Quiet;return($r.Output|ConvertFrom-Json)} +function Assert-Package{ + foreach($f in@('package.json','package-lock.json','update-manifest.json','release-manifest.json','db\schema.sql','tools\apply-release-manifest.mjs','tools\updater-lifecycle-3.4.mjs','tools\check-release-payload-3.4.mjs')){if(-not(Test-Path(Join-Path $PackageRoot $f))){throw"Paketdatei fehlt: $f"}} + $p=Get-Content(Join-Path $PackageRoot 'package.json')-Raw-Encoding UTF8|ConvertFrom-Json;$m=Get-Content(Join-Path $PackageRoot 'update-manifest.json')-Raw-Encoding UTF8|ConvertFrom-Json;$r=Get-Content(Join-Path $PackageRoot 'release-manifest.json')-Raw-Encoding UTF8|ConvertFrom-Json + if([string]$p.version-ne$TargetVersion-or[string]$m.version-ne$TargetVersion-or[string]$r.targetVersion-ne$TargetVersion){throw"Paket-, Update- und Release-Manifest-Version müssen exakt $TargetVersion sein."};if([string]$r.schema-ne'vendoo-release-package-v2'){if(-not$SelfTest){throw"Auslieferbares Paket benötigt Manifest-Schema vendoo-release-package-v2, gefunden: $($r.schema)"}};if([string]$r.updaterVersion-ne$UpdaterVersion){throw"Release-Manifest gehört zu Updater $($r.updaterVersion), erwartet wird $UpdaterVersion."};foreach($name in@('sourceCommit','baseCommit','createdAt','payloadHash')){if([string]::IsNullOrWhiteSpace([string]$r.$name)){if(-not$SelfTest){throw"Release-Manifest enthält keine gültige Herkunft: $name fehlt."}}};$script:Manifest=$r +} +function Get-MainVersion([string]$GhPath){$encoded=(Invoke-External $GhPath @('api',"repos/$Repository/contents/package.json?ref=$BaseBranch",'--jq','.content')-TimeoutSeconds 60 -Label 'main-Version lesen' -Quiet).Output -replace'\s','';$text=[Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($encoded));return[string](($text|ConvertFrom-Json).version)} +function Get-ReleaseObservation([string]$GhPath){ + $sha=(Invoke-External $GhPath @('api',"repos/$Repository/commits/$BaseBranch",'--jq','.sha')-TimeoutSeconds 60 -Label 'main-SHA lesen' -Quiet).Output.Trim();$version=Get-MainVersion $GhPath;$prod=Check-ProductionVersion + $prResult=Invoke-External $GhPath @('pr','list','--repo',$Repository,'--head',$Branch,'--state','all','--limit','100','--json','number,url,state,mergedAt,closedAt,updatedAt,headRefOid,title')-TimeoutSeconds 60 -AllowFailure -Label 'Release-PRs ermitteln' -Quiet;$prs=@();if($prResult.Code-eq0-and$prResult.Output.Trim()){$raw=@($prResult.Output|ConvertFrom-Json);foreach($pr in$raw){$prs+=[pscustomobject]@{targetVersion=$TargetVersion;number=$pr.number;url=$pr.url;state=$pr.state;mergedAt=$pr.mergedAt;closedAt=$pr.closedAt;updatedAt=$pr.updatedAt;headRefOid=$pr.headRefOid;title=$pr.title}}} + return[pscustomobject]@{MainSha=$sha;MainVersion=$version;Production=$prod;PullRequests=$prs} +} +function Get-Decision($Observation,$Session){return Invoke-Lifecycle 'decide' ([ordered]@{targetVersion=$TargetVersion;mainVersion=$Observation.MainVersion;productionReady=$Observation.Production.Ready;productionVersion=$Observation.Production.Version;pullRequests=$Observation.PullRequests;session=$Session})} +function Complete-WithoutSource([string]$Reason,$Observation,$Session){foreach($id in@('workspace','tests','pullrequest','merge','deploy','verify')){Skip-Step $id};$Session.releaseState='completed';$Session.productionVersion=$Observation.Production.Version;$Session.completedAt=(Get-Date).ToString('o');Save-Session $Session;Write-State 100 'Bereits vollständig aktuell' "Vendoo $TargetVersion ist in main und Produktion bereits bestätigt. Grund: $Reason" 'success';Write-Event 'OK' 'Zielzustand bereits erreicht; kein Branch, kein PR und kein Redeploy erforderlich.'} +function Get-OpenPrFromDecision($Decision){if($Decision.PSObject.Properties.Name-contains'pullRequest'){return$Decision.pullRequest};return$null} +function Wait-RequiredGitHubChecks([string]$GhPath,[string]$PrUrl,$Session){ + $deadline=(Get-Date).AddMinutes(45);$head='';$headSince=Get-Date;$lastMatrix='' + while($true){Assert-NotCancelled;$pr=(Invoke-External $GhPath @('pr','view',$PrUrl,'--repo',$Repository,'--json','number,url,state,mergedAt,headRefOid,statusCheckRollup')-TimeoutSeconds 90 -Label 'PR-Head und Checks lesen' -Quiet).Output|ConvertFrom-Json + if($pr.mergedAt){return[pscustomobject]@{Merged=$true;HeadSha=[string]$pr.headRefOid;Pr=$pr}} + $current=[string]$pr.headRefOid;if(-not$current){throw'Der Pull Request meldet keinen Head-SHA.'};if($current-ne$head){$head=$current;$headSince=Get-Date;$Session.finalPrHeadSha=$head;Save-Session $Session;Write-Event 'INFO' "Aktueller PR-Head-SHA: $head. Check-Grace-Period wurde neu gestartet."} + $runsResult=Invoke-External $GhPath @('api',"repos/$Repository/actions/runs?head_sha=$head&per_page=100")-TimeoutSeconds 90 -AllowFailure -Label 'Workflow-Runs des finalen Heads lesen' -Quiet;$runs=@();if($runsResult.Code-eq0-and$runsResult.Output.Trim()){try{$runs=@(($runsResult.Output|ConvertFrom-Json).workflow_runs)}catch{$runs=@()}} + $elapsed=[int]((Get-Date)-$headSince).TotalSeconds;$timedOut=(Get-Date)-ge$deadline;$classification=Invoke-Lifecycle 'classify-checks' ([ordered]@{checks=@($pr.statusCheckRollup);workflowRuns=$runs;elapsedSeconds=$elapsed;gracePeriodSeconds=90;timedOut=$timedOut}) + $matrix=@($classification.rows|ForEach-Object{"$($_.name): $($_.state) ($($_.conclusion)$($_.status))"})-join'; ' + if($matrix-ne$lastMatrix-or((Get-Date)-$script:LastCheckLog).TotalSeconds-ge30){Write-Event 'INFO' "GitHub-Status für $head: $matrix";$lastMatrix=$matrix;$script:LastCheckLog=Get-Date} + if([string]$classification.state-eq'failed'){throw"Ein erforderlicher GitHub-Check ist fehlgeschlagen.`n$matrix"} + if([string]$classification.state-eq'timeout'){throw"Zeitlimit beim Warten auf GitHub-Checks für finalen Head $head.`n$matrix"} + if([string]$classification.state-eq'success'){$verify=(Invoke-External $GhPath @('pr','view',$PrUrl,'--repo',$Repository,'--json','headRefOid')-TimeoutSeconds 60 -Label 'Finalen PR-Head bestätigen' -Quiet).Output|ConvertFrom-Json;if([string]$verify.headRefOid-eq$head){return[pscustomobject]@{Merged=$false;HeadSha=$head;Pr=$pr}};Write-Event 'INFO' 'PR-Head änderte sich nach erfolgreicher Check-Auswertung; Auswertung wird für den neuen Head wiederholt.'} + Write-State 80 'GitHub-Checks' "Finaler Head $head: $($classification.reason).";Start-Sleep -Seconds 10 + } +} +function Ensure-Deployment($Session){ + $prod=Check-ProductionVersion;if($prod.Ready-and$prod.Version-eq$TargetVersion){Write-Event 'OK' 'Produktion meldet die Zielversion bereits; Redeploy-Wartephase entfällt.';Complete-Step 'deploy';return$prod} + if($SkipProductionDeploy){Skip-Step 'deploy';Skip-Step 'verify';Write-State 100 'Source aktualisiert' 'GitHub wurde aktualisiert; das Produktionsdeployment wurde auf Wunsch übersprungen.' 'success';return$null} + Set-Step 'deploy' 'active';Write-State 88 'Coolify Auto Deploy' 'main ist auf Zielstand. Coolify übernimmt das Deployment über die bestehende GitHub-Verknüpfung.';$Session.releaseState='deploying';Save-Session $Session;$deadline=(Get-Date).AddMinutes(15);$nextLog=Get-Date;$last='' + do{Assert-NotCancelled;$prod=Check-ProductionVersion;$last="ready=$($prod.Ready), version=$($prod.Version)";if((Get-Date)-ge$nextLog){Write-Event 'INFO' "Coolify Auto Deploy: $last";$nextLog=(Get-Date).AddSeconds(30)};if($prod.Ready-and$prod.Version-eq$TargetVersion){break};Start-Sleep -Seconds 10}while((Get-Date)-lt$deadline) + if(-not($prod.Ready-and$prod.Version-eq$TargetVersion)){throw"Coolify hat die Zielversion innerhalb von 15 Minuten nicht bereitgestellt. Letzter Stand: $last."};Complete-Step 'deploy';return$prod +} + +try{ + Write-Event 'INFO' "Vendoo Production Updater $UpdaterVersion gestartet. Zielversion $TargetVersion." + Set-Step 'package' 'active';Write-State 3 'Paketprüfung' 'Version, Herkunft, Payload-Hash und Manifest werden geprüft.';Assert-Package;$session=Load-Session;if($SelfTestFailAt-eq'package'){throw'Simulierter Paketfehler.'};Complete-Step 'package';Write-Event 'OK' "Paketprüfung erfolgreich. payloadHash=$($script:Manifest.payloadHash), sourceCommit=$($script:Manifest.sourceCommit), baseCommit=$($script:Manifest.baseCommit)." + Set-Step 'tools' 'active';Write-State 9 'Systemprüfung' 'Git, Node.js, npm und GitHub CLI werden geprüft.';$script:Git=Get-GitPath;if(-not$script:Git){throw'Git für Windows wurde nicht gefunden.'};$script:Node=Get-NodePath;$script:Npm=Get-NpmPath;if(-not$script:Node-or-not$script:Npm){throw'Node.js 22 LTS oder npm wurde nicht gefunden.'};$nv=Invoke-External $script:Node @('--version')-TimeoutSeconds 20 -Label 'Node.js prüfen';if($nv.Output-notmatch'v?(\d+)\.'-or[int]$Matches[1]-lt22){throw'Node.js 22 oder neuer ist erforderlich.'};$gh=Ensure-GitHubCli;Complete-Step 'tools' + Set-Step 'github' 'active';Write-State 22 'GitHub-Verbindung' 'Anmeldung und Repository-Berechtigungen werden geprüft.';if(-not(Test-GitHubAuthentication $gh)){Invoke-VisibleGitHubLogin $gh};Invoke-External $gh @('auth','setup-git','--hostname','github.com')-TimeoutSeconds 60 -Label 'Git-Anmeldung konfigurieren'|Out-Null;$repo=(Invoke-External $gh @('repo','view',$Repository,'--json','viewerPermission,defaultBranchRef,isPrivate')-TimeoutSeconds 60 -Label 'Repository-Zugriff prüfen').Output|ConvertFrom-Json;if([string]$repo.viewerPermission-notin@('ADMIN','MAINTAIN','WRITE')){throw"Für $Repository fehlt Schreibzugriff."};Complete-Step 'github' + Set-Step 'production' 'active';Write-State 31 'Zielzustand' 'main, Produktion, bestehende PRs und Sitzung werden vor jeder Änderung abgeglichen.';$observation=Get-ReleaseObservation $gh;$decision=Get-Decision $observation $session;Write-Event 'INFO' "Lifecycle-Entscheidung: $($decision.action) / $($decision.reason); main=$($observation.MainVersion)@$($observation.MainSha); production=$($observation.Production.Version).";Complete-Step 'production' + if($SelfTest){foreach($id in@('workspace','tests','pullrequest','merge','deploy','verify')){Set-Step $id 'active';Start-Sleep -Milliseconds 120;Complete-Step $id};Write-State 100 'Selbsttest erfolgreich' 'Updater-3.4-Oberfläche und Host-Vertrag funktionieren.' 'success';return} + if([string]$decision.action-eq'complete'){Complete-WithoutSource $decision.reason $observation $session;return} + $prUrl='';$prNumber=$null;$sourceRequired=([string]$decision.action-eq'source') + if([string]$decision.action-eq'resume-pr'){$pr=Get-OpenPrFromDecision $decision;$prUrl=[string]$pr.url;$prNumber=$pr.number;$session.prUrl=$prUrl;$session.prNumber=$prNumber;$session.releaseState='checks';Save-Session $session;foreach($id in@('workspace','tests')){Skip-Step $id};Complete-Step 'pullrequest';Write-Event 'INFO' "Vorhandener offener Pull Request wird übernommen: $prUrl"} + elseif([string]$decision.action-eq'deploy'){foreach($id in@('workspace','tests','pullrequest','merge')){Skip-Step $id};$sourceRequired=$false} + if($sourceRequired){ + Set-Step 'workspace' 'active';Write-State 40 'Payload-Sicherheitsprüfung' 'main wird isoliert geklont; Herkunft und mögliche Rückschritte werden vor dem Overlay geprüft.';if(Test-Path -LiteralPath $WorkRoot){Remove-Item $WorkRoot -Recurse -Force};New-Item -ItemType Directory -Path $WorkRoot -Force|Out-Null;Invoke-External $gh @('repo','clone',$Repository,$CloneDir,'--','--branch',$BaseBranch,'--single-branch')-WorkingDirectory $WorkRoot -TimeoutSeconds 300 -Label 'Repository klonen'|Out-Null + $guard=Invoke-External $script:Node @($PayloadGuardScript,$PackageRoot,$CloneDir,[string]$script:Manifest.baseCommit,[string]$observation.MainSha)-TimeoutSeconds 300 -AllowFailure -Label 'Veralteten Payload ausschließen';if($guard.Code-ne0){$detail='';try{$g=$guard.Output|ConvertFrom-Json;$detail=@($g.conflicts)-join', '}catch{$detail=$guard.Output};throw"Payload-Rückschritt blockiert. baseCommit=$($script:Manifest.baseCommit), main=$($observation.MainSha). Konflikte: $detail"} + Invoke-External $script:Git @('switch','-c',$Branch,$observation.MainSha)-WorkingDirectory $CloneDir -TimeoutSeconds 60 -Label 'Deterministischen Release-Branch erstellen'|Out-Null;Invoke-External $script:Node @((Join-Path $PackageRoot 'tools\apply-release-manifest.mjs'),$PackageRoot,$CloneDir)-TimeoutSeconds 300 -Label 'SHA-256-geprüftes Release-Manifest anwenden'|Out-Null;Complete-Step 'workspace' + Set-Step 'tests' 'active';Write-State 55 'Abnahmetests' 'npm ci und der vollständige Releasevertrag werden auf dem sicheren Overlay ausgeführt.';Invoke-External $script:Npm @('ci','--no-audit','--no-fund')-WorkingDirectory $CloneDir -TimeoutSeconds 1200 -Label 'npm ci'|Out-Null;Invoke-External $script:Npm @('run','verify:all')-WorkingDirectory $CloneDir -TimeoutSeconds 3600 -Label 'npm run verify:all'|Out-Null;Complete-Step 'tests' + $latest=Get-ReleaseObservation $gh;$lateDecision=Get-Decision $latest $session;if([string]$lateDecision.action-eq'complete'){Complete-WithoutSource 'target-reached-during-local-tests' $latest $session;return}elseif([string]$lateDecision.action-eq'resume-pr'){$pr=Get-OpenPrFromDecision $lateDecision;$prUrl=[string]$pr.url;$prNumber=$pr.number;Write-Event 'INFO' "Paralleler Lauf hat bereits einen PR erzeugt; dieser wird übernommen: $prUrl"}elseif([string]$lateDecision.action-eq'deploy'){foreach($id in@('pullrequest','merge')){Skip-Step $id};$sourceRequired=$false}else{ + Set-Step 'pullrequest' 'active';Write-State 70 'Pull Request' 'Branch und Pull Request werden idempotent abgeglichen.';Invoke-External $script:Git @('config','user.name','Vendoo Production Updater')-WorkingDirectory $CloneDir -Label 'Git-Name setzen'|Out-Null;$uid=(Invoke-External $gh @('api','user','--jq','.id')-Label 'GitHub-Benutzer-ID').Output.Trim();$ulogin=(Invoke-External $gh @('api','user','--jq','.login')-Label 'GitHub-Benutzername').Output.Trim();Invoke-External $script:Git @('config','user.email',"$uid+$ulogin@users.noreply.github.com")-WorkingDirectory $CloneDir -Label 'Git-E-Mail setzen'|Out-Null;Invoke-External $script:Git @('add','--all')-WorkingDirectory $CloneDir -Label 'Änderungen vormerken'|Out-Null;$diff=Invoke-External $script:Git @('diff','--cached','--quiet')-WorkingDirectory $CloneDir -AllowFailure -Label 'Änderungen prüfen';if($diff.Code-ne1){throw'Payload erzeugt gegenüber main keinen gültigen neuen Source-Stand.'};Invoke-External $script:Git @('commit','-m',"release: Vendoo $TargetVersion production update via updater 3.4")-WorkingDirectory $CloneDir -TimeoutSeconds 120 -Label 'Release committen'|Out-Null + $remoteLine=(Invoke-External $script:Git @('ls-remote','--heads','origin',"refs/heads/$Branch")-WorkingDirectory $CloneDir -TimeoutSeconds 60 -AllowFailure -Label 'Remote-Branch prüfen' -Quiet).Output.Trim();if($remoteLine){$remoteSha=($remoteLine-split'\s+')[0];Invoke-External $script:Git @('push',"--force-with-lease=refs/heads/$Branch`:$remoteSha",'--set-upstream','origin',$Branch)-WorkingDirectory $CloneDir -TimeoutSeconds 300 -Label 'Bestehenden Release-Branch sicher aktualisieren'|Out-Null}else{Invoke-External $script:Git @('push','--set-upstream','origin',$Branch)-WorkingDirectory $CloneDir -TimeoutSeconds 300 -Label 'Release-Branch pushen'|Out-Null} + $existing=Invoke-External $gh @('pr','list','--repo',$Repository,'--head',$Branch,'--state','open','--json','number,url','--jq','.[0]')-AllowFailure -Label 'Vorhandenen Pull Request erneut suchen' -Quiet;if($existing.Output.Trim()){$existingObj=$existing.Output|ConvertFrom-Json;$prUrl=[string]$existingObj.url;$prNumber=$existingObj.number}else{$body=Join-Path $WorkRoot 'pr-body.md';$bodyText="## Vendoo $TargetVersion – Production Update`r`n`r`nErstellt durch Vendoo Production Updater $UpdaterVersion.`r`n`r`n- vollständiges ``npm run verify:all`` erfolgreich`r`n- Payload-Herkunft und Rückschrittschutz geprüft`r`n- keine Datenbanken, Uploads, Secrets oder ``/app/data``-Inhalte`r`n- GitHub-Checks werden am finalen Head-SHA ausgewertet`r`n";[IO.File]::WriteAllText($body,$bodyText,(New-Object Text.UTF8Encoding($false)));$created=(Invoke-External $gh @('pr','create','--repo',$Repository,'--base',$BaseBranch,'--head',$Branch,'--title',"Vendoo $TargetVersion – Production Update",'--body-file',$body)-WorkingDirectory $CloneDir -TimeoutSeconds 180 -Label 'Pull Request erstellen').Output.Trim();$prUrl=$created;$prInfo=(Invoke-External $gh @('pr','view',$prUrl,'--repo',$Repository,'--json','number')-TimeoutSeconds 60 -Label 'PR-Nummer lesen' -Quiet).Output|ConvertFrom-Json;$prNumber=$prInfo.number} + $session.prUrl=$prUrl;$session.prNumber=$prNumber;$session.releaseState='checks';Save-Session $session;Complete-Step 'pullrequest';Write-Event 'OK' "Pull Request: $prUrl" + } + } + if($prUrl){Set-Step 'merge' 'active';Write-State 78 'GitHub-Checks' 'Workflow-Runs und Pflichtchecks werden für den jeweils aktuellen PR-Head verfolgt.';$checkResult=Wait-RequiredGitHubChecks $gh $prUrl $session;if(-not$checkResult.Merged){Write-State 84 'Merge' 'Der geprüfte finale Head wird atomar per Squash nach main übernommen.';Invoke-External $gh @('pr','merge',$prUrl,'--repo',$Repository,'--squash','--delete-branch','--subject',"Vendoo $TargetVersion – Production Update",'--match-head-commit',[string]$checkResult.HeadSha)-WorkingDirectory $CloneDir -TimeoutSeconds 300 -Label 'Pull Request mergen'|Out-Null};$mergedInfo=(Invoke-External $gh @('pr','view',$prUrl,'--repo',$Repository,'--json','mergedAt,mergeCommit,headRefOid,state')-TimeoutSeconds 60 -Label 'Merge-Ergebnis bestätigen' -Quiet).Output|ConvertFrom-Json;if(-not$mergedInfo.mergedAt){throw'Der Pull Request wurde nicht als gemergt bestätigt.'};$session.finalPrHeadSha=[string]$mergedInfo.headRefOid;$session.mergeCommit=[string]$mergedInfo.mergeCommit.oid;$session.releaseState='merged';Save-Session $session;Complete-Step 'merge';Write-Event 'OK' "Merge bestätigt: $($session.mergeCommit)"} + $prod=Ensure-Deployment $session;if($SkipProductionDeploy){return};Set-Step 'verify' 'active';Write-State 97 'Produktionsprüfung' 'Die öffentliche Readiness und die exakte Zielversion werden abschließend bestätigt.';if($null-eq$prod){$prod=Check-ProductionVersion};if(-not($prod.Ready-and$prod.Version-eq$TargetVersion)){throw"Die abschließende Produktionsprüfung ist fehlgeschlagen: ready=$($prod.Ready), version=$($prod.Version)"};Complete-Step 'verify';$session.productionVersion=$prod.Version;$session.releaseState='completed';$session.completedAt=(Get-Date).ToString('o');Save-Session $session;Write-State 100 'Update erfolgreich' "Vendoo $TargetVersion läuft geprüft in Produktion." 'success';Write-Event 'OK' "Vendoo $TargetVersion wurde vollständig und idempotent aktualisiert." +}catch[System.OperationCanceledException]{Fail-Step;Write-State 100 'Update abgebrochen' $_.Exception.Message 'cancelled' $_.Exception.Message 'Der gespeicherte Wiederaufnahmepunkt bleibt erhalten.';Write-Event 'WARN' $_.Exception.Message +}catch{Fail-Step;$msg=$_.Exception.Message;$remediation=if($script:CurrentStep-in@('deploy','verify')){'main kann bereits aktualisiert sein. Ein erneuter Start setzt bei Deployment und Produktionsprüfung fort.'}elseif($msg-match'Payload-Rückschritt'){'Das Paket ist gegenüber main veraltet. Kein Branch und kein PR wurden aus diesem Payload erstellt. Ein neues Paket aus aktuellem main erzeugen.'}else{'Ein erneuter Start gleicht main, PR, finalen Head-SHA und Sitzung erneut ab; bereits abgeschlossene Phasen werden nicht dupliziert.'};Write-State 100 'Update sicher gestoppt' $msg 'failed' $msg $remediation;Write-Event 'ERROR' $msg +}finally{if(Test-Path $InputFile){Remove-Item $InputFile -Force -ErrorAction SilentlyContinue}}