diff --git a/js/modules/esp32-B8850rv8.js b/js/modules/esp32-B8850rv8.js new file mode 100644 index 00000000..ddd0f2ea --- /dev/null +++ b/js/modules/esp32-B8850rv8.js @@ -0,0 +1,16 @@ +var entry = 1074434164; +var text = "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"; +var text_start = 1074429952; +var data = "AMD8PzyHCkBPSEFJAAAAAB2TCkAikwpAjpMKQJeTCkBHlApA2pMKQOWSCkCFlApAAJUKQFmVCkBhlwpAKZUKQGGXCkC+lQpA45UKQPSVCkCOkwpAUZYKQGeWCkAUhQpALIIKQLCCCkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkA="; +var data_start = 1073605992; +var bss_start = 1073528832; +var esp32 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32 as default, entry, text, text_start }; diff --git a/js/modules/esp32-n1hWo9nn.js b/js/modules/esp32-n1hWo9nn.js deleted file mode 100644 index 279e9440..00000000 --- a/js/modules/esp32-n1hWo9nn.js +++ /dev/null @@ -1 +0,0 @@ -var A=1074434260,C="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",g=1074429952,I="AMD8P2iHCkBPSEFJAAAAAOWUCkDqlApAVZUKQGCVCkATlgpAopUKQK2UCkBRlgpAzJYKQEWXCkBJmQpA9pYKQEmZCkCqlwpAzpcKQOCXCkBVlQpAPZgKQFOYCkAwhQpALIIKQCCDCkDAggpArIIKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQA==",Q=1073605996,B=1073528832,w={entry:A,text:C,text_start:g,data:I,data_start:Q,bss_start:B};export{B as bss_start,I as data,Q as data_start,w as default,A as entry,C as text,g as text_start}; diff --git a/js/modules/esp32c2-CPnHdueO.js b/js/modules/esp32c2-CPnHdueO.js deleted file mode 100644 index 084b735b..00000000 --- a/js/modules/esp32c2-CPnHdueO.js +++ /dev/null @@ -1 +0,0 @@ -var A=1077415930,B="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",E=1077411840,F="FgY4QDxAyj/IEjhA1BI4QCQTOEA2EzhAMBQ4QK4TOECgEjhAchQ4QPgUOEBQFThAVhI4QAwVOEBWEjhAyhU4QNoVOEDeFThAJBM4QCwWOEBGFjhAwgM4QFQBOEAkAjhArAE4QJwBOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEA=",w=1070296428,g=1070219264,M={entry:A,text:B,text_start:E,data:F,data_start:w,bss_start:g};export{g as bss_start,F as data,w as data_start,M as default,A as entry,B as text,E as text_start}; diff --git a/js/modules/esp32c2-CTp4VfBB.js b/js/modules/esp32c2-CTp4VfBB.js new file mode 100644 index 00000000..69cd6f43 --- /dev/null +++ b/js/modules/esp32c2-CTp4VfBB.js @@ -0,0 +1,16 @@ +var entry = 1077416028; +var text = "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"; +var text_start = 1077411840; +var data = "+gU4QDxAyj9OEzhAWhM4QKoTOEC8EzhAthQ4QDQUOEAmEzhA+BQ4QH4VOEC2FThA3BI4QJIVOEDcEjhAMBY4QEAWOEBEFjhAqhM4QJIWOECsFjhArAM4QFQBOECcAThAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhA"; +var data_start = 1070296428; +var bss_start = 1070219264; +var esp32c2 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32c2 as default, entry, text, text_start }; diff --git a/js/modules/esp32c3-DrQN2m6I.js b/js/modules/esp32c3-DrQN2m6I.js new file mode 100644 index 00000000..dc5a930b --- /dev/null +++ b/js/modules/esp32c3-DrQN2m6I.js @@ -0,0 +1,16 @@ +var entry = 1077415726; +var text = "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"; +var text_start = 1077411840; +var data = "jgY4QDhAyD84EzhAQhM4QJITOECkEzhAnhQ4QBwUOEAQEzhA4BQ4QGYVOECeFThAxhI4QHoVOEDGEjhAGBY4QCgWOEAsFjhAkhM4QHoWOECUFjhA5AM4QF4BOECmAThASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhASAM4QEgDOEBIAzhA"; +var data_start = 1070165352; +var bss_start = 1070088192; +var esp32c3 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32c3 as default, entry, text, text_start }; diff --git a/js/modules/esp32c3-ea1mvbdS.js b/js/modules/esp32c3-ea1mvbdS.js deleted file mode 100644 index bfbba55d..00000000 --- a/js/modules/esp32c3-ea1mvbdS.js +++ /dev/null @@ -1 +0,0 @@ -var A=1077415682,B="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",F=1077411840,E="3gY4QDhAyD/uEjhA+BI4QEgTOEBaEzhAVBQ4QNITOEDGEjhAlhQ4QBwVOEB0FThAfBI4QDAVOEB8EjhA7hU4QP4VOEACFjhASBM4QFAWOEBqFjhA7AM4QFABOEAgAjhAqAE4QJgBOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEA=",w=1070165352,g=1070088192,M={entry:A,text:B,text_start:F,data:E,data_start:w,bss_start:g};export{g as bss_start,E as data,w as data_start,M as default,A as entry,B as text,F as text_start}; diff --git a/js/modules/esp32c5-CwEu6-ud.js b/js/modules/esp32c5-CwEu6-ud.js new file mode 100644 index 00000000..37608547 --- /dev/null +++ b/js/modules/esp32c5-CwEu6-ud.js @@ -0,0 +1,16 @@ +var entry = 1082135790; +var text = "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"; +var text_start = 1082130432; +var data = "pAeAQNwBhEAIGoBAFBqAQGYagEB6GoBAihuAQP4agEDgGYBAzhuAQFYcgECOHIBAihmAQGocgECKGYBACh2AQBodgEAeHYBAZhqAQG4dgECKHYBAIgWAQF4BgEDsCIBA5AOAQF4BgECmAYBASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BA"; +var data_start = 1082470156; +var bss_start = 1082392576; +var esp32c5 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32c5 as default, entry, text, text_start }; diff --git a/js/modules/esp32c5-Dzn4lVbd.js b/js/modules/esp32c5-Dzn4lVbd.js deleted file mode 100644 index e083ebf5..00000000 --- a/js/modules/esp32c5-Dzn4lVbd.js +++ /dev/null @@ -1 +0,0 @@ -var A=1082136122,B="goABRYKAtweEQJOHBwCDxgcAEWaTBQYRs4a2AjeHhEATB8cdupayloPGxhCR6oPGBwCzhrYCupY2loNG1hCFyoPGBwAFRpFlFY6RZhN29g+ThgYRswbWAgFFupauloPFxhCd5YPG1hCF5iOAxwCDxgcAEWYTBgYRs4bGApFlupauliOkBhADxQcAMwXFAjqVgoC3B4RAA8cHAJFmE4YGERN39w8zB8cCt4eEQJOHxx2ThXYQupe2l2P2pQAFR6OG5xCCgCOkpxAFRyOG5xCCgLcHhECThwcAA8cHAIVGEWWZjpP29g8TCAURs4UGAzeHhEATB8cdupWqlQPG1RAJxqOA1wAJRYKAA8YHADMGBgM6liqWA0bWEBHGA8cHAKOA5wDNtwPGxRAJxqOA1wAFRYKAg8YHALOGBgM2lzqVA0fFEAFFddcDxwcAo4DnAMW3twWEQJOFBQADxxUAkWYThgYRMwfHAreHhECTh8cdPpc2lyMkBxADxxUAMwfHAj6XNpcjBgcQA8cVADMHxwK6l76Wo4YGEIKAtweEQJOHBwDcQ5HDgoeCgD3JAREmyrc0hUCThMTwnEAizErITsZSxCqEBs4TBQAMMwm0ABMKAAyCl5MJsA2cQGMeiQATBQAMgpfyQGJE0kRCSbJJIkoFRQVhgoADRQQAYwdFAWMMNQGClwUEyb8TBbANgpecQBMFwA39t4KXnEATBdAN1beCgAERBs5RNwHFKsa9NzJF8kAFYYKAtweEQJOHBwCUR9hHY/zmAJhLlEcThhYAkMezB9cAI4CnAIKAg8YHABFmEwYGEbOGxgI3h4RAEwfHHTaXkWY2l4VGowbXECOoBwAjqgcAgoBBESLENwSEQBMEBABUSAbGBUeqh2OD5gIJRmOGxgSR6pMGAAxjF9UAHEiBxyMkBABYyLJAIkRBAYKAEwcADGMd5QAcRInHCETZMyMoBAAjJAQAIyoEAPG/EwewDWMS5QKJR1zI+bdYyJMGwA0TBQAMY4jXAJMG0A1jmNcAEwWwDSJEskBBAS23g0YEABFmEwYGEbOGxgK3h4RAk4fHHbaXkWa2l6OG5xAjKAQAXbcDRxUAg0cFACIHXY+DRyUAA0U1AMIH2Y9iBV2NgoBBZRMFBfCCgLcHAGCcRzcHAGAcy5P3FxCVy0ERIsRATybCSsAGxhN09A+BRDqJY5iEALJAIkSSRAJJQQGCgAMlCQCFBBN19Q/1NdW3goC39wBg2EdBESLEJsIGxtjLvoQThEcAHECRi5HnskAiRJJEQQGCgIhAE3X1D2095bdBEQbGFTm3B4RAskCThwcAEWeIyxMHdxDYx0EBgoABESLMJsoGziOABQCqhC6E0TkRySrG8TcyRYlHYxv1AIVHIwD0AAFF8kBiRNJEBWGCgDcGhEATBgYAg0cWAJFmk4YGEbOH1wI3h4RAEwfHHZFlupeul4OnhxADRRYAnMAzBdUCOpXJt0ERBsZ9NmnFk3c1APHjNweEQBMHBwCDR4cB3euDR5cBxesTBscBN04A8DcDAPC3CADgNwgAwIFGso6xQ/FyfR59E/0YfRi3DwCAEw8AArOHdgK6l8xPs/VVAJPlBSDMz8xPs/XFAczPzE+z9WUAzM/MT7P1FQHMz8xPs/UFAczPzE+z5fUBzM+Tl5YAqpeFBlzCk4cG/rM38ACTBcYAswfwQO2PHMYuhuOT5vu3dwFgI6TXBfRDNwYAINGO9MOFZ5OHBwK3dgFg/NKFRyMM9wCyQEEBgoABESLMJsoGziOABQCqhC6EWT4F6bcHhECThwcAA8eXAQHrITcBRfJAYkTSRAVhgoADpYcao4wHAAU+tTYqxvU1MkWJR2MW9QCFRyMA9ADZvzcGhEATBgYAg0cWAJFmk4YGEbOH1wI3h4RAEwfHHZFlupeul4OnhxADRRYAnMAzBdUCOpVNt4KANzcAYBxDvYv1/4KAt3cBYJhDE2cXAJjDmEN5m5jDN4coAJjLtweEQJOHBwADp8caI4wHABhbIyIHACMmBwCCgANXJQCRR2MQ9wQ3BYVAEwXFP41nqpcDx1ewsWeThwdgBccYQbFnDeMNZkEREwYGsYFFBsaXAID/54Ag6bJAgUc+hUEBgoCxZz6FgoABESbKTsaxZLf5AGAizErIBs4qhAFJkQmThAQ1BUWXAID/54AAnoOnCQCJi4HvBQnjFpn+BUXyQGJE0kRCSbJJBWGCgLf3AGCAwwFF7bdBESLEJsI39ABgsWRKwAbGAUkRBJOEBDUFRZcAgP/ngGCZHECJi4HnBQnjF5n+HECyQJJEk+cXABzAIkQCSUEBgoABEU7GtzkAYCLMJspKyFLEVsJawAbOKosuigFEAUmThMkCtwoACH09I6AEACOgWQGDpwkA9f+cQIWLnc8FRZcAgP/ngACTkwcUADO3hwA6mT6E42pJ/WMUKgHj5mf9NwUAECUF8kBiRNJEQkmySSJKkkoCSwVhgoABRe23GXGi3KbaztYuhKqJsoSBRRMGoARICDbGht7K2JcAgP/ngCDVskYBRpnKA9dGBJMHAAQ6hmPz5wA+hkIGQYKTB6YAE5kHAYVHIwrxAJMHJgAjC/EAowqBABNZCQGBR5HCnEI+zGAIkc6D10YEmcsihZOFRgAyxpcAgP/ngMDPMkYylJPXhAAjAPQAg6eJAKMAlADKhUgIgpf2UGZU1lRGWbZZCWGCgBcDgP9nAIOGARG3dwFgIszAQwbOkxcEAWPUBwIhZ7d3AWCYyywAaACXEID/54DA17JGNweEQBMHBwCx4iMMBwCTF8QAY9cHALd3AWA3BwgAmMuTF7QAY9cHALd3AWA3BxAAmMuTF6QAY9kHBGJE8kC3dwFgNwcgAJjLBWGJuyJGtwUAwP0VHELtjxzCkWUjJAca/RWcQgMlhxq5g+2PwgfBg6qXIyT3GmME1gCURv3yhUejDPcAITtht/JAYkQFYYKAQREixABFBsYihZ08GekTBUQAvTQqhAFFl/B//+eAoHoClLJAIkQBRUEBgoAIRQERBs4izLE0KoQFZRMFhTiX8H//54DAdJcAgP/ngIDgkxVFALPVhQIBRS7Gl/B//+eAwHayRQFFl/B//+eAQHYFZRMFhTiX8H//54BgcfJAYkQBRQVhgoB5cZFnItT9FxOE9f8zNPQAEzcVABM0FABZjAbWNwcAECbSStBOzlLMGQdx4JN5NQBjnwkKtwSEQO2Pk4QEABOXBwGThwQYlFtxdkGD8Y7ZjpTblFs3RgDwfRbxjjoHVY+Y25hbtwYA8P0WdY+Y25hbtwYA4P0WdY+Y25hbtwYAQMjbVY+Y25hbtwYAgDd5AWBVj5jbI6wEGrd3AWA3BxcAmMu3hwFg7NeThQQbLoU3Sg8AlxCA/+eAILwRCRMKCiQFRZfwf//ngCBkgycJABPXFwEliynjhQnjlEn/g6fEGhNHFAByByOqBwAjrAcAslAiVJJUAlnySWJKEzUXAEVhgoATl7cA41sH/Ld3AWA3BxAAmMvht4MnCQATl+cA41IH/rd3AWA3BwcAmMtsACgAlxCA/+eAwLQFRE230bW3B4ZAA6XH/hfzf/9nAONuHFFUUUxBEEUYSQMohQGDKMUBAyOFAgNOBQM3BQBAAy9FAXlxBUU2wj7ABtaJTnLIKsYaxJMHAAKhRmP57gGX4IL/54AA87JQRWGCgJfAgv/ngICVzb+zZ8UAjYvN67cHhECDx8cbWXGG1qLUptLK0M7O0szWytrI3sbixObCvc+qhAllLokTBQVxgUUyhG0+twcAEKUHEelBSwVKkUsxTKFKkwwAAgXggUe2UCZUllQGWfZJZkrWSkZLtksmTJZMPoVlYYKAooljc4sAwUmTlzkAaAAmzkrYUsZeyGLKVsxm0FbSAtQC1j7aUtwjDgECMwQ0QTE3TpnOlHW3l/B//+eA4F1V0bcHABCRB3m/twcAEIkHPoWCgFVxpsMERaLFhsfKwU7fUt1W21rZXtdi1WbTatFuzxMBAYATAQGAKoQThYQA7/CP9oVnY+anFqqLJoXv8K/1KooThUQA7/AP9SqME4XEAO/wb/RcRCrEkwoBCdxDgpcIGCOmCviXAID/54BguWMbDAyBRAFLAUmDp8r4gUlj54cNgcRcRJxLgpcIEAwYlwCA/+eAYLdcRMFFCBCcR4KXAUVBoGHJA6YK+ZFH4xv2/GgIlwCA/+eA4IYFC02oTolj8zsBXokTdzoAEwY5ADqWcZrqhRN1yv86xp01IeEyR7MH7QAJy76FSoZqhZcAgP/ngICD6oe+hQgYSoY+xpcAgP/ngCCwWEQyRcqFWEcClxHFSpqziSlBhQS9oDFlEwUFQIViFpG+QC5EnkQOSfpZalraWkpbulsqXJpcCl36TWlhgoDiiYFEAUsBSaJMY5MMAIVMSsITDYEIXESTBbEBCBCcQ4KXg8e6+KqFhd9cRNxDgpeBxFxEnEuCl4FNY2RpAbMNaUGBRJJHM4n0AOOFCe6TlxQA7pfj45fzSsJ1vzFlQbd5cSLUJtJK0E7OUsxWygbWEwEBgBMBAYCFR66EqooyiSMA9gABRIVpDAh9WmN9lAIzhoRAY/PJAAVmMwVUATLGLsSpOx3tMkaiRYFHCYIuh2MV9gCFZz6U0b8UQxEHY4BGAyMACQABRYViFpGyUCJUklQCWfJJYkrSSkVhgoCFB8G/MWUTBQVAxbcDVyUAwUdjF/cKdXEixQBFBscmw0rBzt7S3Nba2tgTAQGAEwEBgCKFLovv8O/TE3rF/xN5NQATBUQA7/Dv0qqEKAiXAID/54DAmIVqkwkBB4XkWoUsCJcAgP/ngACYAUWFYhaRukAqRJpECkn2WWZa1lpGW0lhgoAzBJkAY/OKAAVkDQRxmCKGzoVShVkxDeUzBiRBY/PEACaGs4UpASgIMsaXAID/54AAkzJGIpoBSZGMeb8xZYKAMWUTBQVATbddcRFHOshJRzrKIUeFRzrMKs4TBwACaACGxj7GOtAC0i7UMtYC2ALaPtwjDvEC+Ta2QGFhgoC3B4RAg8fHG11xhsaixKbCysBO3lLcVtpa2F7WYtRm0mrQbs5jigcikwn2P7O3yQDaB5PZqQC+mZ1nk4cHU7OK+QIqiS6KsoSzufkCY4sGGrNnxQA3BAAQvYsNBGOYBxSX8H//54DAILcnAGAjogc0l/B//+eAQCM3BAAQYxQFElaFzoXv8K/4KoRjGgUQtycAYJOHBzQ+wLcnAGCThwcwPsK3JwBgk4eHND7EtycAYJOHxzR9TZMN8AM+xgVL/cATdfkDE3f5D0nlY/idCJMG9/OTCwAEY/XdCIJHE9dbAF6GmMOSR9KFPpWX8H//54AgUaJHI6AnAbJHI6BnAWU8M+c6ATXnNycAYIMmhzUJR2OX5gg3JwBgIyhnNTcnAGCDJoc1DUdjnOYGE5Y7AIFFSoV9Flk9NycAYCMqZzVWhc6F7/DP7CHtXppembOEdEG9t5N2+QHBS8nywUvjf532Ewf38TM37QCTG0cAwQu1t9aMToyTtRwABUUzDLxAl/B//+eA4P83JgBgEwaGNQhC/RwJSLPljAFjCgUD4f03BAAQJQSX8H//54DADLZAIoUmRJZEBknyWWJa0lpCW7JbIlySXAJd8k1hYYKANyYAYCMoZjWh1QVFl/B//+eAQPo3JgBgEwaGNQxCDUjjjwXzk7UcADMMvED9HLPljAHh/Xm/VoXOhe/wj+AB6RMLABCTCwACmeQBRFG/NwQAECUEcbcTdPkPMwSLQKaHY/SbAJMHAAJj84cAPoS1OtKFSoUTFjQAWTNWhc6F7/BP3HH1IpoimYGMfb+Rypfwf//ngKAAVdk3BAAQIQSJt5fwf//ngAAD/bddcabCqoQJZcrAEwUFcS6JgUWGxqLE7/Av2B3tKoQNMhVHOsghR4VHOsxoABMHAAI+xkrKJs460ALSAtQC1gLYAto+3CMO8QIhMrZAIoUmRJZEBklhYYKANwQAECUE9bd5cV7GYsSuiyqMgUUBRQbWItQm0krQTs5SzFbKWshmwu/wj9EVwbcEABClBLJQIlQCWfJJYkrSSkJLsksiTJJMJoWSVEVhgoCDqQsAqoTjjwn8QWQDKQwAY+aJAJMXCQHBg53PkxdJAdnjgUcFZDcHhEADR8cbHceTBcANmeOTBRACSoUxP0XxIpmzh4lAM7SJAH0UIyAsAX2MI6CLAHm3hUfxt7cMAAETi/z/NzoAYDN7aQGTCkoAmc/v8H+C7/DvtbcHgAAjoGoBIyD6AIMnCgD1/1W/7/C/gO/wL7QjoGoBIyCaAYMnCgD1/3G/twQAEJkEJb95cSLUNzSFQBMExD+DJ8SwBtYm0pnnAUWyUCJUklRFYYKAtwSEQJOEBACDx9QbueO3B4ZAg6fH/gMlhLATBvEBzEcuxoU8afmDR/EBskWFwwMnhLCDJ8SwLpcjJOSwPodj8/UALoeZjyMm9LB1t4VHo470Grc1hUA3NYVAk4WF8BMFRfBZNUHZtwcA8N0XPpVZ0TFlEwUFQEG3E/e1/8FHYxf3DHlxItQ3BIVALsYG1hMExD8m0krQqoROzlLMVsoyilrI7+A//gjAqokThUQA7+B//UjAKokThYQA7+C//AjEKosThcQA7+D/+7JFSMTRR6qKAUVjmPUAE4UEAe/gn/ozNaAADWcil4VHIwKnsKMC97BjCAoAMwlpAyMqBAAjKCQBtweGQIOnx/7cRzMG8ED9F86X1pez9soA8Y+VjyMm97C3B4RAIyTXsKOOBxpFPQHFMWUTBQVAslAiVJJUAlnySWJK0kpCS0VhgoAxZYKAeXFOzrcJhUCTick/UswDqskAItQNZCbSStAG1lbKKomuhC6aTpSDJ4SwY+1HA5nMg0dEsAOlyQChx7NnlQC9i4VGneMmhsqFrTwZ7YOnCQABRYWPI6D5AIOnyQCmlyOm+QAxoC01YdExZRMFBUCyUCJUklQCWfJJYkrSSkVhgoCTdzUAkeeT9zQAseOBRl2/E3rF/zMEqkARBGPzhAAmhJMKwQB9VyKGyoUzhfoAOsaX8H//54DgAIFGEUbWhVKFCTRd8SKZEQozhIRAIaATesX/JoSTesT/Y4wKAIFGVobKhVKF+TpJ8VaZMwRUQVaaMdz9VyKGyoVoAD7Gl/B//+eAIPyBRhFGbABShTW/XXFW2oMqhQBa2IbGVoWixKbCysBO3lLcXtZi1O/gv+AqixOFSgDv4B/gCem3B4RANzeFQJOHxx0jKPfwtzSFQLcLhEC3CYVAEzgVAFqJBUSThMTwE4rLHZOJyT9jBAkAY0iAADFlEwUFcH2EYY1poNhAoWdKzjMHR0GZjz7Mg6cJAWN0+QATaCgAQsbVOTXhMkjYQJMFCwGzhSVBNwWFQDwI1pWThssdcAgTBQVBl/B//+eAILTMQOJHckwqhL6Vg6cJAczAs4eHQSOo+QC3h4RAk4fHHWPz9QAB6bOFRUFShQE9GeUjokQBMwmJQQFItbcxZRMFBUC2QCZElkQGSfJZYlrSWkJbslsiXGFhgoCDVSUAtweFQIOnxz/BFcIFwYFj87cAvoUIRUEF2bMVcbcHhEA3N4VAos2Gz6bLysnOx9LF1sPawV7fYt1m22rZbteAEZOHBwATB8fwY+/nFrcHAEADp0cBhUdj7OcWl/B//+eA4KOBRGMdBRaBRQFFl/B//+eAQLa3NwBgmE+3BgCANwqGQFWPmM+X8H//54DgrYMnyv4pR7cFAAKIQ5N39Q+Thuf+Y2nXAIVFs5X1ALcHAAFj97cAtweEQAVHI47nGkFmkwf2/xMHABCFZpfwf//ngGCoiUdjifQWjUdjkPQklwCA/+eA4OW3B4RAk4cHAL6EI6anGu/gv+q3dwFgk4eHCphDhUVJRRNnFwCYw7d3AWAFZ/jTI4wEAKOMBAC3dwFgI6QEGrEHI6AHAL6EfVe3dwFgmMu3BwFgEwcgAiOq5xCX8H//54BA/rcFgEABRpOFhX9JRZfwf//ngID/NwUEAJfwf//ngED/t4coAJzANzmFQO/gP8wTCQn2t1dBSZOH94QjIvT0gyeJAJFFEwVE9IKXtweEQJOHBwC3OYVAIy708pOJSfGDJwkAkwU09BMFhPSCl4NHNPQqi2OBByCDJ0kAgpfNtyOgBwCRB7W9lwCA/+eAoNbjAgXojUQBqANHhQGNR4FE4xH36IlEEwUADJfwf//ngECDN2cJYBMHxxEcQ7cG/f/9FpP3B/CT5zcAHMM3ZwlgEwcHERxDCWUTBQVx9Y+3BgIA1Y8cw7dnCWCTh0cUmEMTZxcAmMOX4H//54AAfhW1tycLYJOHB8OYQ7cGAIA3JgtgVY+Yw7cmC2A3R9hQk4aGwRMHF6qYwiMgBsAjoAYAlEM3BgBAhUXRjpTDtycLYJOHB8KYwzcnC2ATB8fBFEM3BgQARUXRjhTDI6AHABMHEAK3BwFgI6znDJfwf//ngEDnt/cAYH1XtwWAQNjLAUaTheU5RUWX8H//54AA6Lf3AGCYSzcFAgATZ0cAmMuX8H//54AA57cHgEA3N4VAk4fnYyMm9/C3B4BANweEQJOHx2gjIvcANzmFQO/g/6kTCUn3jbUJZRMFBXGX4H//54DAbwFFl+B//+eA4HK3BwBg+FP9do0GdY8TZ4cC+NP4UxNnFwD407cHAGCTh4cJBUeYw5hDBYt1/zcHAGBcU7cFgEABRpP3B/CT5wcCXNO3BwBgfVeYy5OFhTUVRZfwf//ngKDctwcAYNhHEwUAAhNnFxDYx5fwf//ngKDbtweAQJOHB383N4VAIyb38LcHhEAjogcAib/jBQXeg0cFAINEFQCRyzFmgUYTBgYwpoVKhe/gX9XVs4NKNQCDRyUAAyeE9KIKs+r6AJOHigBjBfcAgUYxZuG/EQXv4F+RgyfE85MLiwAjCJT0A6YHHKMIBPQjGVT1Iyqk9CMsdPUjLiT1KowZyoFGpoVKhe/gv8+DJ8TzI6AHHEmzEwbABIFFEwVE95fwf//ngACl0Udj4JcChUdj+5cCk4fk/5P39w9JR2Ng9wSKB86XnEOCh5MHIA1jifRIY+KXApMHAA1ji/RIkwcQDWOM9EiDJ8TzMWUTBQUwI6CnHMmikwcwDeOO9NCTh7QCk/f3D2lH42/3/BMGwASBRRMFRPeX8H//54CgnROHtPK3N4VACgeThwf2upecV5MGRPdWht6FJoWCl4MnxPMjoKccgyfE+83DAyfE8yMi9xxhqJMHQAJjl/o8nUoDJcT1gUYBRqFF/Rrv4J/B45gK/oMnxPMjoAcc2aABRtaFXoXv8M/9sai9R2PxVx23N4VAg8cX8GOLBxjBGl6Fwgrv4K/8k9oKAWMdVQ+BRxMH8A5j7VcBYxvsMrcXgECTh8dhAyfE8yMi9xyNqLMG+wCDxoYBhQc1j+m/EwUE9e/g36SDJ8TzI6CnHDnJ6aDBR2Ob+jJehe/gT/eDJ8TzI6SnHBMFywDv4E/2gyfE8yOmpxwzBVsB7+BP9YMnxPMjqKccEwVLAe/gT/SDJ8TzAyfE8yOqpxyFRyMM9xwjIAcckwZE9wFGpoVKhe/gn7ODJ8TzI6AHHIOnRxzjjge6EwUE9YKXgyfE8yOgpxwjogccXba9R2P8Vw2DJ8Tzg8eHHdXHXoXv4G/ugyfE86qLg6eHHGPopwDBGsIKk9oKAWMHVQMDJ8TztWeThweQNWUjIPccEwUFkCqGgUamhUqF7+BfrIMnxPMjogccUbeDJ8TzKoaTBYsBA6VHHZOKBxiX8H//54BggYOnSgXelyOq+gSDp4oEs4d3QSOk+gSdvaFHY5P6IoMnxPODx4cdhcODJ8TzUUaBRROFhxyX4H//54BgfbcXgECThyeLYb0DJ8TzsWeThwdgMWUjIPccEwUFYJ2/Y4UKAJP3+gCBzwMnxPO1Z5OHB4A1ZSMg9xwTBQWAmb8T3UoA/V2BSoMrhPWTl0oAvptehe/gT9+qjBOFSwDv4K/eKowThYsA7+AP3iqLE4XLAO/gb92X4H//54DALbN3bAFjCrsBA6cMABNL+/8ze+sAs+dnAYUKI6D8AJOXCgHBg+Pjp/tts5FHY536FF6F7+CP2RxBIyr09lm7kUdjk/oUXoXv4E/YqopVRZfwf//ngOCXRUWX8H//54BAl1lFl/B//+eAoJZBRZfwf//ngACWgUVWhZfgf//ngABBibvhR2OR+hBehe/gD9SqihMFywDv4G/TIyak8hMFCwHv4K/SIyik8hMFSwHv4O/RIyqk8hMFiwHv4C/RIyyk8hMFywHv4G/QAyeE84MmRPMDJgTzgyXE8qqHVoWX4H//54DAMuMHBc4DJ8TzsWeThwdAMWUjIPccEwUFQCm9oUdjk/oItxeAQJOH540ZuwVG+bG9R2P5Vwe3N4VAg8cX8OOGB+Zehe/gT8palZMH8A5jGasAYxz8ALcXgECTh8dQzbEDR4sBBQu5j923AyfE87Fnk4cHEDFlIyD3HBMFBRBdu5MFhPcTBQT17+Cf74MnxPMjoKccwUcjHPT6+bEKi2OKCgBagQMnxPOxZzFlIyD3HFGzEwYE9oFFAUWX4H//54DAG2XxUUaTBQT2EwWE95fgf//ngEBa0UcjHPT6EbnBR+OS+vy3F4BAk4fnuZG5l+B//+eAwB8xt6FH45X6+l6F7+CPvqqKIyak9BMFywDv4K+9gyfK/iMgpPbcR7P6+gLjkgr4M3f1AjX/k4r3/6qas9r6AvVnk4cHTAFLs4r6AoMnBPaBx7PnagGR51aF2oXv4E/zfbWTBQT2EwXE9O/w754FRZfgf//ngOAIk7caADML+0D9Gum3AAA=",E=1082130432,g="8AeAQNwBhEBEG4BAUBuAQKIbgEC2G4BAxhyAQDocgEAcG4BACh2AQJIdgEDqHYBAxhqAQKYdgEDGGoBAZh6AQHYegEB6HoBAohuAQMoegEDmHoBAKgWAQFABgEA4CYBAdAqAQAAAgEDsA4BAUAGAQCACgECoAYBAmAGAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQA==",w=1082470156,Q=1082392576,F={entry:A,text:B,text_start:E,data:g,data_start:w,bss_start:Q};export{Q as bss_start,g as data,w as data_start,F as default,A as entry,B as text,E as text_start}; diff --git a/js/modules/esp32c6-BHggnM95.js b/js/modules/esp32c6-BHggnM95.js new file mode 100644 index 00000000..207cd291 --- /dev/null +++ b/js/modules/esp32c6-BHggnM95.js @@ -0,0 +1,16 @@ +var entry = 1082135122; +var text = "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"; +var text_start = 1082130432; +var data = "rAeAQNwBhEAsF4BAOBeAQIoXgECeF4BArhiAQCIYgEAEF4BA8hiAQHoZgECyGYBArhaAQI4ZgECuFoBALhqAQD4agEBCGoBAiheAQJIagECuGoBAIgWAQF4BgED0CIBA5AOAQF4BgECmAYBASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BA"; +var data_start = 1082470156; +var bss_start = 1082392576; +var esp32c6 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32c6 as default, entry, text, text_start }; diff --git a/js/modules/esp32c6-DL8Ekn6h.js b/js/modules/esp32c6-DL8Ekn6h.js deleted file mode 100644 index 40992292..00000000 --- a/js/modules/esp32c6-DL8Ekn6h.js +++ /dev/null @@ -1 +0,0 @@ -var A=1082135076,B="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",E=1082130432,g="+AeAQNwBhEDeFoBA6haAQDwXgEBQF4BAYBiAQNQXgEC2FoBApBiAQCwZgECEGYBAYBaAQEAZgEBgFoBAABqAQBAagEAUGoBAPBeAQGQagECAGoBAKgWAQFABgEBACYBAfAqAQAAAgEDsA4BAUAGAQCACgECoAYBAmAGAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQA==",F=1082470156,w=1082392576,Q={entry:A,text:B,text_start:E,data:g,data_start:F,bss_start:w};export{w as bss_start,g as data,F as data_start,Q as default,A as entry,B as text,E as text_start}; diff --git a/js/modules/esp32c61-CywZQrZW.js b/js/modules/esp32c61-CywZQrZW.js new file mode 100644 index 00000000..9ddd9d95 --- /dev/null +++ b/js/modules/esp32c61-CywZQrZW.js @@ -0,0 +1,16 @@ +var entry = 1082134606; +var text = "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"; +var text_start = 1082130432; +var data = "hgaAQDhAgEBwFIBAfBSAQMwUgEDeFIBA2BWAQFYVgEBIFIBAGhaAQKAWgEDYFoBA/hOAQLQWgED+E4BAUheAQGIXgEBmF4BAzBSAQLQXgEDOF4BA5AOAQF4BgECmAYBASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BA"; +var data_start = 1082223976; +var bss_start = 1082146816; +var esp32c61 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32c61 as default, entry, text, text_start }; diff --git a/js/modules/esp32c61-DDIvCrFA.js b/js/modules/esp32c61-DDIvCrFA.js deleted file mode 100644 index 8dfefdaa..00000000 --- a/js/modules/esp32c61-DDIvCrFA.js +++ /dev/null @@ -1 +0,0 @@ -var A=1082134938,B="goABRYKAt0eAQJOHBwCDxgcAEWaTBQYRs4a2AjfHgEATB4cDupayloPGxhCR6oPGBwCzhrYCupY2loNG1hCFyoPGBwAFRpFlFY6RZhN29g+ThgYRswbWAgFFupauloPFxhCd5YPG1hCF5iOAxwCDxgcAEWYTBgYRs4bGApFlupauliOkBhADxQcAMwXFAjqVgoC3R4BAA8cHAJFmE4YGERN39w8zB8cCt8eAQJOHhwOThXYQupe2l2P2pQAFR6OG5xCCgCOkpxAFRyOG5xCCgLdHgECThwcAA8cHAIVGEWWZjpP29g8TCAURs4UGAzfHgEATB4cDupWqlQPG1RAJxqOA1wAJRYKAA8YHADMGBgM6liqWA0bWEBHGA8cHAKOA5wDNtwPGxRAJxqOA1wAFRYKAg8YHALOGBgM2lzqVA0fFEAFFddcDxwcAo4DnAMW3t0WAQJOFBQADxxUAkWYThgYRMwfHArfHgECTh4cDPpc2lyMkBxADxxUAMwfHAj6XNpcjBgcQA8cVADMHxwK6l76Wo4YGEIKAt0eAQJOHBwDcQ5HDgoeCgD3JAREmyrd0gUCThITWnEAizErITsZSxCqEBs4TBQAMMwm0ABMKAAyCl5MJsA2cQGMeiQATBQAMgpfyQGJE0kRCSbJJIkoFRQVhgoADRQQAYwdFAWMMNQGClwUEyb8TBbANgpecQBMFwA39t4KXnEATBdAN1beCgAERBs5RNwHFKsa9NzJF8kAFYYKAt0eAQJOHBwCUR9hHY/zmAJhLlEcThhYAkMezB9cAI4CnAIKAg8YHABFmEwYGEbOGxgI3x4BAEweHAzaXkWY2l4VGowbXECOoBwAjqgcAgoBBESLEN0SAQBMEBABUSAbGBUeqh2OD5gIJRmOGxgSR6pMGAAxjF9UAHEiBxyMkBABYyLJAIkRBAYKAEwcADGMd5QAcRInHCETZMyMoBAAjJAQAIyoEAPG/EwewDWMS5QKJR1zI+bdYyJMGwA0TBQAMY4jXAJMG0A1jmNcAEwWwDSJEskBBAS23g0YEABFmEwYGEbOGxgK3x4BAk4eHA7aXkWa2l6OG5xAjKAQAXbcDRxUAg0cFACIHXY+DRyUAA0U1AMIH2Y9iBV2NgoBBZRMFBfCCgLcHAGCcRzcHAGAcy5P3FxCVy0ERIsRATybCSsAGxhN09A+BRDqJY5iEALJAIkSSRAJJQQGCgAMlCQCFBBN19Q/1NdW3goC39wBg2EdBESLEJsIGxtjLvoQThEcAHECRi5HnskAiRJJEQQGCgIhAE3X1D2095bdBEQbGFTm3R4BAskCThwcAEWeIyxMHdxDYx0EBgoABESLMJsoGziOABQCqhC6E0TkRySrG8TcyRYlHYxv1AIVHIwD0AAFF8kBiRNJEBWGCgDdGgEATBgYAg0cWAJFmk4YGEbOH1wI3x4BAEweHA5Flupeul4OnhxADRRYAnMAzBdUCOpXJt02+AREizAbOI4AFAC7GKoS1MbJFGeXtNwFF8kBiRAVhgoCJR2MW9QCFRyOA9QDttzdGgEATBgYAg0cWAJFmk4YGEbOH1wI3x4BAEweHA5Flupeul4OnhxADRRYAHMAzBdUCOpVdvwFFgoABRYKAgoA3NwBgHEO9i/X/HEOT9wcP9fuCgANXJQCRR2MQ9wQ3RYFAEwWFJY1nqpcDx1ewsWeThwdgBccYQbFnDeMNZkEREwYGsYFFBsaXAID/54DA+rJAgUc+hUEBgoCxZz6FgoABESbKTsaxZLf5AGAizErIBs4qhAFJkQmThAQ1BUWXAID/54Cgr4OnCQCJi4HvBQnjFpn+BUXyQGJE0kRCSbJJBWGCgLf3AGCAwwFF7bdBESLEJsI39ABgsWRKwAbGAUkRBJOEBDUFRZcAgP/ngACrHECJi4HnBQnjF5n+HECyQJJEk+cXABzAIkQCSUEBgoABEU7GtzkAYCLMJspKyFLEVsJawAbOKosuigFEAUmThMkCtwoACO01I6AEACOgWQGDpwkA9f+cQIWLnc8FRZcAgP/ngKCkkwcUADO3hwA6mT6E42pJ/WMUKgHj5mf9NwUAECUF8kBiRNJEQkmySSJKkkoCSwVhgoABRe23GXGi3KbaztYuhKqJsoSBRRMGoARICDbGht7K2JcAgP/ngMDmskYBRpnKA9dGBJMHAAQ6hmPz5wA+hkIGQYKTB6YAE5kHAYVHIwrxAJMHJgAjC/EAowqBABNZCQGBR5HCnEI+zGAIkc6D10YEmcsihZOFRgAyxpcAgP/ngGDhMkYylJPXhAAjAPQAg6eJAKMAlADKhUgIgpf2UGZU1lRGWbZZCWGCgBcDgP9nACOYQREixABFBsYihakxGekTBUQAiTEqhAFFlwCA/+eA4JcClLJAIkQBRUEBgoAIRQERBs4izAUxKoQFZRMFhTiXAID/54AAkpcAgP/ngAD8kxVFALPVhQIBRS7GlwCA/+eAAJSyRQFFlwCA/+eAgJMFZRMFhTiXAID/54CgjvJAYkQBRQVhgoC3B4VAA6XH/hcDgP9nAAOgg0cFA3lxqoUFRT7IKsacVaFGBtY+xNxRPsKcUT7Ag6jFAQOohQGYSZBFzEGTBwACl6CC/+eAYFSyUEVhgoCzZ8UAjYvN67dHgECDx4cBWXGG1qLUptLK0M7O0szWytrI3sbixObCvc+qhAllLokTBQVxgUUyhOkztwcAEKUHEelBSwVKkUsxTKFKkwwAAgXggUe2UCZUllQGWfZJZkrWSkZLtksmTJZMPoVlYYKAooljc4sAwUmTlzkAaAAmzkrYUsZeyGLKVsxm0FbSAtQC1j7aUtwjDgECMwQ0QRU3TpnOlHW3lwCA/+eAgJBV0bcHABCRB3m/twcAEIkHPoWCgFVxpsMERaLFhsfKwU7fUt1W21rZXtdi1WbTatFuzxMBAYATAQGAKoQThYQASTyFZ2PjpxaqiyaFWTQqihOFRAC9PCqME4XEAJ08XEQqxJMKAQncQ4KXCBgjpgr4lwCA/+eAwOpjGwwMgUQBSwFJg6fK+IFJY+eHDYHEXEScS4KXCBAMGJcAgP/ngMDoXETBRQgQnEeClwFFQaBhyQOmCvmRR+Mb9vxoCJcAgP/ngAC6BQtNqE6JY/M7AV6JE3c6ABMGOQA6lnGa6oUTdcr/Osa9NSHhMkezB+0ACcu+hUqGaoWXAID/54CgtuqHvoUIGEqGPsaXAID/54CA4VhEMkXKhVhHApcRxUqas4kpQYUEvaAxZRMFBUCFYhaRvkAuRJ5EDkn6WWpa2lpKW7pbKlyaXApd+k1pYYKA4omBRAFLAUmiTGOTDACFTErCEw2BCFxEkwWxAQgQnEOCl4PHuviqhYXfXETcQ4KXgcRcRJxLgpeBTWNkaQGzDWlBgUSSRzOJ9ADjhQnuk5cUAO6X4+OX80rCdb8xZUG3eXEi1CbSStBOzlLMVsoG1hMBAYATAQGAhUeuhKqKMokjAPYAAUSFaQwIfVpjfZQCM4aEQGPzyQAFZjMFVAEyxi7EjTMd7TJGokWBRwmCLodjFfYAhWc+lNG/FEMRB2OARgMjAAkAAUWFYhaRslAiVJJUAlnySWJK0kpFYYKAhQfBvzFlEwUFQMW3A1clAMFHYxf3CnVxIsUARQbHJsNKwc7e0tzW2trYEwEBgBMBAYAihS6L7/AfhxN6xf8TeTUAEwVEAO/wH4aqhCgIlwCA/+eAIMqFapMJAQeF5FqFLAiXAID/54BgyQFFhWIWkbpAKkSaRApJ9llmWtZaRltJYYKAMwSZAGPzigAFZA0EcZgihs6FUoV5MQ3lMwYkQWPzxAAmhrOFKQEoCDLGlwCA/+eAYMQyRiKaAUmRjHm/MWWCgDFlEwUFQE23XXERRzrISUc6yiFHhUc6zCrOEwcAAmgAhsY+xjrQAtIu1DLWAtgC2j7cIw7xAv02tkBhYYKAt0eAQIPHhwE5cQbeItwm2krYTtZS1FbSWtBezvnLkwf2PzO3xwBaB6mDupcdZxMHB1Mzi+cCqoQyhLO75wK5zrNkxQC9iDcFABANBZXol/B//+eAAFWX8H//54AAWKqHNwUAEIHrWoXehXU6DcU3BQAQJQUqxpfwf//ngMBSMkXyUGJU0lRCWbJZIlqSWgJb8kshYYKAedw9PtG/rolahd6FUTIB6RMKABCTCgACGeQBRfm3NwUAECUF2bcT+fQPMwkqQaKHY/SKAJMHAAJj8ycBPokJNs6FJoUTFjkA9TVahd6FiTJ59cqZypQzBCRBfb+Rypfwf//ngCBKVdk3BQAQIQW1v5fwf//ngIBM/bddcabCqoQJZcrAEwUFcS6JgUWGxqLEATId7SqEbTQVRzrIIUeFRzrMaAATBwACPsZKyibOOtAC0gLUAtYC2ALaPtwjDvECQTy2QCKFJkSWRAZJYWGCgDcEABAlBPW3eXFexmLErosqjIFFAUUG1iLUJtJK0E7OUsxWylrIZsJhOBXBtwQAEKUEslAiVAJZ8kliStJKQkuySyJMkkwmhZJURWGCgIOpCwCqhOOPCfxBZAMpDABj5okAkxcJAcGDnc+TF0kByeOBRwVkN0eAQANHhwEdx5MFwA2Z45MFEAJKhQU3RfEimbOHiUAztIkAfRQjICwBfYwjoIsAebeFR/G3twwAAROL/P83OgBgM3tpAZMKSgCRz0U67/Dv8LcHgAAjoGoBIyD6AIMnCgD1/12/WTrv8E/vI6BqASMgmgGDJwoA9f9Ft7cEABCZBDW/eXEi1Dd0gUATBIQlgyfEsAbWJtKZ5wFFslAiVJJURWGCgLdEgECThAQAg8eUAbnjtweFQIOnx/4DJYSwEwbxAcxHLsb5Pmn5g0fxAbJFhcMDJ4SwgyfEsC6XIyTksD6HY/P1AC6HmY8jJvSwdbeFR6OM9AC3dYFAN3WBQJOFRdYTBQXWcTVB2bcHAPDdFz6VWdExZRMFBUBBtxP3tf/BR2MX9wx5cSLUN0SBQC7GBtYTBIQlJtJK0KqETs5SzFbKMopayO/wL8gIwKqJE4VEAO/wb8dIwCqJE4WEAO/wr8YIxCqLE4XEAO/w78WyRUjE0UeqigFFY5j1ABOFBAHv8I/EMzWgAA1nIpeFRyMCp7CjAvewYwgKADMJaQMjKgQAIygkAbcHhUCDp8f+3EczBvBA/RfOl9aXs/bKAPGPlY8jJvewt0eAQCMk17CjjAcART0BxTFlEwUFQLJQIlSSVAJZ8kliStJKQktFYYKAMWWCgHlxTs63SYFAk4mJJVLMA6rJACLUDWQm0krQBtZWyiqJroQumk6UgyeEsGPtRwOZzINHRLADpckAocezZ5UAvYuFRp3jJobKheU2Ge2DpwkAAUWFjyOg+QCDp8kAppcjpvkAMaAtNWHRMWUTBQVAslAiVJJUAlnySWJK0kpFYYKAk3c1AJHnk/c0ALHjgUZdvxN6xf8zBKpAEQRj84QAJoSTCsEAfVcihsqFM4X6ADrGl/B//+eA4EqBRhFG1oVShYU+XfEimREKM4SEQCGgE3rF/yaEk3rE/2OMCgCBRlaGyoVShbE2SfFWmTMEVEFWmjHc/VcihsqFaAA+xpfwf//ngCBGgUYRRmwAUoU1v11xVtqDKoUAWtiGxlaFosSmwsrATt5S3F7WYtTv8K+qKosThUoA7/APqgnpt0eAQDd3gUCTh4cDIyb31rd0gUC3S4BAt0mBQBM4FQBaiQVEk4SE1hOKiwOTiYklYwQJAGNIgAAxZRMFBXB9hGGNaaDYQKFnSs4zB0dBmY8+zIOnCQFjdPkAE2goAELG1Tk14TJI2ECTBQsBs4UlQTdFgUA8CNaVk4aLA3AIEwXFJpfwf//ngCD+zEDiR3JMKoS+lYOnCQHMwLOHh0EjqPkAt8eAQJOHhwNj8/UAAemzhUVBUoUBPRnlI6JEATMJiUEBSLW3MWUTBQVAtkAmRJZEBknyWWJa0lpCW7JbIlxhYYKAg1UlALdHgUCDp4clwRXCBcGBY/O3AL6FCEVBBdmzFXG3R4BAN3eBQKLNhs+my8rJzsfSxdbD2sFe32LdZttq2W7XgBGThwcAEweH1mPi5x6X8H//54DA7oFEKckDR4UBkUdjFfcEEwUACpfwf//ngODlN2cJYBMHhw4cQ7cG/f/9FvWPtwYCANWPHMO3Zwlgk4cHEphDCWUTBQVxE2cXAJjDl/B//+eA4OGJRIFFAUWX8H//54BA/Lc3AGCYT7cGAIA3CoVAVY+Yz5fwf//ngODzgyfK/ilHtwUAAohDk3f1D5OG5/5jadcAhUWzlfUAtwcAAWP3twC3R4BABUcjjOcAQWaTB/b/EwcAEIVml/B//+eAYO5jgQQStycLYJOHB8OYQ7cGAIA3JgtgVY+Yw7cmC2A3R9hQk4aGwRMHF6qYwiMgBsAjoAYAlEM3BgBAhUXRjpTDtycLYJOHB8KYwzcnC2ATB8fBFEM3BgQARUXRjhTDI6AHABMHEAK3BwFgI6jnCpfwf//ngIBCt/cAYH1XtwWAQNjLAUaTheU5RUWX8H//54BAQ7f3AGCYSzcFAgATZ0cAmMuX8H//54BAQrcHgEA3d4FAk4dHUiMk99a3B4BAN0eAQJOHJ1cjIvcA7/Avh7dXQUmTh/eEkUUTBUT0IyL09O/g/+q3R4BAN3mBQJOHBwC3eYFAEwnJ2yMu9PKTiQnXkwU09BMFhPTv8C+Fg0c09CqLzcvv4L/a5bcjoAcAkQcZvQllEwUFcZfwf//ngCDIAUWX8H//54BAy7cHAGD4U/12jQZ1jxNnhwL40/hTE2cXAPjTtwcAYJOHhwkFR5jDmEMFi3X/NwcAYFxTtwWAQAFGk/cH8JPnBwJc07cHAGB9V5jLk4WFNRVFl/B//+eAQDO3BwBg2EcTBQACE2cXENjHl/B//+eAQDK3B4BAk4dnbTd3gUAjJPfWt0eAQCOiBwAhtxXdg0cFAINEFQCRyzFmgUYTBgYwpoVKhe/wL5wVv4NKNQCDRyUAAyeE9KIKs+r6AJOHigBjBfcAgUYxZuG/EQXv4N/pgyfE85MLiwAjCJT00E+jCAT0IxlU9SMqpPQjLHT1Iy4k9SqMGcqBRqaFSoXv8K+WgyfE8yOuBwDRvRMGwASBRRMFRPeX8H//54Cg/dFHY+CXAoVHY/uXApOH5P+T9/cPSUdjb/cCigfOl5xDgoeTByANY470RGPhlwKTBwANY4D0RpMHEA1jgfRGgyfE8zFlEwUFMMjPRaKTBzAN44j05pOHtAKT9/cPaUfjYPf+EwbABIFFEwVE95fwf//ngGD2k4e08ooHypfcS5MGRPdWht6FJoWCl4MnxPPIz4MnxPvJzwMnxPMc00mokwdAAmOU+jqdSgMlxPWBRgFGoUX9Gu/wb4njmAr+gyfE8yOuBwBlqAFG1oVehdE4qai9R2PzVxu3d4FAg8fX1WOOBxbBGl6Fwgrv4F/Wk9oKAWMUVQ+BRxMH8A5j7FcBYxvsMLcXgECTh8cXAyfE8xzTpaCzBvsAg8aGAYUHNY/xvxMFBPXv4P/sgyfE88jPOcVtqMFHY5v6MF6F7+A/0YMnxPPI0xMFywDv4F/QgyfE84jXMwVbAe/gf8+DJ8TzyNcTBUsB7+CfzoMnxPMDJ8TziNuFRyMK9wIjLgcAkwZE9wFGpoVKhe/gX/yDJ8TzI64HAJxT44YH0hMFBPWCl4MnxPPIzyOgBwIhu71HY/ZXDYMnxPODx0cDzcNehe/gH8mDJ8TzqovcU2PopwDBGsIKk9oKAWMGVQMDJ8TztWeThweQNWVczxMFBZAqhoFGpoVKhe/gn/WDJ8TzI6AHAnG3gyfE8yqGkwWLAYhbl/B//+eAoNyDJ8TzAyfE85xb3pcc21xTs4d3QVzTubehR2Oe+iCDJ8Tzg8dHA4XDgyfE81FGgUUThUcCl/B//+eAoNi3B4BAk4fnbU29AyfE87Fnk4cHYDFlXM8TBQVgvb9jhQoAk/f6AJnLAyfE87Vnk4cHgDVlXM8TBQWAhbcT3UoA/V2BSoMrhPWTl0oAvptehe/g37qqjBOFSwDv4D+6KowThYsA7+CfuSqLE4XLAO/g/7iX8H//54BAibN3bAFjCrsBA6cMABNL+/8ze+sAs+dnAYUKI6D8AJOXCgHBg+Pjp/vps5FHY5r6FF6F7+AftRxBIyr09l27kUdjkPoUXoXv4N+zqopRRZfwf//ngKDxQUWX8H//54AA8VVFl/B//+eAYPA9RZfwf//ngMDvgUVWhZfwf//ngICcjbvhR2Oe+g5ehe/gn6+qihMFywDv4P+uIyak8hMFCwHv4D+uIyik8hMFSwHv4H+tIyqk8hMFiwHv4L+sIyyk8hMFywHv4P+rAyeE84MmRPMDJgTzgyXE8qqHVoWX8H//54BAjuMHBdADJ8TzsWeThwdAMWVczxMFBUAdtaFHY5H6CLcHgECTh6dwHbsFRsW5vUdj91cHt3eBQIPH19XjiQfmXoXv4P+lWpWTB/AOYxllAWMc/AC3F4BAk4fHBgmzA0eLAQULuY/dtwMnxPOxZ5OHBxAxZVzPEwUFENGzkwWE9xMFBPXv8C+YgyfE88jPwUcjHPT6/bEKi2OJCgBagQMnxPOxZzFlXM9ZuxMGBPaBRQFFl+B//+eAwHdt8VFGkwUE9hMFhPeX8H//54BAttFHIxz0+jW5wUfjk/r8txeAQJOHR4etuZfgf//ngMB7Eb+hR+OW+vpehe/gn5qqiiMmpPQTBcsA7+C/mYMnyv4jIKT23Eez+voC45MK+DN39QI9/5OK9/+qmrPa+gL1Z5OHB0wBS7OK+gKDJwT2gcez52oBkedWhdqF7+C/vV29kwUE9hMFxPTv8E+xBUWX4H//54DgZJO3GgAzC/tA/RrptwAA",E=1082130432,g="1gaAQDhAgECsFYBAthWAQAYWgEAYFoBAEheAQJAWgECEFYBAVBeAQNoXgEAyGIBAOhWAQO4XgEA6FYBArBiAQLwYgEDAGIBABhaAQA4ZgEAoGYBA7AOAQFABgEAgAoBAqAGAQJgBgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEA=",F=1082223976,Q=1082146816,w={entry:A,text:B,text_start:E,data:g,data_start:F,bss_start:Q};export{Q as bss_start,g as data,F as data_start,w as default,A as entry,B as text,E as text_start}; diff --git a/js/modules/esp32h2-Ct40LsfK.js b/js/modules/esp32h2-Ct40LsfK.js new file mode 100644 index 00000000..6dd7354a --- /dev/null +++ b/js/modules/esp32h2-Ct40LsfK.js @@ -0,0 +1,16 @@ +var entry = 1082134310; +var text = "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"; +var text_start = 1082130432; +var data = "hgaAQDgAg0BEE4BAUBOAQKATgECyE4BArBSAQCoUgEAcE4BA7hSAQHQVgECsFYBA0hKAQIgVgEDSEoBAJhaAQDYWgEA6FoBAoBOAQIgWgECiFoBA5AOAQF4BgECmAYBASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BASAOAQEgDgEBIA4BA"; +var data_start = 1082404200; +var bss_start = 1082327040; +var esp32h2 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32h2 as default, entry, text, text_start }; diff --git a/js/modules/esp32h2-Dnu87P5q.js b/js/modules/esp32h2-Dnu87P5q.js deleted file mode 100644 index 0aa6748e..00000000 --- a/js/modules/esp32h2-Dnu87P5q.js +++ /dev/null @@ -1 +0,0 @@ -var A=1082134266,B="goABRYKAtweDQJOHBwCDxgcAEWaTBQYRs4a2AjeHg0ATB4cDupayloPGxhCR6oPGBwCzhrYCupY2loNG1hCFyoPGBwAFRpFlFY6RZhN29g+ThgYRswbWAgFFupauloPFxhCd5YPG1hCF5iOAxwCDxgcAEWYTBgYRs4bGApFlupauliOkBhADxQcAMwXFAjqVgoC3B4NAA8cHAJFmE4YGERN39w8zB8cCt4eDQJOHhwOThXYQupe2l2P2pQAFR6OG5xCCgCOkpxAFRyOG5xCCgLcHg0CThwcAA8cHAIVGEWWZjpP29g8TCAURs4UGAzeHg0ATB4cDupWqlQPG1RAJxqOA1wAJRYKAA8YHADMGBgM6liqWA0bWEBHGA8cHAKOA5wDNtwPGxRAJxqOA1wAFRYKAg8YHALOGBgM2lzqVA0fFEAFFddcDxwcAo4DnAMW3twWDQJOFBQADxxUAkWYThgYRMwfHAreHg0CTh4cDPpc2lyMkBxADxxUAMwfHAj6XNpcjBgcQA8cVADMHxwK6l76Wo4YGEIKAtweDQJOHBwDcQ5HDgoeCgD3JAREmyrc0hECThITWnEAizErITsZSxCqEBs4TBQAMMwm0ABMKAAyCl5MJsA2cQGMeiQATBQAMgpfyQGJE0kRCSbJJIkoFRQVhgoADRQQAYwdFAWMMNQGClwUEyb8TBbANgpecQBMFwA39t4KXnEATBdAN1beCgAERBs5RNwHFKsa9NzJF8kAFYYKAtweDQJOHBwCUR9hHY/zmAJhLlEcThhYAkMezB9cAI4CnAIKAg8YHABFmEwYGEbOGxgI3h4NAEweHAzaXkWY2l4VGowbXECOoBwAjqgcAgoBBESLENwSDQBMEBABUSAbGBUeqh2OD5gIJRmOGxgSR6pMGAAxjF9UAHEiBxyMkBABYyLJAIkRBAYKAEwcADGMd5QAcRInHCETZMyMoBAAjJAQAIyoEAPG/EwewDWMS5QKJR1zI+bdYyJMGwA0TBQAMY4jXAJMG0A1jmNcAEwWwDSJEskBBAS23g0YEABFmEwYGEbOGxgK3h4NAk4eHA7aXkWa2l6OG5xAjKAQAXbcDRxUAg0cFACIHXY+DRyUAA0U1AMIH2Y9iBV2NgoBBZRMFBfCCgLcHAGCcRzcHAGAcy5P3FxCVy0ERIsRATybCSsAGxhN09A+BRDqJY5iEALJAIkSSRAJJQQGCgAMlCQCFBBN19Q/1NdW3goC39wBg2EdBESLEJsIGxtjLvoQThEcAHECRi5HnskAiRJJEQQGCgIhAE3X1D2095bdBEQbGFTm3B4NAskCThwcAEWeIyxMHdxDYx0EBgoABESLMJsoGziOABQCqhC6E0TkRySrG8TcyRYlHYxv1AIVHIwD0AAFF8kBiRNJEBWGCgDcGg0ATBgYAg0cWAJFmk4YGEbOH1wI3h4NAEweHA5Flupeul4OnhxADRRYAnMAzBdUCOpXJt02+AREizAbOI4AFAC7GKoS1MbJFGeXtNwFF8kBiRAVhgoCJR2MW9QCFRyOA9QDttzcGg0ATBgYAg0cWAJFmk4YGEbOH1wI3h4NAEweHA5Flupeul4OnhxADRRYAHMAzBdUCOpVdvwFFgoABRYKAgoA3NwBgHEO9i/X/HEOT9wcP9fuCgANXJQCRR2MQ9wQ3BYRAEwWFJY1nqpcDx1ewsWeThwdgBccYQbFnDeMNZkEREwYGsYFFBsaXAID/54BA+bJAgUc+hUEBgoCxZz6FgoABESbKTsaxZLf5AGAizErIBs4qhAFJkQmThAQ1BUWXAID/54Dgr4OnCQCJi4HvBQnjFpn+BUXyQGJE0kRCSbJJBWGCgLf3AGCAwwFF7bdBESLEJsI39ABgsWRKwAbGAUkRBJOEBDUFRZcAgP/ngECrHECJi4HnBQnjF5n+HECyQJJEk+cXABzAIkQCSUEBgoABEU7GtzkAYCLMJspKyFLEVsJawAbOKosuigFEAUmThMkCtwoACO01I6AEACOgWQGDpwkA9f+cQIWLnc8FRZcAgP/ngOCkkwcUADO3hwA6mT6E42pJ/WMUKgHj5mf9NwUAECUF8kBiRNJEQkmySSJKkkoCSwVhgoABRe23GXGi3KbaztYuhKqJsoSBRRMGoARICDbGht7K2JcAgP/ngEDlskYBRpnKA9dGBJMHAAQ6hmPz5wA+hkIGQYKTB6YAE5kHAYVHIwrxAJMHJgAjC/EAowqBABNZCQGBR5HCnEI+zGAIkc6D10YEmcsihZOFRgAyxpcAgP/ngODfMkYylJPXhAAjAPQAg6eJAKMAlADKhUgIgpf2UGZU1lRGWbZZCWGCgBcDgP9nAGOYQREixABFBsYihakxGekTBUQAiTEqhAFFlwCA/+eA4JcClLJAIkQBRUEBgoAIRQERBs4izAUxKoQFZRMFhTiXAID/54BAkpcAgP/ngED3kxVFALPVhQIBRS7GlwCA/+eAAJSyRQFFlwCA/+eAgJMFZRMFhTiXAID/54DgjvJAYkQBRQVhgoCzZ8UAjYuR70ERBsaXAID/54CAnQHFNwUAEBEFskBBAYKANwUAEAkFgoBVcabDBEWixYbHysFO31LdVtta2V7XYtVm02rRbs8TAQGAEwEBgCqEE4WEAKU+hWdj46cWqosmhbU2KooThUQAlTYqjBOFxACxPlxEKsSTCgEJ3EOClwgYI6YK+JcAgP/ngODyYxsMDIFEAUsBSYOnyviBSWPnhw2BxFxEnEuClwgQDBiXAID/54Dg8FxEwUUIEJxHgpcBRUGgYckDpgr5kUfjG/b8aAiXAID/54DgxgULTahOiWPzOwFeiRN3OgATBjkAOpZxmuqFE3XK/zrGGTch4TJHswftAAnLvoVKhmqFlwCA/+eAgMPqh76FCBhKhj7GlwCA/+eAoOlYRDJFyoVYRwKXEcVKmrOJKUGFBL2gMWUTBQVAhWIWkb5ALkSeRA5J+llqWtpaSlu6WypcmlwKXfpNaWGCgOKJgUQBSwFJokxjkwwAhUxKwhMNgQhcRJMFsQEIEJxDgpeDx7r4qoWF31xE3EOCl4HEXEScS4KXgU1jZGkBsw1pQYFEkkczifQA44UJ7pOXFADul+Pjl/NKwnW/MWVBt3lxItQm0krQTs5SzFbKBtYTAQGAEwEBgIVHroSqijKJIwD2AAFEhWkMCH1aY32UAjOGhEBj88kABWYzBVQBMsYuxO07He0yRqJFgUcJgi6HYxX2AIVnPpTRvxRDEQdjgEYDIwAJAAFFhWIWkbJQIlSSVAJZ8kliStJKRWGCgIUHwb8xZRMFBUDFtwNXJQDBR2MV9wp1cSLFAEUGxybDSsHO3tLc1tra2BMBAYATAQGAIoUui5k6E3rF/xN5NQATBUQAoTKqhCgIlwCA/+eAgNKFapMJAQeF5FqFLAiXAID/54DA0QFFhWIWkbpAKkSaRApJ9llmWtZaRltJYYKAMwSZAGPzigAFZA0EcZgihs6FUoUtMw3lMwYkQWPzxAAmhrOFKQEoCDLGlwCA/+eAwMwyRiKaAUmRjHm/MWWCgDFlEwUFQE23ARFOxlLErokqioFFAUUGziLMJspKyAU+TeGDpAkAKoSxzMFnAykKAGPm9ACTFwkBwYOxz5MXSQHJ57cHhUADpcf+l/B//+eAQGoxNLcGAAGTh/b/NzcAYLN3+QBcwxTDHEP9/4VnM4f0QLO09AA+mf0UIyAqAfmMI6CZAPJAIoViRNJEQkmySSJKBWGCgLcHhUADpcf+l/B//+eAAGVlOpMXiQChgzc3AGBcw7cHgAAcwxxD/f/BZ323NwQAECUEdb83BAAQGQRVv3lxItQ3NIRAEwSEJYMnxLAG1ibSmecBRbJQIlSSVEVhgoC3BINAk4QEAIPHhAG547cHhUCDp8f+AyWEsBMG8QHMRy7GdTNp+YNH8QGyRYXDAyeEsIMnxLAulyMk5LA+h2Pz9QAuh5mPIyb0sHW3hUcjjPQAtzWEQDc1hECThUXWEwUF1k09Qdm3BwDw3Rc+lVnRMWUTBQVAQbcT97X/wUdjF/cMeXEi1DcEhEAuxgbWEwSEJSbSStCqhE7OUsxWyjKKWsjv8G/zCMCqiROFRADv8K/ySMAqiROFhADv8O/xCMQqixOFxADv8C/xskVIxNFHqooBRWOY9QAThQQB7/DP7zM1oAANZyKXhUcjAqewowL3sGMICgAzCWkDIyoEACMoJAG3B4VAg6fH/txHMwbwQP0XzpfWl7P2ygDxj5WPIyb3sLcHg0AjJNewI4wHAEU9AcUxZRMFBUCyUCJUklQCWfJJYkrSSkJLRWGCgDFlgoB5cU7OtwmEQJOJiSVSzAOqyQAi1A1kJtJK0AbWVsoqia6ELppOlIMnhLBj70cDjcCDR0SwA6XJALHHs2eVAL2LlecmhsqFl/B//+eAwEEZ7YOnCQABRYWPI6D5AIOnyQCmlyOm+QAxoB01Vd0xZRMFBUCyUCJUklQCWfJJYkrSSkVhgoCTdzUAmeuT9zQAqesmhsqFl/B//+eAYEBNvxN6xf8zBKpAEQRj84QAJoSTCsEAfVcihsqFM4X6ADrGl/B//+eAwHMRRtaFUoWX8H//54DgPEH9IpkRCjOEhEAhoBN6xf8mhJN6xP9jjgoAVobKhVKFl/B//+eAYDol+VaZMwRUQVaaKdT9VyKGyoVoAD7Gl/B//+eAgG4RRmwAUoWVv11xVtqDKoUAWtiGxlaFosSmwsrATt5S3F7WYtTv8K/UKosThUoA7/AP1AnptweDQDc3hECTh4cDIyb31rc0hEC3C4NAtwmEQBM4FQBaiQVEk4SE1hOKiwOTiYklYwQJAGNIgAAxZRMFBXB9hGGNaaDYQKFnSs4zB0dBmY8+zIOnCQFjdPkAE2goAELGxTE14TJI2ECTBQsBs4UlQTcFhEA8CNaVk4aLA3AIEwXFJpfwf//ngOAnzEDiR3JMKoS+lYOnCQHMwLOHh0EjqPkAt4eDQJOHhwNj8/UAAemzhUVBUoX1OxnlI6JEATMJiUEBSLW3MWUTBQVAtkAmRJZEBknyWWJa0lpCW7JbIlxhYYKAg1UlALcHhECDp4clwRXCBcGBY/O3AL6FCEVBBU27FXG3B4NANzeEQKLNhs+my8rJzsfSxdbD2sFe32LdZttq2W7XgBGThwcAEweH1mPs5wiX8H//54CAGIFEIckDR4UBjUdjFPcEEwUABpfwf//ngCAQN2cJYBMHxxAcQ7cG/f/9FvWPwWbVjxzDt2cJYJOHhxSYQwllEwUFcRNnFwCYw5fwf//ngEAMiUQBRYFFl/B//+eAoCSX8H//54CgHTcKhUCDJ8r+cUeIQ5N39Q9jb/cARUe3BQABY3L3AoVFs5X1ACmoI6AHAJEHjbcTB5ADtwUAAWOU5wC3BQACQWaTB/b/EwcAEIVml/B//+eAQBdjiwQQtycLYJOHR8OYQ7cGAIA3JgtgVY+Yw7cmC2A3R9hQk4bGwRMHF6qYwiMgBsAjoAYAlEM3BgBARUXRjpTDtycLYJOHR8KYwzcnC2ATBwfCFEM3BgQAhUXRjhTDI6AHALcHAWAjqqcIl/B//+eA4Gi39wBgfVe3BYBA2MsBRpOF5TlFRZfwf//ngGBpt/cAYJhLNwUCABNnRwCYy5fwf//ngGBotweAQDc3hECTh0dSIyT31rcHgEA3B4NAk4cnVyMi9wDv8M+xt1dBSZOH94SRRRMFRPQjIvT07/CPlbcHg0A3OYRAk4cHALc5hEATCcnbIy708pOJCdeTBTT0EwWE9O/wz6+DRzT0KovNx+/wT4XltwllEwUFcZfwf//ngIDzAUWX8H//54Bg9rcHAGD4U/12jQZ1jxNnhwL40/hTE2cXAPjTtwcAYJOHhwkFR5jDmEMFi3X/NwcAYFxTtwWAQAFGk/cH8JPnBwJc07cHAGB9V5jLk4WFNRVFl/B//+eA4Fm3BwBg2EcTBQACE2cXENjHl/B//+eA4Fi3B4BAk4dnbTc3hEAjJPfWtweDQCOiBwABvzHRg0cFAINEFQCRyzFmgUYTBgYwpoVKhe/wT8c1v4NKNQCDRyUAAyeE9KIKs+r6AJOHigBjBfcAgUYxZuG/EQXv8O+UgyfE85MLiwAjCJT00E+jCAT0IxlU9SMqpPQjLHT1Iy4k9SqMGcqBRqaFSoXv8M/BgyfE8yOuBwDxvRMGwASBRRMFRPeX8H//54BAJ9FHY+CXAoVHY/uXApOH5P+T9/cPSUdjb/cCigfOl5xDgoeTByANY470RGPhlwKTBwANY4D0RpMHEA1jgfRGgyfE8zFlEwUFMMjPRaKTBzAN44z05pOHtAKT9/cPaUfjYPf+EwbABIFFEwVE95fwf//ngAAgk4e08ooHypfcS5MGRPdWht6FJoWCl4MnxPPIz4MnxPvJzwMnxPMc00mokwdAAmOU+jqdSgMlxPWBRgFGoUX9Gu/wj7TjmAr+gyfE8yOuBwBlqAFG1oVehck4qai9R2PzVxu3N4RAg8fX1WOOBxbBGl6Fwgrv8G+Bk9oKAWMUVQ+BRxMH8A5j7FcBYxvsMLcXgECTh8ftAyfE8xzTpaCzBvsAg8aGAYUHNY/xvxMFBPXv8A+YgyfE88jPOcVtqMFHY5v6MF6F7+Bf/IMnxPPI0xMFywDv4H/7gyfE84jXMwVbAe/gn/qDJ8TzyNcTBUsB7+C/+YMnxPMDJ8TziNuFRyMK9wIjLgcAkwZE9wFGpoVKhe/wb6eDJ8TzI64HAJxT44oH0hMFBPWCl4MnxPPIzyOgBwIFs71HY/ZXDYMnxPODx0cDzcNehe/gP/SDJ8TzqovcU2PopwDBGsIKk9oKAWMGVQMDJ8TztWeThweQNWVczxMFBZAqhoFGpoVKhe/wr6CDJ8TzI6AHAnG3gyfE8yqGkwWLAYhbl/B//+eAQAaDJ8TzAyfE85xb3pcc21xTs4d3QVzTubehR2Oe+iCDJ8Tzg8dHA4XDgyfE81FGgUUThUcCl/B//+eAQAK3B4BAk4fnbU29AyfE87Fnk4cHYDFlXM8TBQVgvb9jhQoAk/f6AJnLAyfE87Vnk4cHgDVlXM8TBQWAhbcT3UoA/V2BSoMrhPWTl0oAvptehe/g/+WqjBOFSwDv4F/lKowThYsA7+C/5CqLE4XLAO/gH+SX8H//54CgtLN3bAFjCrsBA6cMABNL+/8ze+sAs+dnAYUKI6D8AJOXCgHBg+Pjp/vps5FHY5r6FF6F7+A/4BxBIyr09l27kUdjkPoUXoXv4P/eqopNRZfwf//ngAAYQUWX8H//54BgF1FFl/B//+eAwBY9RZfwf//ngCAWgUVWhZfwf//ngODFjbvhR2Oe+g5ehe/gv9qqihMFywDv4B/aIyak8hMFCwHv4F/ZIyik8hMFSwHv4J/YIyqk8hMFiwHv4N/XIyyk8hMFywHv4B/XAyeE84MmRPMDJgTzgyXE8qqHVoWX8H//54Dgt+MHBdADJ8TzsWeThwdAMWVczxMFBUAdtaFHY5H6CLcHgECTh6dwHbsFRsW5vUdj91cHtzeEQIPH19XjiQfmXoXv4B/RWpWTB/AOYxllAWMc/AC3F4BAk4fH3AmzA0eLAQULuY/dtwMnxPOxZ5OHBxAxZVzPEwUFENGzkwWE9xMFBPXv8O+0gyfE88jPwUcjHPT6/bEKi2OJCgBagQMnxPOxZzFlXM9ZuxMGBPaBRQFFl/B//+eAoKJt8VFGkwUE9hMFhPeX8H//54Dg39FHIxz0+jW5wUfjk/r8tweAQJOH53ituZfwf//ngGClEb+hR+OW+vpehe/gv8WqiiMmpPQTBcsA7+DfxIMnyv4jIKT23Eez+voC45MK+DN39QI9/5OK9/+qmrPa+gL1Z5OHB0wBS7OK+gKDJwT2gcez52oBkedWhdqF7+Df6F29kwUE9hMFxPTv8I+zBUWX8H//54BAkJO3GgAzC/tA/Rrptw==",E=1082130432,F="1gaAQDgAg0D6EoBABBOAQFQTgEBmE4BAYBSAQN4TgEDSEoBAohSAQCgVgECAFYBAiBKAQDwVgECIEoBA+hWAQAoWgEAOFoBAVBOAQFwWgEB2FoBA7AOAQFABgEAgAoBAqAGAQJgBgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEA=",g=1082404200,w=1082327040,Q={entry:A,text:B,text_start:E,data:F,data_start:g,bss_start:w};export{w as bss_start,F as data,g as data_start,Q as default,A as entry,B as text,E as text_start}; diff --git a/js/modules/esp32h4-C-JLQLQQ.js b/js/modules/esp32h4-C-JLQLQQ.js new file mode 100644 index 00000000..592b55e5 --- /dev/null +++ b/js/modules/esp32h4-C-JLQLQQ.js @@ -0,0 +1,16 @@ +var entry = 1082199846; +var text = "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"; +var text_start = 1082195968; +var data = "hgaBQDgAg0BYE4FAZBOBQLQTgUDGE4FAwBSBQD4UgUAwE4FAAhWBQIgVgUDAFYFA5hKBQJwVgUDmEoFAOhaBQEoWgUBOFoFAtBOBQJwWgUC2FoFA5AOBQF4BgUCmAYFASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FASAOBQEgDgUBIA4FA"; +var data_start = 1082404200; +var bss_start = 1082327040; +var esp32h4 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32h4 as default, entry, text, text_start }; diff --git a/js/modules/esp32p4-BDw23zUX.js b/js/modules/esp32p4-BDw23zUX.js new file mode 100644 index 00000000..265b8fa6 --- /dev/null +++ b/js/modules/esp32p4-BDw23zUX.js @@ -0,0 +1,16 @@ +var entry = 1341461262; +var text = "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"; +var text_start = 1341456384; +var data = "5Ab1T4gA9k/uF/VP+hf1T0oY9U9cGPVPYhn1T9YY9U/GF/VPpBn1TzAa9U9UGvVPfBf1T0Qa9U98F/VPzhr1T94a9U/iGvVPShj1TzAb9U9KG/VP3gP1T1gB9U+gAfVPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VPQgP1T0ID9U9CA/VP"; +var data_start = 1341599160; +var bss_start = 1341521920; +var esp32p4 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32p4 as default, entry, text, text_start }; diff --git a/js/modules/esp32p4-HGPqzQsU.js b/js/modules/esp32p4-HGPqzQsU.js deleted file mode 100644 index 46cf86a6..00000000 --- a/js/modules/esp32p4-HGPqzQsU.js +++ /dev/null @@ -1 +0,0 @@ -var A=1341199552,B="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",w=1341194240,E="RgfxT4gA9U+4G/FPxBvxTxQc8U8mHPFPLB3xT6Ac8U+QG/FPbh3xT/od8U8gHvFPRhvxTw4e8U9GG/FPmh7xT6oe8U+uHvFPFBzxT/we8U8WH/FP6APxT0wB8U8cAvFPpAHxT5QB8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U8=",C=1341533624,F=1341456384,g={entry:A,text:B,text_start:w,data:E,data_start:C,bss_start:F};export{F as bss_start,E as data,C as data_start,g as default,A as entry,B as text,w as text_start}; diff --git a/js/modules/esp32p4-rev1-CGY2cc8x.js b/js/modules/esp32p4-rev1-CGY2cc8x.js new file mode 100644 index 00000000..7da96116 --- /dev/null +++ b/js/modules/esp32p4-rev1-CGY2cc8x.js @@ -0,0 +1,16 @@ +var entry = 1341199118; +var text = "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"; +var text_start = 1341194240; +var data = "5AbxT4gA9U/uF/FP+hfxT0oY8U9cGPFPYhnxT9YY8U/GF/FPpBnxTzAa8U9UGvFPfBfxT0Qa8U98F/FPzhrxT94a8U/iGvFPShjxTzAb8U9KG/FP3gPxT1gB8U+gAfFPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FPQgPxT0ID8U9CA/FP"; +var data_start = 1341533624; +var bss_start = 1341456384; +var esp32p4Rev1 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32p4Rev1 as default, entry, text, text_start }; diff --git a/js/modules/esp32p4r3-DounZFQB.js b/js/modules/esp32p4r3-DounZFQB.js deleted file mode 100644 index ccba1138..00000000 --- a/js/modules/esp32p4r3-DounZFQB.js +++ /dev/null @@ -1 +0,0 @@ -var A=1341461696,B="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",w=1341456384,E="Rgf1T4gA9k+4G/VPxBv1TxQc9U8mHPVPLB31T6Ac9U+QG/VPbh31T/od9U8gHvVPRhv1Tw4e9U9GG/VPmh71T6oe9U+uHvVPFBz1T/we9U8WH/VP6AP1T0wB9U8cAvVPpAH1T5QB9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U8=",C=1341599160,g=1341521920,c={entry:A,text:B,text_start:w,data:E,data_start:C,bss_start:g};export{g as bss_start,E as data,C as data_start,c as default,A as entry,B as text,w as text_start}; diff --git a/js/modules/esp32s2-BOpIARj_.js b/js/modules/esp32s2-BOpIARj_.js new file mode 100644 index 00000000..aaed4a1c --- /dev/null +++ b/js/modules/esp32s2-BOpIARj_.js @@ -0,0 +1,16 @@ +var entry = 1073910084; +var text = "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"; +var text_start = 1073905664; +var data = "QAD9P5SHAkBPSEFJAAAAAA2VAkASlQJAdpUCQIGVAkA8lgJAzpUCQN2UAkB0lgJA7JYCQDuXAkA1mQJAEJcCQDWZAkCblwJAu5cCQMqXAkB2lQJAHpgCQDCYAkAMhQJAJIICQKiCAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkA="; +var data_start = 1073622460; +var bss_start = 1073545216; +var esp32s2 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32s2 as default, entry, text, text_start }; diff --git a/js/modules/esp32s2-gzKRBlZl.js b/js/modules/esp32s2-gzKRBlZl.js deleted file mode 100644 index caf212ee..00000000 --- a/js/modules/esp32s2-gzKRBlZl.js +++ /dev/null @@ -1 +0,0 @@ -var A=1073910088,g="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",C=1073905664,I="QAD9P7yHAkBPSEFJAAAAABGVAkAWlQJAfpUCQImVAkBElgJA1pUCQOGUAkB8lgJA9JYCQF6XAkBVmQJAFpcCQFWZAkC+lwJA3JcCQOqXAkB+lQJAPpgCQFCYAkAchQJAHIICQAyDAkCwggJAnIICQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQA==",B=1073622464,Q=1073545216,i={entry:A,text:g,text_start:C,data:I,data_start:B,bss_start:Q};export{Q as bss_start,I as data,B as data_start,i as default,A as entry,g as text,C as text_start}; diff --git a/js/modules/esp32s3-BzPgJvNE.js b/js/modules/esp32s3-BzPgJvNE.js deleted file mode 100644 index 47f3de82..00000000 --- a/js/modules/esp32s3-BzPgJvNE.js +++ /dev/null @@ -1 +0,0 @@ -var A=1077384644,g="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",C=1077379072,I="QADKPxgYGBgQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYiDdAT0hBSQAAAADdmTdA4pk3QEqaN0BVmjdAE5s3QKKaN0CtmTdATJs3QMibN0AynDdAMZ43QOqbN0AxnjdAlpw3QLecN0DGnDdASpo3QBidN0AsnTdAUIU3QBSCN0AEgzdAqII3QJSCN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0A=",B=1070280128,Q=1070202880,w=213,i=164,o=27,D={nand:{text:"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",text_start:1077387072,bss_size:10292,handlers:{"0xD5":1816,"0xD6":3144,"0xD7":3248,"0xD8":3424,"0xD9":3520,"0xDA":3572,"0xDE":3752,"0xDB":3856,"0xDC":3892,"0xDD":3968}}},M={entry:A,text:g,text_start:C,data:I,data_start:B,bss_start:Q,plugin_first_opcode:213,plugin_table_offset:164,plugin_table_entries:27,plugins:D};export{Q as bss_start,I as data,B as data_start,M as default,A as entry,w as plugin_first_opcode,o as plugin_table_entries,i as plugin_table_offset,D as plugins,g as text,C as text_start}; diff --git a/js/modules/esp32s3-CRbHylBG.js b/js/modules/esp32s3-CRbHylBG.js new file mode 100644 index 00000000..c2abfef2 --- /dev/null +++ b/js/modules/esp32s3-CRbHylBG.js @@ -0,0 +1,42 @@ +var entry = 1077384308; +var text = "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"; +var text_start = 1077379072; +var data = "QADKPxgYGBgQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUiDdAT0hBSQAAAACdmDdAopg3QAaZN0ARmTdAzJk3QF6ZN0BtmDdACJo3QISaN0DTmjdA0Zw3QKiaN0DRnDdANps3QFebN0BmmzdABpk3QLqbN0DMmzdAUIU3QDCCN0C0gjdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdAlIQ3QJSEN0CUhDdA"; +var data_start = 1070280124; +var bss_start = 1070202880; +var plugin_first_opcode = 213; +var plugin_table_offset = 156; +var plugin_table_entries = 27; +var plugins = { + nand: { + text: "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", + text_start: 1077386720, + bss_size: 10288, + handlers: { + "0xD5": 1728, + "0xD6": 3056, + "0xD7": 3160, + "0xD8": 3336, + "0xD9": 3416, + "0xDA": 3468, + "0xDE": 3648, + "0xDB": 3752, + "0xDC": 3788, + "0xDD": 3864 + } + } +}; +var esp32s3 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start, + plugin_first_opcode: plugin_first_opcode, + plugin_table_offset: plugin_table_offset, + plugin_table_entries: plugin_table_entries, + plugins: plugins +}; + +export { bss_start, data, data_start, esp32s3 as default, entry, plugin_first_opcode, plugin_table_entries, plugin_table_offset, plugins, text, text_start }; diff --git a/js/modules/esp32s31-AEZQRkUU.js b/js/modules/esp32s31-AEZQRkUU.js new file mode 100644 index 00000000..78e2e0cf --- /dev/null +++ b/js/modules/esp32s31-AEZQRkUU.js @@ -0,0 +1,16 @@ +var entry = 788537296; +var text = "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"; +var text_start = 788533248; +var data = "5BYAL4igAC9eJAAvaiQAL7okAC/MJAAv0iUAL0YlAC82JAAvFCYAL6AmAC/MJgAv7CMAL7QmAC/sIwAvRicAL1YnAC9aJwAvuiQAL6gnAC/CJwAv3hMAL1gRAC+gEQAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAvQhMAL0ITAC9CEwAv"; +var data_start = 788647352; +var bss_start = 788570112; +var esp32s31 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp32s31 as default, entry, text, text_start }; diff --git a/js/modules/esp32s31-Ck4fXdho.js b/js/modules/esp32s31-Ck4fXdho.js deleted file mode 100644 index 6904fa1f..00000000 --- a/js/modules/esp32s31-Ck4fXdho.js +++ /dev/null @@ -1 +0,0 @@ -var A=788537988,B="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",w=788533248,F="MBcAL4igAC+oJwAvtCcALwQoAC8WKAAvHCkAL5AoAC+AJwAvXikAL+opAC8WKgAvNicAL/4pAC82JwAvkCoAL6AqAC+kKgAvBCgAL/IqAC8MKwAv5hMAL0oRAC8aEgAvohEAL5IRAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC8=",E=788647352,C=788570112,g={entry:A,text:B,text_start:w,data:F,data_start:E,bss_start:C};export{C as bss_start,F as data,E as data_start,g as default,A as entry,B as text,w as text_start}; diff --git a/js/modules/esp8266-KToZdvHe.js b/js/modules/esp8266-KToZdvHe.js deleted file mode 100644 index 34adfd28..00000000 --- a/js/modules/esp8266-KToZdvHe.js +++ /dev/null @@ -1 +0,0 @@ -var A=1074840836,I="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",E=1074840832,B="fM0QQCyB/j8AAAAAAAAAAAAAAQAAEAAAAAEAAP//AAD/////x9cQQBXYEEBJ2BBA79gQQAToEEBN2RBApdkQQPTZEEAE6BBAz9oQQEbbEED32xBABOgQQAToEECh3BBABOgQQGffEEA74BBAe+AQQAToEEAE6BBAH+EQQAToEEAX4hBAyeIQQBnkEEDn5BBAweUQQAToEEAE6BBABOgQQAToEEDZ5hBABOgQQPDnEEC83RBAutgQQAToEED02hBAN9oQQAToEECB5xBAy+cQQAToEEAE6BBABOgQQAToEEAE6BBABOgQQAToEEAE6BBAZdoQQKDaEEBC5hBAkMwQQLTJEECUyRBABMkQQHzJEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEEABAAAAAgAAAAMAAAAEAAAABQAAAAcAAAAJAAAADQAAABEAAAAZAAAAIQAAADEAAABBAAAAYQAAAIEAAADBAAAAAQEAAIEBAAABAgAAAQMAAAEEAAABBgAAAQgAAAEMAAABEAAAARgAAAEgAAABMAAAAUAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAIAAAACAAAAAwAAAAMAAAAEAAAABAAAAAUAAAAFAAAABgAAAAYAAAAHAAAABwAAAAgAAAAIAAAACQAAAAkAAAAKAAAACgAAAAsAAAALAAAADAAAAAwAAAANAAAADQAAAAAAAAAAAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADQAAAA8AAAARAAAAEwAAABcAAAAbAAAAHwAAACMAAAArAAAAMwAAADsAAABDAAAAUwAAAGMAAABzAAAAgwAAAKMAAADDAAAA4wAAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAQERIACAcJBgoFCwQMAw0CDgEPAAEBAAABAAAABAAAAAUFBAACAwcAAwMLAA==",C=1073720940,Q=1073643776,g={entry:A,text:I,text_start:E,data:B,data_start:C,bss_start:Q};export{Q as bss_start,B as data,C as data_start,g as default,A as entry,I as text,E as text_start}; diff --git a/js/modules/esp8266-uMlyfdAd.js b/js/modules/esp8266-uMlyfdAd.js new file mode 100644 index 00000000..209fa8bf --- /dev/null +++ b/js/modules/esp8266-uMlyfdAd.js @@ -0,0 +1,16 @@ +var entry = 1074840836; +var text = "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"; +var text_start = 1074840832; +var data = "MOAQQDgD/z+AyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEECAyhBAgMoQQIDKEEAAAAAAAAAAAAAAAQAAEAAAAAEAAP//AABY2BBALMgQQCjYEEDM2BBALMgQQCTJEED/////AgMHAAUFBAADAwsAZeYQQLDmEEDZ5hBAfucQQDX2EEDW5xBAKugQQHToEEA19hBALOkQQKzpEEBl6hBANfYQQDX2EEAS6xBANfYQQNjtEECg7hBA0u4QQDX2EEA19hBAeO8QQDX2EEBs8BBAFvEQQGbyEEAo8xBA+vMQQDX2EEA19hBANfYQQDX2EEAo9RBANfYQQCb2EEAu7BBAV+cQQFj0EEBN6RBArOgQQDX2EEDC9RBABfYQQDX2EEA19hBANfYQQDX2EEA19hBANfYQQDX2EEA19hBA0OgQQAnpEECT9BBAAQAAAAIAAAADAAAABAAAAAUAAAAHAAAACQAAAA0AAAARAAAAGQAAACEAAAAxAAAAQQAAAGEAAACBAAAAwQAAAAEBAACBAQAAAQIAAAEDAAABBAAAAQYAAAEIAAABDAAAARAAAAEYAAABIAAAATAAAAFAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AAAAAAAAAAAAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAA0AAAAPAAAAEQAAABMAAAAXAAAAGwAAAB8AAAAjAAAAKwAAADMAAAA7AAAAQwAAAFMAAABjAAAAcwAAAIMAAACjAAAAwwAAAOMAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAAFAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAAQEAAAEAAAAEAAAAEBESAAgHCQYKBQsEDAMNAg4BDwA="; +var data_start = 1073720936; +var bss_start = 1073643776; +var esp8266 = { + entry: entry, + text: text, + text_start: text_start, + data: data, + data_start: data_start, + bss_start: bss_start +}; + +export { bss_start, data, data_start, esp8266 as default, entry, text, text_start }; diff --git a/js/modules/esptool.js b/js/modules/esptool.js index a2fc9d2d..31166788 100644 --- a/js/modules/esptool.js +++ b/js/modules/esptool.js @@ -1 +1,10145 @@ -const t=t=>{let e=[192];for(const i of t)219==i?e=e.concat([219,221]):192==i?e=e.concat([219,220]):e.push(i);return e.push(192),e},e=t=>{const e=[];for(let i=0;i"["+t.map(t=>s(t)).join(", ")+"]",s=(t,e=2)=>{const i=t.toString(16).toUpperCase();return i.startsWith("-")?"-0x"+i.substring(1).padStart(e,"0"):"0x"+i.padStart(e,"0")},a=t=>t.map(t=>t.toString(16).toUpperCase().padStart(2,"0")).join(":");const r=t=>new Promise(e=>setTimeout(e,t)),n={18:"256KB",19:"512KB",20:"1MB",21:"2MB",22:"4MB",23:"8MB",24:"16MB",25:"32MB",26:"64MB",27:"128MB",28:"256MB",32:"64MB",33:"128MB",34:"256MB",50:"256KB",51:"512KB",52:"1MB",53:"2MB",54:"4MB",55:"8MB",56:"16MB",57:"32MB",58:"64MB"},o=4096,h=115200,l=1073061888,d=1061265408,c=1610641408,u=1610647552,g=1611352064,f=1611335680,_=1611352064,p=1611335680,b=1343410176,w=1343312316,m=1<<27,y=1343312312,S=1343312892,B=544296960,I=e(" UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"),R=33382,v=50,C=12882,E=12883,k=12994,x=12995,M=12997,U=12998,D=207969,O=12914,A=12916,F=12917,T=12928,L=12849,z={5:{name:"ESP32-C3",family:x},9:{name:"ESP32-S3",family:E},12:{name:"ESP32-C2",family:k},13:{name:"ESP32-C6",family:U},16:{name:"ESP32-H2",family:O},18:{name:"ESP32-P4",family:T},20:{name:"ESP32-C61",family:D},23:{name:"ESP32-C5",family:M},25:{name:"ESP32-H21",family:F},28:{name:"ESP32-H4",family:A},32:{name:"ESP32-S31",family:L}},P={4293968129:{name:"ESP8266",family:R},15736195:{name:"ESP32",family:v},1990:{name:"ESP32-S2",family:C}},N=2,$=3,W=4,j=5,G=6,H=7,J=8,Q=9,V=10,Z=208,X=209,K=210,q=11,Y=13,tt=15,et=19,it=20,st=239,at=16,rt=17,nt=18,ot=5,ht=2048,lt=6144,dt=3e3,ct=15e4,ut=3e5,gt=100,ft=3e4,_t=500,pt=100,bt=(t,e)=>{const i=Math.floor(t*(e/486));return i{switch(t){case v:return{regBase:1072963584,baseFuse:l,macFuse:1073061888,usrOffs:28,usr1Offs:32,usr2Offs:36,mosiDlenOffs:40,misoDlenOffs:44,w0Offs:128,uartDateReg:1610612856,flashOffs:4096};case C:return{regBase:1061167104,baseFuse:d,macFuse:1061265476,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612856,flashOffs:4096};case E:return{regBase:1610620928,usrOffs:24,baseFuse:c,macFuse:1610641476,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612864,flashOffs:0};case R:return{regBase:1610613248,usrOffs:28,baseFuse:1072693328,macFuse:1072693328,usr1Offs:32,usr2Offs:36,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:64,uartDateReg:1610612856,flashOffs:0};case k:return{regBase:1610620928,baseFuse:u,macFuse:1610647616,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case x:return{regBase:1610620928,baseFuse:1610647552,macFuse:1610647620,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case M:return{regBase:1610625024,baseFuse:g,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:8192};case U:return{regBase:1610625024,baseFuse:f,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case D:return{regBase:1610625024,baseFuse:_,macFuse:1611352132,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case O:return{regBase:1610625024,baseFuse:p,macFuse:1611335748,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case A:return{regBase:1611239424,baseFuse:1611339776,macFuse:1611339844,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610686588,flashOffs:8192};case F:return{regBase:1610625024,baseFuse:1611350016,macFuse:1611350084,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1610612860,flashOffs:0};case T:return{regBase:1342754816,baseFuse:b,macFuse:1343410244,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:1343004812,flashOffs:8192};case L:return{regBase:542117888,baseFuse:B,macFuse:544297040,usrOffs:24,usr1Offs:28,usr2Offs:32,mosiDlenOffs:36,misoDlenOffs:40,w0Offs:88,uartDateReg:540582028,flashOffs:8192};default:return{regBase:-1,baseFuse:-1,macFuse:-1,usrOffs:-1,usr1Offs:-1,usr2Offs:-1,mosiDlenOffs:-1,misoDlenOffs:-1,w0Offs:-1,uartDateReg:-1,flashOffs:-1}}};class mt extends Error{constructor(t){super(t),this.name="SlipReadError"}}const yt=async(t,i)=>{let s;if(t==A||t==F)return null;if(t==v)s=await(import("./esp32-n1hWo9nn.js"));else if(t==C)s=await(import("./esp32s2-gzKRBlZl.js"));else if(t==E)s=await(import("./esp32s3-BzPgJvNE.js"));else if(t==R)s=await(import("./esp8266-KToZdvHe.js"));else if(t==k)s=await(import("./esp32c2-CPnHdueO.js"));else if(t==x)s=await(import("./esp32c3-ea1mvbdS.js"));else if(t==M)s=await(import("./esp32c5-Dzn4lVbd.js"));else if(t==U)s=await(import("./esp32c6-DL8Ekn6h.js"));else if(t==D)s=await(import("./esp32c61-DDIvCrFA.js"));else if(t==O)s=await(import("./esp32h2-Dnu87P5q.js"));else if(t==T)s=null!=i&&i>=300?await(import("./esp32p4r3-DounZFQB.js")):await(import("./esp32p4-HGPqzQsU.js"));else{if(t!=L)return null;s=await(import("./esp32s31-Ck4fXdho.js"))}return{...s,text:e(atob(s.text)),data:e(atob(s.data))}},St={239:"Winbond",200:"GigaDevice",157:"ISSI",194:"Macronix/MXIC",32:"XMC / Micron",28:"EON",133:"Puya",104:"BOYA",161:"Fudan Microelectronics (FM)",1:"Spansion/Cypress",94:"Zbit",55:"AMIC",224:"Berg Micro",70:"XTX Technology"},Bt={66073:"S25FL256S (256Mbit)",81941:"S25FL016K (16Mbit)",81942:"S25FL032K (32Mbit)",90135:"S25FL064L (64Mbit)",90136:"S25FL128L (128Mbit)",1847315:"EN25Q40 (4Mbit)",1847316:"EN25Q80A (8Mbit)",1847317:"EN25Q16 (16Mbit)",1847318:"EN25Q32B (32Mbit)",1847319:"EN25Q64 (64Mbit)",1847320:"EN25Q128 (128Mbit)",1863701:"EN25QH16 (16Mbit)",1863702:"EN25QH32 (32Mbit)",1863703:"EN25QH64 (64Mbit)",1863704:"EN25QH128 (128Mbit)",2113557:"XM25QH16C (16Mbit)",2113558:"XM25QH32B (32Mbit)",2113559:"XM25QH64C (64Mbit)",2113560:"XM25QH128C (128Mbit)",2113561:"XM25QH256C (256Mbit)",2113817:"XM25QU256C (256Mbit)",2125847:"XM25QH64A (64Mbit)",2125848:"XM25QH128A (128Mbit)",2144790:"N25Q032A (32Mbit)",2144791:"N25Q064A (64Mbit)",2144792:"N25Q128A (128Mbit)",2145045:"N25Q016A (16Mbit)",3612693:"A25L016 (16Mbit)",3612694:"A25L032 (32Mbit)",3620886:"A25LQ032 (32Mbit)",6176789:"ZB25VQ16 (16Mbit)",6176790:"ZB25VQ32 (32Mbit)",6176791:"ZB25VQ64 (64Mbit)",6176792:"ZB25VQ128 (128Mbit)",6832149:"BY25Q16 (16Mbit)",6832150:"BY25Q32 (32Mbit)",6832151:"BY25Q64 (64Mbit)",6832152:"BY25Q128 (128Mbit)",8740885:"P25Q16H (16Mbit)",8740886:"P25Q32H (32Mbit)",8740887:"P25Q64H (64Mbit)",8740888:"P25Q128H (128Mbit)",10313749:"IS25LP016 (16Mbit)",10313750:"IS25LP032 (32Mbit)",10313751:"IS25LP064 (64Mbit)",10313752:"IS25LP128 (128Mbit)",10313753:"IS25LP256 (256Mbit)",10317845:"IS25WP016 (16Mbit)",10317846:"IS25WP032 (32Mbit)",10317847:"IS25WP064 (64Mbit)",10317848:"IS25WP128 (128Mbit)",10317849:"IS25WP256 (256Mbit)",10567700:"FM25Q08 (8Mbit)",10567701:"FM25Q16 (16Mbit)",10567702:"FM25Q32 (32Mbit)",10567703:"FM25Q64 (64Mbit)",10567704:"FM25Q128 (128Mbit)",12722192:"MX25L512E (512Kbit)",12722193:"MX25L1005C (1Mbit)",12722194:"MX25L2005C (2Mbit)",12722195:"MX25L4005 (4Mbit)",12722196:"MX25L8005 (8Mbit)",12722197:"MX25L1605D (16Mbit)",12722198:"MX25L3205D (32Mbit)",12722199:"MX25L6405D (64Mbit)",12722200:"MX25L12805D (128Mbit)",12722201:"MX25L25635E (256Mbit)",12722202:"MX25L51245G (512Mbit)",12738070:"MX25L3233F (32Mbit)",13123601:"GD25Q10 (1Mbit)",13123602:"GD25Q20 (2Mbit)",13123603:"GD25Q40 (4Mbit)",13123604:"GD25Q80 (8Mbit)",13123605:"GD25Q16 (16Mbit)",13123606:"GD25Q32 (32Mbit)",13123607:"GD25Q64 (64Mbit)",13123608:"GD25Q127C (128Mbit)",13123609:"GD25Q256 (256Mbit)",13123616:"GD25Q512 (512Mbit)",13131801:"GD25LQ256D (256Mbit)",14696469:"BG25Q16A (16Mbit)",14696470:"BG25Q32 (32Mbit)",14696471:"BG25Q64 (64Mbit)",14696472:"BG25Q128 (128Mbit)",15679508:"W25Q80 (8Mbit)",15679509:"W25Q16 (16Mbit)",15679510:"W25Q32 (32Mbit)",15679511:"W25Q64 (64Mbit)",15679512:"W25Q128 (128Mbit)",15679513:"W25Q256 (256Mbit)",15679520:"W25Q512JV (512Mbit)",15683602:"W25Q20BW (2Mbit)",15683603:"W25Q40BW (4Mbit)",15687697:"W25Q10EW (1Mbit)",15687698:"W25Q20EW (2Mbit)",15687699:"W25Q40EW (4Mbit)",4603925:"XT25F16B (16Mbit)",4603926:"XT25F32B (32Mbit)",4603927:"XT25F64B (64Mbit)",4603928:"XT25F128B (128Mbit)"};function It(t){let e=t.length;for(;--e>=0;)t[e]=0}const Rt=256,vt=286,Ct=30,Et=15,kt=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),xt=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),Mt=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),Ut=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Dt=new Array(576);It(Dt);const Ot=new Array(60);It(Ot);const At=new Array(512);It(At);const Ft=new Array(256);It(Ft);const Tt=new Array(29);It(Tt);const Lt=new Array(Ct);function zt(t,e,i,s,a){this.static_tree=t,this.extra_bits=e,this.extra_base=i,this.elems=s,this.max_length=a,this.has_stree=t&&t.length}let Pt,Nt,$t;function Wt(t,e){this.dyn_tree=t,this.max_code=0,this.stat_desc=e}It(Lt);const jt=t=>t<256?At[t]:At[256+(t>>>7)],Gt=(t,e)=>{t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255},Ht=(t,e,i)=>{t.bi_valid>16-i?(t.bi_buf|=e<>16-t.bi_valid,t.bi_valid+=i-16):(t.bi_buf|=e<{Ht(t,i[2*e],i[2*e+1])},Qt=(t,e)=>{let i=0;do{i|=1&t,t>>>=1,i<<=1}while(--e>0);return i>>>1},Vt=(t,e,i)=>{const s=new Array(16);let a,r,n=0;for(a=1;a<=Et;a++)n=n+i[a-1]<<1,s[a]=n;for(r=0;r<=e;r++){let e=t[2*r+1];0!==e&&(t[2*r]=Qt(s[e]++,e))}},Zt=t=>{let e;for(e=0;e{t.bi_valid>8?Gt(t,t.bi_buf):t.bi_valid>0&&(t.pending_buf[t.pending++]=t.bi_buf),t.bi_buf=0,t.bi_valid=0},Kt=(t,e,i,s)=>{const a=2*e,r=2*i;return t[a]{const s=t.heap[i];let a=i<<1;for(;a<=t.heap_len&&(a{let s,a,r,n,o=0;if(0!==t.sym_next)do{s=255&t.pending_buf[t.sym_buf+o++],s+=(255&t.pending_buf[t.sym_buf+o++])<<8,a=t.pending_buf[t.sym_buf+o++],0===s?Jt(t,a,e):(r=Ft[a],Jt(t,r+Rt+1,e),n=kt[r],0!==n&&(a-=Tt[r],Ht(t,a,n)),s--,r=jt(s),Jt(t,r,i),n=xt[r],0!==n&&(s-=Lt[r],Ht(t,s,n)))}while(o{const i=e.dyn_tree,s=e.stat_desc.static_tree,a=e.stat_desc.has_stree,r=e.stat_desc.elems;let n,o,h,l=-1;for(t.heap_len=0,t.heap_max=573,n=0;n>1;n>=1;n--)qt(t,i,n);h=r;do{n=t.heap[1],t.heap[1]=t.heap[t.heap_len--],qt(t,i,1),o=t.heap[1],t.heap[--t.heap_max]=n,t.heap[--t.heap_max]=o,i[2*h]=i[2*n]+i[2*o],t.depth[h]=(t.depth[n]>=t.depth[o]?t.depth[n]:t.depth[o])+1,i[2*n+1]=i[2*o+1]=h,t.heap[1]=h++,qt(t,i,1)}while(t.heap_len>=2);t.heap[--t.heap_max]=t.heap[1],((t,e)=>{const i=e.dyn_tree,s=e.max_code,a=e.stat_desc.static_tree,r=e.stat_desc.has_stree,n=e.stat_desc.extra_bits,o=e.stat_desc.extra_base,h=e.stat_desc.max_length;let l,d,c,u,g,f,_=0;for(u=0;u<=Et;u++)t.bl_count[u]=0;for(i[2*t.heap[t.heap_max]+1]=0,l=t.heap_max+1;l<573;l++)d=t.heap[l],u=i[2*i[2*d+1]+1]+1,u>h&&(u=h,_++),i[2*d+1]=u,d>s||(t.bl_count[u]++,g=0,d>=o&&(g=n[d-o]),f=i[2*d],t.opt_len+=f*(u+g),r&&(t.static_len+=f*(a[2*d+1]+g)));if(0!==_){do{for(u=h-1;0===t.bl_count[u];)u--;t.bl_count[u]--,t.bl_count[u+1]+=2,t.bl_count[h]--,_-=2}while(_>0);for(u=h;0!==u;u--)for(d=t.bl_count[u];0!==d;)c=t.heap[--l],c>s||(i[2*c+1]!==u&&(t.opt_len+=(u-i[2*c+1])*i[2*c],i[2*c+1]=u),d--)}})(t,e),Vt(i,l,t.bl_count)},ee=(t,e,i)=>{let s,a,r=-1,n=e[1],o=0,h=7,l=4;for(0===n&&(h=138,l=3),e[2*(i+1)+1]=65535,s=0;s<=i;s++)a=n,n=e[2*(s+1)+1],++o{let s,a,r=-1,n=e[1],o=0,h=7,l=4;for(0===n&&(h=138,l=3),s=0;s<=i;s++)if(a=n,n=e[2*(s+1)+1],!(++o{Ht(t,0+(s?1:0),3),Xt(t),Gt(t,i),Gt(t,~i),i&&t.pending_buf.set(t.window.subarray(e,e+i),t.pending),t.pending+=i};var re=(t,e,i,s)=>{let a,r,n=0;t.level>0?(2===t.strm.data_type&&(t.strm.data_type=(t=>{let e,i=4093624447;for(e=0;e<=31;e++,i>>>=1)if(1&i&&0!==t.dyn_ltree[2*e])return 0;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return 1;for(e=32;e{let e;for(ee(t,t.dyn_ltree,t.l_desc.max_code),ee(t,t.dyn_dtree,t.d_desc.max_code),te(t,t.bl_desc),e=18;e>=3&&0===t.bl_tree[2*Ut[e]+1];e--);return t.opt_len+=3*(e+1)+5+5+4,e})(t),a=t.opt_len+3+7>>>3,r=t.static_len+3+7>>>3,r<=a&&(a=r)):a=r=i+5,i+4<=a&&-1!==e?ae(t,e,i,s):4===t.strategy||r===a?(Ht(t,2+(s?1:0),3),Yt(t,Dt,Ot)):(Ht(t,4+(s?1:0),3),((t,e,i,s)=>{let a;for(Ht(t,e-257,5),Ht(t,i-1,5),Ht(t,s-4,4),a=0;a{se||((()=>{let t,e,i,s,a;const r=new Array(16);for(i=0,s=0;s<28;s++)for(Tt[s]=i,t=0;t<1<>=7;s(t.pending_buf[t.sym_buf+t.sym_next++]=e,t.pending_buf[t.sym_buf+t.sym_next++]=e>>8,t.pending_buf[t.sym_buf+t.sym_next++]=i,0===e?t.dyn_ltree[2*i]++:(t.matches++,e--,t.dyn_ltree[2*(Ft[i]+Rt+1)]++,t.dyn_dtree[2*jt(e)]++),t.sym_next===t.sym_end),_tr_align:t=>{Ht(t,2,3),Jt(t,256,Dt),(t=>{16===t.bi_valid?(Gt(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):t.bi_valid>=8&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)})(t)}};var oe=(t,e,i,s)=>{let a=65535&t,r=t>>>16&65535,n=0;for(;0!==i;){n=i>2e3?2e3:i,i-=n;do{a=a+e[s++]|0,r=r+a|0}while(--n);a%=65521,r%=65521}return a|r<<16};const he=new Uint32Array((()=>{let t,e=[];for(var i=0;i<256;i++){t=i;for(var s=0;s<8;s++)t=1&t?3988292384^t>>>1:t>>>1;e[i]=t}return e})());var le=(t,e,i,s)=>{const a=he,r=s+i;t^=-1;for(let i=s;i>>8^a[255&(t^e[i])];return-1^t},de={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},ce={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:ue,_tr_stored_block:ge,_tr_flush_block:fe,_tr_tally:_e,_tr_align:pe}=ne,{Z_NO_FLUSH:be,Z_PARTIAL_FLUSH:we,Z_FULL_FLUSH:me,Z_FINISH:ye,Z_BLOCK:Se,Z_OK:Be,Z_STREAM_END:Ie,Z_STREAM_ERROR:Re,Z_DATA_ERROR:ve,Z_BUF_ERROR:Ce,Z_DEFAULT_COMPRESSION:Ee,Z_FILTERED:ke,Z_HUFFMAN_ONLY:xe,Z_RLE:Me,Z_FIXED:Ue,Z_DEFAULT_STRATEGY:De,Z_UNKNOWN:Oe,Z_DEFLATED:Ae}=ce,Fe=258,Te=262,Le=42,ze=113,Pe=666,Ne=(t,e)=>(t.msg=de[e],e),$e=t=>2*t-(t>4?9:0),We=t=>{let e=t.length;for(;--e>=0;)t[e]=0},je=t=>{let e,i,s,a=t.w_size;e=t.hash_size,s=e;do{i=t.head[--s],t.head[s]=i>=a?i-a:0}while(--e);e=a,s=e;do{i=t.prev[--s],t.prev[s]=i>=a?i-a:0}while(--e)};let Ge=(t,e,i)=>(e<{let i;if(t.legacy_hash)i=t.ins_h=Ge(t,t.ins_h,t.window[e+3-1]);else{const s=t.window,a=s[e]|s[e+1]<<8|s[e+2]<<16|s[e+3]<<24;i=t.ins_h=Math.imul(a,66521)+66521>>>16&t.hash_mask}const s=t.prev[e&t.w_mask]=t.head[i];return t.head[i]=e,s},Je=t=>{const e=t.state;let i=e.pending;i>t.avail_out&&(i=t.avail_out),0!==i&&(t.output.set(e.pending_buf.subarray(e.pending_out,e.pending_out+i),t.next_out),t.next_out+=i,e.pending_out+=i,t.total_out+=i,t.avail_out-=i,e.pending-=i,0===e.pending&&(e.pending_out=0))},Qe=(t,e)=>{fe(t,t.block_start>=0?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,Je(t.strm)},Ve=(t,e)=>{t.pending_buf[t.pending++]=e},Ze=(t,e)=>{t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e},Xe=(t,e,i,s)=>{let a=t.avail_in;return a>s&&(a=s),0===a?0:(t.avail_in-=a,e.set(t.input.subarray(t.next_in,t.next_in+a),i),1===t.state.wrap?t.adler=oe(t.adler,e,a,i):2===t.state.wrap&&(t.adler=le(t.adler,e,a,i)),t.next_in+=a,t.total_in+=a,a)},Ke=(t,e)=>{let i,s,a=t.max_chain_length,r=t.strstart,n=t.prev_length,o=t.nice_match;const h=t.strstart>t.w_size-Te?t.strstart-(t.w_size-Te):0,l=t.window,d=t.w_mask,c=t.prev,u=t.strstart+Fe;let g=l[r+n-1],f=l[r+n];t.prev_length>=t.good_match&&(a>>=2),o>t.lookahead&&(o=t.lookahead);do{if(i=e,l[i+n]===f&&l[i+n-1]===g&&l[i]===l[r]&&l[++i]===l[r+1]){r+=2,i++;do{}while(l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&l[++r]===l[++i]&&rn){if(t.match_start=e,n=s,s>=o)break;g=l[r+n-1],f=l[r+n]}}}while((e=c[e&d])>h&&0!==--a);return n<=t.lookahead?n:t.lookahead},qe=t=>{const e=t.w_size;let i,s,a;do{if(s=t.window_size-t.lookahead-t.strstart,t.strstart>=e+(e-Te)&&(t.window.set(t.window.subarray(e,e+e-s),0),t.match_start-=e,t.strstart-=e,t.block_start-=e,t.insert>t.strstart&&(t.insert=t.strstart),je(t),s+=e),0===t.strm.avail_in)break;if(i=Xe(t.strm,t.window,t.strstart+t.lookahead,s),t.lookahead+=i,t.legacy_hash){if(t.lookahead+t.insert>=3)for(a=t.strstart-t.insert,t.ins_h=t.window[a],t.ins_h=Ge(t,t.ins_h,t.window[a+1]);t.insert&&(He(t,a),a++,t.insert--,!(t.lookahead+t.insert<3)););}else if(t.lookahead+t.insert>3)for(a=t.strstart-t.insert;t.insert&&(He(t,a),a++,t.insert--,!(t.lookahead+t.insert<=3)););}while(t.lookahead{let i,s,a,r=t.pending_buf_size-5>t.w_size?t.w_size:t.pending_buf_size-5,n=0,o=t.strm.avail_in;do{if(i=65535,a=t.bi_valid+42>>3,t.strm.avail_outs+t.strm.avail_in&&(i=s+t.strm.avail_in),i>a&&(i=a),i>8,t.pending_buf[t.pending-2]=~i,t.pending_buf[t.pending-1]=~i>>8,Je(t.strm),s&&(s>i&&(s=i),t.strm.output.set(t.window.subarray(t.block_start,t.block_start+s),t.strm.next_out),t.strm.next_out+=s,t.strm.avail_out-=s,t.strm.total_out+=s,t.block_start+=s,i-=s),i&&(Xe(t.strm,t.strm.output,t.strm.next_out,i),t.strm.next_out+=i,t.strm.avail_out-=i,t.strm.total_out+=i)}while(0===n);return o-=t.strm.avail_in,o&&(o>=t.w_size?(t.matches=2,t.window.set(t.strm.input.subarray(t.strm.next_in-t.w_size,t.strm.next_in),0),t.strstart=t.w_size,t.insert=t.strstart):(t.window_size-t.strstart<=o&&(t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,t.insert>t.strstart&&(t.insert=t.strstart)),t.window.set(t.strm.input.subarray(t.strm.next_in-o,t.strm.next_in),t.strstart),t.strstart+=o,t.insert+=o>t.w_size-t.insert?t.w_size-t.insert:o),t.block_start=t.strstart),t.high_watera&&t.block_start>=t.w_size&&(t.block_start-=t.w_size,t.strstart-=t.w_size,t.window.set(t.window.subarray(t.w_size,t.w_size+t.strstart),0),t.matches<2&&t.matches++,a+=t.w_size,t.insert>t.strstart&&(t.insert=t.strstart)),a>t.strm.avail_in&&(a=t.strm.avail_in),a&&(Xe(t.strm,t.window,t.strstart,a),t.strstart+=a,t.insert+=a>t.w_size-t.insert?t.w_size-t.insert:a),t.high_water>3,a=t.pending_buf_size-a>65535?65535:t.pending_buf_size-a,r=a>t.w_size?t.w_size:a,s=t.strstart-t.block_start,(s>=r||(s||e===ye)&&e!==be&&0===t.strm.avail_in&&s<=a)&&(i=s>a?a:s,n=e===ye&&0===t.strm.avail_in&&i===s?1:0,ge(t,t.block_start,i,n),t.block_start+=i,Je(t.strm)),n?3:1)},ti=(t,e)=>{let i,s;for(;;){if(t.lookahead=3&&(i=He(t,t.strstart)),0!==i&&t.strstart-i<=t.w_size-Te&&(t.match_length=Ke(t,i)),t.match_length>=3)if(s=_e(t,t.strstart-t.match_start,t.match_length-3),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=3){t.match_length--;do{t.strstart++,i=He(t,t.strstart)}while(0!==--t.match_length);t.strstart++}else t.strstart+=t.match_length,t.match_length=0,t.legacy_hash&&(t.ins_h=t.window[t.strstart],t.ins_h=Ge(t,t.ins_h,t.window[t.strstart+1]));else s=_e(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++;if(s&&(Qe(t,!1),0===t.strm.avail_out))return 1}return t.insert=t.strstart<2?t.strstart:2,e===ye?(Qe(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Qe(t,!1),0===t.strm.avail_out)?1:2},ei=(t,e)=>{let i,s,a;for(;;){if(t.lookahead=3&&(i=He(t,t.strstart)),t.prev_length=t.match_length,t.prev_match=t.match_start,t.match_length=2,0!==i&&t.prev_length4096)&&(t.match_length=2)),t.prev_length>=3&&t.match_length<=t.prev_length){a=t.strstart+t.lookahead-3,s=_e(t,t.strstart-1-t.prev_match,t.prev_length-3),t.lookahead-=t.prev_length-1,t.prev_length-=2;do{++t.strstart<=a&&(i=He(t,t.strstart))}while(0!==--t.prev_length);if(t.match_available=0,t.match_length=2,t.strstart++,s&&(Qe(t,!1),0===t.strm.avail_out))return 1}else if(t.match_available){if(s=_e(t,0,t.window[t.strstart-1]),s&&Qe(t,!1),t.strstart++,t.lookahead--,0===t.strm.avail_out)return 1}else t.match_available=1,t.strstart++,t.lookahead--}return t.match_available&&(s=_e(t,0,t.window[t.strstart-1]),t.match_available=0),t.insert=t.strstart<2?t.strstart:2,e===ye?(Qe(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Qe(t,!1),0===t.strm.avail_out)?1:2};function ii(t,e,i,s,a){this.good_length=t,this.max_lazy=e,this.nice_length=i,this.max_chain=s,this.func=a}const si=[new ii(0,0,0,0,Ye),new ii(4,4,8,4,ti),new ii(4,5,16,8,ti),new ii(4,6,32,32,ti),new ii(4,4,16,16,ei),new ii(8,16,32,32,ei),new ii(8,16,128,128,ei),new ii(8,32,128,256,ei),new ii(32,128,258,1024,ei),new ii(32,258,258,4096,ei)];function ai(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=Ae,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.legacy_hash=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),We(this.dyn_ltree),We(this.dyn_dtree),We(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),We(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),We(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const ri=t=>{if(!t)return 1;const e=t.state;return!e||e.strm!==t||e.status!==Le&&57!==e.status&&69!==e.status&&73!==e.status&&91!==e.status&&103!==e.status&&e.status!==ze&&e.status!==Pe?1:0},ni=t=>{if(ri(t))return Ne(t,Re);t.total_in=t.total_out=0,t.data_type=Oe;const e=t.state;return e.pending=0,e.pending_out=0,e.wrap<0&&(e.wrap=-e.wrap),e.status=2===e.wrap?57:e.wrap?Le:ze,t.adler=2===e.wrap?0:1,e.last_flush=-2,ue(e),Be},oi=t=>{const e=ni(t);var i;return e===Be&&((i=t.state).window_size=2*i.w_size,We(i.head),i.max_lazy_match=si[i.level].max_lazy,i.good_match=si[i.level].good_length,i.nice_match=si[i.level].nice_length,i.max_chain_length=si[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),e},hi=(t,e,i,s,a,r,n)=>{if(!t)return Re;let o=1;if(e===Ee&&(e=6),s<0?(o=0,s=-s):s>15&&(o=2,s-=16),a<1||a>9||i!==Ae||s<8||s>15||e<0||e>9||r<0||r>Ue||8===s&&1!==o)return Ne(t,Re);8===s&&(s=9);const h=new ai;return t.state=h,h.strm=t,h.status=Le,h.wrap=o,h.gzhead=null,h.w_bits=s,h.w_size=1<hi(t,e,Ae,15,8,De),deflateInit2:hi,deflateReset:oi,deflateResetKeep:ni,deflateSetHeader:(t,e)=>ri(t)||2!==t.state.wrap?Re:(t.state.gzhead=e,Be),deflate:(t,e)=>{if(ri(t)||e>Se||e<0)return t?Ne(t,Re):Re;const i=t.state;if(!t.output||0!==t.avail_in&&!t.input||i.status===Pe&&e!==ye)return Ne(t,0===t.avail_out?Ce:Re);const s=i.last_flush;if(i.last_flush=e,0!==i.pending){if(Je(t),0===t.avail_out)return i.last_flush=-1,Be}else if(0===t.avail_in&&$e(e)<=$e(s)&&e!==ye)return Ne(t,Ce);if(i.status===Pe&&0!==t.avail_in)return Ne(t,Ce);if(i.status===Le&&0===i.wrap&&(i.status=ze),i.status===Le){let e=Ae+(i.w_bits-8<<4)<<8,s=-1;if(s=i.strategy>=xe||i.level<2?0:i.level<6?1:6===i.level?2:3,e|=s<<6,0!==i.strstart&&(e|=32),e+=31-e%31,Ze(i,e),0!==i.strstart&&(Ze(i,t.adler>>>16),Ze(i,65535&t.adler)),t.adler=1,i.status=ze,Je(t),0!==i.pending)return i.last_flush=-1,Be}if(57===i.status)if(t.adler=0,Ve(i,31),Ve(i,139),Ve(i,8),i.gzhead)Ve(i,(i.gzhead.text?1:0)+(i.gzhead.hcrc?2:0)+(i.gzhead.extra?4:0)+(i.gzhead.name?8:0)+(i.gzhead.comment?16:0)),Ve(i,255&i.gzhead.time),Ve(i,i.gzhead.time>>8&255),Ve(i,i.gzhead.time>>16&255),Ve(i,i.gzhead.time>>24&255),Ve(i,9===i.level?2:i.strategy>=xe||i.level<2?4:0),Ve(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(Ve(i,255&i.gzhead.extra.length),Ve(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=le(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69;else if(Ve(i,0),Ve(i,0),Ve(i,0),Ve(i,0),Ve(i,0),Ve(i,9===i.level?2:i.strategy>=xe||i.level<2?4:0),Ve(i,3),i.status=ze,Je(t),0!==i.pending)return i.last_flush=-1,Be;if(69===i.status){if(i.gzhead.extra){let e=i.pending,s=(65535&i.gzhead.extra.length)-i.gzindex;for(;i.pending+s>i.pending_buf_size;){let a=i.pending_buf_size-i.pending;if(i.pending_buf.set(i.gzhead.extra.subarray(i.gzindex,i.gzindex+a),i.pending),i.pending=i.pending_buf_size,i.gzhead.hcrc&&i.pending>e&&(t.adler=le(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex+=a,Je(t),0!==i.pending)return i.last_flush=-1,Be;e=0,s-=a}let a=new Uint8Array(i.gzhead.extra);i.pending_buf.set(a.subarray(i.gzindex,i.gzindex+s),i.pending),i.pending+=s,i.gzhead.hcrc&&i.pending>e&&(t.adler=le(t.adler,i.pending_buf,i.pending-e,e)),i.gzindex=0}i.status=73}if(73===i.status){if(i.gzhead.name){let e,s=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>s&&(t.adler=le(t.adler,i.pending_buf,i.pending-s,s)),Je(t),0!==i.pending)return i.last_flush=-1,Be;s=0}e=i.gzindexs&&(t.adler=le(t.adler,i.pending_buf,i.pending-s,s)),i.gzindex=0}i.status=91}if(91===i.status){if(i.gzhead.comment){let e,s=i.pending;do{if(i.pending===i.pending_buf_size){if(i.gzhead.hcrc&&i.pending>s&&(t.adler=le(t.adler,i.pending_buf,i.pending-s,s)),Je(t),0!==i.pending)return i.last_flush=-1,Be;s=0}e=i.gzindexs&&(t.adler=le(t.adler,i.pending_buf,i.pending-s,s))}i.status=103}if(103===i.status){if(i.gzhead.hcrc){if(i.pending+2>i.pending_buf_size&&(Je(t),0!==i.pending))return i.last_flush=-1,Be;Ve(i,255&t.adler),Ve(i,t.adler>>8&255),t.adler=0}if(i.status=ze,Je(t),0!==i.pending)return i.last_flush=-1,Be}if(0!==t.avail_in||0!==i.lookahead||e!==be&&i.status!==Pe){let s=0===i.level?Ye(i,e):i.strategy===xe?((t,e)=>{let i;for(;;){if(0===t.lookahead&&(qe(t),0===t.lookahead)){if(e===be)return 1;break}if(t.match_length=0,i=_e(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,i&&(Qe(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===ye?(Qe(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Qe(t,!1),0===t.strm.avail_out)?1:2})(i,e):i.strategy===Me?((t,e)=>{let i,s,a,r;const n=t.window;for(;;){if(t.lookahead<=Fe){if(qe(t),t.lookahead<=Fe&&e===be)return 1;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=3&&t.strstart>0&&(a=t.strstart-1,s=n[a],s===n[++a]&&s===n[++a]&&s===n[++a])){r=t.strstart+Fe;do{}while(s===n[++a]&&s===n[++a]&&s===n[++a]&&s===n[++a]&&s===n[++a]&&s===n[++a]&&s===n[++a]&&s===n[++a]&&at.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=3?(i=_e(t,1,t.match_length-3),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(i=_e(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),i&&(Qe(t,!1),0===t.strm.avail_out))return 1}return t.insert=0,e===ye?(Qe(t,!0),0===t.strm.avail_out?3:4):t.sym_next&&(Qe(t,!1),0===t.strm.avail_out)?1:2})(i,e):si[i.level].func(i,e);if(3!==s&&4!==s||(i.status=Pe),1===s||3===s)return 0===t.avail_out&&(i.last_flush=-1),Be;if(2===s&&(e===we?pe(i):e!==Se&&(ge(i,0,0,!1),e===me&&(We(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),Je(t),0===t.avail_out))return i.last_flush=-1,Be}return e!==ye?Be:i.wrap<=0?Ie:(2===i.wrap?(Ve(i,255&t.adler),Ve(i,t.adler>>8&255),Ve(i,t.adler>>16&255),Ve(i,t.adler>>24&255),Ve(i,255&t.total_in),Ve(i,t.total_in>>8&255),Ve(i,t.total_in>>16&255),Ve(i,t.total_in>>24&255)):(Ze(i,t.adler>>>16),Ze(i,65535&t.adler)),Je(t),i.wrap>0&&(i.wrap=-i.wrap),0!==i.pending?Be:Ie)},deflateEnd:t=>{if(ri(t))return Re;const e=t.state.status;return t.state=null,e===ze?Ne(t,ve):Be},deflateSetDictionary:(t,e)=>{let i=e.length;if(ri(t))return Re;const s=t.state,a=s.wrap;if(2===a||1===a&&s.status!==Le||s.lookahead)return Re;if(1===a&&(t.adler=oe(t.adler,e,i,0)),s.wrap=0,i>=s.w_size){0===a&&(We(s.head),s.strstart=0,s.block_start=0,s.insert=0);let t=new Uint8Array(s.w_size);t.set(e.subarray(i-s.w_size,i),0),e=t,i=s.w_size}const r=t.avail_in,n=t.next_in,o=t.input;for(t.avail_in=i,t.next_in=0,t.input=e,qe(s);s.lookahead>=3;){let t=s.strstart,e=s.lookahead-2;do{He(s,t),t++}while(--e);s.strstart=t,s.lookahead=2,qe(s)}return s.strstart+=s.lookahead,s.block_start=s.strstart,s.insert=s.lookahead,s.lookahead=0,s.match_length=s.prev_length=2,s.match_available=0,t.next_in=n,t.input=o,t.avail_in=r,s.wrap=a,Be},deflateInfo:"pako deflate (from Nodeca project)"};const di=(t,e)=>Object.prototype.hasOwnProperty.call(t,e);var ci=function(t){const e=Array.prototype.slice.call(arguments,1);for(;e.length;){const i=e.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const e in i)di(i,e)&&(t[e]=i[e])}}return t},ui=t=>{let e=0;for(let i=0,s=t.length;i=252?6:t>=248?5:t>=240?4:t>=224?3:t>=192?2:1;fi[254]=fi[255]=1;var _i=t=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(t);let e,i,s,a,r,n=t.length,o=0;for(a=0;a>>6,e[r++]=128|63&i):i<65536?(e[r++]=224|i>>>12,e[r++]=128|i>>>6&63,e[r++]=128|63&i):(e[r++]=240|i>>>18,e[r++]=128|i>>>12&63,e[r++]=128|i>>>6&63,e[r++]=128|63&i);return e};var pi=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const bi=Object.prototype.toString,{Z_NO_FLUSH:wi,Z_SYNC_FLUSH:mi,Z_FULL_FLUSH:yi,Z_FINISH:Si,Z_OK:Bi,Z_STREAM_END:Ii,Z_DEFAULT_COMPRESSION:Ri,Z_DEFAULT_STRATEGY:vi,Z_DEFLATED:Ci}=ce,Ei={level:Ri,method:Ci,chunkSize:16384,windowBits:15,memLevel:8,strategy:vi,legacyHash:!0};function ki(t){this.options=ci({},Ei,t||{});let e=this.options;e.raw&&e.windowBits>0?e.windowBits=-e.windowBits:e.gzip&&e.windowBits>0&&e.windowBits<16&&(e.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new pi,this.strm.avail_out=0;let i=li.deflateInit2(this.strm,e.level,e.method,e.windowBits,e.memLevel,e.strategy,e.legacyHash);if(i!==Bi)throw new Error(de[i]);if(e.header&&li.deflateSetHeader(this.strm,e.header),e.dictionary){let t;if(t="string"==typeof e.dictionary?_i(e.dictionary):"[object ArrayBuffer]"===bi.call(e.dictionary)?new Uint8Array(e.dictionary):e.dictionary,i=li.deflateSetDictionary(this.strm,t),i!==Bi)throw new Error(de[i]);this._dict_set=!0}}ki.prototype.push=function(t,e){const i=this.strm,s=this.options.chunkSize;let a,r;if(this.ended)return!1;for(r=e===~~e?e:!0===e?Si:wi,"string"==typeof t?i.input=_i(t):"[object ArrayBuffer]"===bi.call(t)?i.input=new Uint8Array(t):i.input=t,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(s),i.next_out=0,i.avail_out=s),(r===mi||r===yi)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(a=li.deflate(i,r),a===Ii)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),a=li.deflateEnd(this.strm),this.onEnd(a),this.ended=!0,a===Bi;if(0!==i.avail_out){if(r>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},ki.prototype.onData=function(t){this.chunks.push(t)},ki.prototype.onEnd=function(t){t===Bi&&(this.result=ui(this.chunks)),this.chunks=[],this.err=t,this.msg=this.strm.msg};var xi={deflate:function(t,e){const i=new ki(e);if(i.push(t,!0),i.err)throw i.msg||de[i.err];return i.result}};const{deflate:Mi}=xi;var Ui=Mi;const Di={b:{u:DataView.prototype.getInt8,p:DataView.prototype.setInt8,bytes:1},B:{u:DataView.prototype.getUint8,p:DataView.prototype.setUint8,bytes:1},h:{u:DataView.prototype.getInt16,p:DataView.prototype.setInt16,bytes:2},H:{u:DataView.prototype.getUint16,p:DataView.prototype.setUint16,bytes:2},i:{u:DataView.prototype.getInt32,p:DataView.prototype.setInt32,bytes:4},I:{u:DataView.prototype.getUint32,p:DataView.prototype.setUint32,bytes:4}},Oi=(t,...e)=>{let i=0;if(t.replace(/[<>]/,"").length!=e.length)throw"Pack format to Argument count mismatch";const s=[];let a=!0;for(let s=0;s"==t[s]?a=!1:(r(t[s],e[i]),i++);function r(t,e){if(!(t in Di))throw"Unhandled character '"+t+"' in pack format";const i=Di[t].bytes,r=new DataView(new ArrayBuffer(i));Di[t].p.bind(r)(0,e,a);for(let t=0;t{let i=0;const s=[];let a=!0;for(const e of t)"<"==e?a=!0:">"==e?a=!1:r(e);function r(t){if(!(t in Di))throw"Unhandled character '"+t+"' in unpack format";const r=Di[t].bytes,n=new DataView(new ArrayBuffer(r));for(let t=0;t=this._inputBuffer.length))return this._inputBuffer[this._inputBufferReadIndex++]}_clearInputBuffer(){this._inputBuffer.length=0,this._inputBufferReadIndex=0}_compactInputBuffer(){this._inputBufferReadIndex>1e3&&this._inputBufferReadIndex>this._inputBuffer.length/2&&(this._inputBuffer.splice(0,this._inputBufferReadIndex),this._inputBufferReadIndex=0)}get _totalBytesRead(){return this._parent?this._parent._totalBytesRead:this.__totalBytesRead||0}set _totalBytesRead(t){this._parent?this._parent._totalBytesRead=t:this.__totalBytesRead=t}get _commandLock(){return this._parent?this._parent._commandLock:this.__commandLock}set _commandLock(t){this._parent?this._parent._commandLock=t:this.__commandLock=t}get _isReconfiguring(){return this._parent?this._parent._isReconfiguring:this.__isReconfiguring}set _isReconfiguring(t){this._parent?this._parent._isReconfiguring=t:this.__isReconfiguring=t}get _abandonCurrentOperation(){return this._parent?this._parent._abandonCurrentOperation:this.__abandonCurrentOperation}set _abandonCurrentOperation(t){this._parent?this._parent._abandonCurrentOperation=t:this.__abandonCurrentOperation=t}get _adaptiveBlockMultiplier(){return this._parent?this._parent._adaptiveBlockMultiplier:this.__adaptiveBlockMultiplier}set _adaptiveBlockMultiplier(t){this._parent?this._parent._adaptiveBlockMultiplier=t:this.__adaptiveBlockMultiplier=t}get _adaptiveMaxInFlightMultiplier(){return this._parent?this._parent._adaptiveMaxInFlightMultiplier:this.__adaptiveMaxInFlightMultiplier}set _adaptiveMaxInFlightMultiplier(t){this._parent?this._parent._adaptiveMaxInFlightMultiplier=t:this.__adaptiveMaxInFlightMultiplier=t}get _consecutiveSuccessfulChunks(){return this._parent?this._parent._consecutiveSuccessfulChunks:this.__consecutiveSuccessfulChunks}set _consecutiveSuccessfulChunks(t){this._parent?this._parent._consecutiveSuccessfulChunks=t:this.__consecutiveSuccessfulChunks=t}get _lastAdaptiveAdjustment(){return this._parent?this._parent._lastAdaptiveAdjustment:this.__lastAdaptiveAdjustment}set _lastAdaptiveAdjustment(t){this._parent?this._parent._lastAdaptiveAdjustment=t:this.__lastAdaptiveAdjustment=t}get _isCDCDevice(){return this._parent?this._parent._isCDCDevice:this.__isCDCDevice}set _isCDCDevice(t){this._parent?this._parent._isCDCDevice=t:this.__isCDCDevice=t}detectUSBSerialChip(t,e){const i={6790:{29986:{name:"CH340",maxBaudrate:460800},29987:{name:"CH340",maxBaudrate:460800},30084:{name:"CH340",maxBaudrate:460800},21795:{name:"CH341",maxBaudrate:2e6},21971:{name:"CH343",maxBaudrate:6e6},21972:{name:"CH9102",maxBaudrate:6e6},21976:{name:"CH9101",maxBaudrate:3e6}},4292:{6e4:{name:"CP2102(n)",maxBaudrate:3e6},60016:{name:"CP2105",maxBaudrate:2e6},60017:{name:"CP2108",maxBaudrate:2e6}},1027:{24577:{name:"FT232R",maxBaudrate:3e6},24592:{name:"FT2232",maxBaudrate:3e6},24593:{name:"FT4232",maxBaudrate:3e6},24596:{name:"FT232H",maxBaudrate:12e6},24597:{name:"FT230X",maxBaudrate:3e6}},12346:{2:{name:"ESP32-S2 Native USB",maxBaudrate:2e6},18:{name:"ESP32-P4 Native USB",maxBaudrate:2e6},4097:{name:"ESP32 Native USB",maxBaudrate:2e6}}}[t];return i&&i[e]?i[e]:{name:`Unknown (VID: 0x${t.toString(16)}, PID: 0x${e.toString(16)})`}}async initialize(){if(!this._parent){this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0;const t=this.port.getInfo();if(t.usbVendorId&&t.usbProductId){const e=this.detectUSBSerialChip(t.usbVendorId,t.usbProductId);this.logger.log(`USB-Serial: ${e.name} (VID: 0x${t.usbVendorId.toString(16)}, PID: 0x${t.usbProductId.toString(16)})`),e.maxBaudrate&&(this._maxUSBSerialBaudrate=e.maxBaudrate,this.logger.log(`Max baudrate: ${e.maxBaudrate}`)),12346===t.usbVendorId&&2===t.usbProductId&&(this._isESP32S2NativeUSB=!0),(12346===t.usbVendorId||6790===t.usbVendorId&&21971===t.usbProductId)&&(this._isCDCDevice=!0)}this.readLoop()}await this.connectWithResetStrategies(),await this.detectChip(),this.chipFamily===T&&301===this.chipRevision&&await this.powerOnFlash();try{this._isUsbJtagOrOtg=await this.detectUsbConnectionType(),this.logger.debug("USB connection type: "+(this._isUsbJtagOrOtg?"USB-JTAG/OTG":"External Serial Chip"))}catch(t){this.logger.debug(`Could not detect USB connection type: ${t}`)}try{const t=await this.getUsbMode();this.logger.debug(`USB mode (register): ${t.mode} (uartNo=${t.uartNo})`)}catch(t){this.logger.debug(`Could not detect USB mode: ${t}`)}const t=wt(this.getChipFamily()),e=t.macFuse;for(let t=0;t<4;t++)this._efuses[t]=await this.readRegister(e+4*t);const i=null!==this.chipRevision&&void 0!==this.chipRevision?` (revision ${this.chipRevision})`:"";this.logger.log(`Connected to ${this.chipName}${i}`),this.logger.debug(`Bootloader flash offset: 0x${t.flashOffs.toString(16)}`),this._initializationSucceeded=!0}async detectChip(){try{const t=(await this.getSecurityInfo()).chipId,e=z[t];if(e)return this.chipName=e.name,this.chipFamily=e.family,this.chipRevision=await this.getChipRevision(),this.logger.debug(`${this.chipName} revision: ${this.chipRevision}`),this.chipFamily===T&&this.chipRevision>=300?this.chipVariant="rev300":this.chipFamily===T&&(this.chipVariant="rev0"),void this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${t} (${this.chipName})`);this.logger.debug(`Unknown IMAGE_CHIP_ID: ${t}, falling back to magic value detection`)}catch(t){this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${t}`),await this.drainInputBuffer(200),this._clearInputBuffer(),await r(gt);try{await this.sync()}catch(t){this.logger.debug(`Re-sync after GET_SECURITY_INFO failure: ${t}`)}}const t=await this.readRegister(1073745920),e=P[t>>>0];if(void 0===e)throw new Error(`Unknown Chip: Hex: ${s(t>>>0,8).toLowerCase()} Number: ${t}`);this.chipName=e.name,this.chipFamily=e.family,this.chipRevision=await this.getChipRevision(),this.logger.debug(`${this.chipName} revision: ${this.chipRevision}`),this.chipFamily===T&&(this.chipVariant=this.chipRevision>=300?"rev300":"rev0",this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`)),this.logger.debug(`Detected chip via magic value: ${s(t>>>0,8)} (${this.chipName})`)}async getChipRevision(){var t;let e=0,i=0;switch(this.chipFamily){case v:{const s=await this.readRegister(1073061900),a=await this.readRegister(1073061908);e=a>>24&3;const r=s>>15&1,n=a>>20&1;i=null!==(t={0:0,1:1,3:2,7:3}[(await this.readRegister(1073111164)>>31&1)<<2|n<<1|r])&&void 0!==t?t:0;break}case C:{const t=await this.readRegister(1061265488);e=((t>>20&1)<<3)+(await this.readRegister(1061265492)>>4&7),i=t>>18&3;break}case E:{const t=await this.readRegister(1610641488),s=await this.readRegister(1610641496);e=((s>>23&1)<<3)+(t>>18&7),i=s>>24&3;break}case k:{const t=await this.readRegister(1610647620);e=t>>16&15,i=t>>20&3;break}case x:{const t=await this.readRegister(1610647632),s=await this.readRegister(1610647640);e=((s>>23&1)<<3)+(t>>18&7),i=s>>24&3;break}case M:{const t=await this.readRegister(1611352140);e=15&t,i=t>>4&3;break}case U:{const t=await this.readRegister(1611335760);e=t>>18&15,i=t>>22&3;break}case D:{const t=await this.readRegister(1611352140);e=15&t,i=t>>4&3;break}case O:{const t=await this.readRegister(1611335760);e=t>>18&7,i=t>>21&3;break}case A:case F:break;case T:{const t=await this.readRegister(1343410252);e=15&t,i=(t>>23&1)<<2|t>>4&3;break}case L:{const t=await this.readRegister(544297048);e=15&t,i=t>>4&3;break}}return 100*i+e}async powerOnFlash(){if(this.chipFamily!==T)return;if(301!==this.chipRevision)return;this.logger.debug("Powering on flash for ESP32-P4 Rev 301 (ECO6)"),await this.writeRegister(1343291660,1),await r(10);const t=await this.readRegister(w);await this.writeRegister(w,t|m);const e=await this.readRegister(y);await this.writeRegister(y,128|e);const i=await this.readRegister(S);await this.writeRegister(S,3|i),await r(.05);const s=await this.readRegister(w);await this.writeRegister(w,-134217729&s);const a=await this.readRegister(y);await this.writeRegister(y,-2139095041&a);const n=await this.readRegister(y);await this.writeRegister(y,128|n);const o=await this.readRegister(y);await this.writeRegister(y,-129&o),await r(2),this.logger.debug("Flash powered on successfully")}async getSecurityInfo(){const[,t]=await this.checkCommand(20,[],0);if(0===t.length)throw new Error("GET_SECURITY_INFO not supported or returned empty response");if(t.length<12)throw new Error(`Invalid security info response length: ${t.length} (expected at least 12 bytes)`);return{flags:Ai("=16?Ai("=20?Ai("t.toString(16).padStart(2,"0").toUpperCase()).join(":")}async readLoop(){this.debug&&this.logger.debug("Starting read loop"),this._reader=this.port.readable.getReader();try{let t=!0;for(;t;){const{value:e,done:i}=await this._reader.read();if(i){this._reader.releaseLock(),t=!1;break}if(!e||0===e.length)continue;const s=Array.from(e);Array.prototype.push.apply(this._inputBuffer,s),this._totalBytesRead+=e.length}}catch{}finally{if(this._isReconfiguring=!1,this._reader){try{this._reader.releaseLock(),this.logger.debug("Reader released in readLoop cleanup")}catch(t){this.logger.debug(`Reader release error in readLoop: ${t}`)}this._reader=void 0}}this.connected=!1,this._isESP32S2NativeUSB&&!this._initializationSucceeded&&(this.logger.log("ESP32-S2 Native USB detected - requesting port reselection"),this.dispatchEvent(new CustomEvent("esp32s2-usb-reconnect",{detail:{message:"ESP32-S2 Native USB requires port reselection"}}))),this._suppressDisconnect||this.dispatchEvent(new Event("disconnect")),this._suppressDisconnect=!1,this.logger.debug("Finished read loop")}async setRTS(t){await this.port.setSignals({requestToSend:t}),await this.setDTR(this.state_DTR)}async setDTR(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t})}async setDTRandRTS(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async runSignalSequence(t){const e=!0===this.port.isWebUSB;for(const i of t)void 0!==i.dtr&&void 0!==i.rts?e?await this.setDTRandRTSWebUSB(i.dtr,i.rts):await this.setDTRandRTS(i.dtr,i.rts):(void 0!==i.dtr&&(e?await this.setDTRWebUSB(i.dtr):await this.setDTR(i.dtr)),void 0!==i.rts&&(e?await this.setRTSWebUSB(i.rts):await this.setRTS(i.rts))),i.delayMs&&await r(i.delayMs)}async hardResetUSBJTAGSerial(){await this.runSignalSequence([{rts:!1},{dtr:!1,delayMs:100},{dtr:!0,rts:!1,delayMs:100},{rts:!0},{dtr:!1,rts:!0,delayMs:100},{dtr:!1,rts:!1,delayMs:200}])}async hardResetClassic(){await this.runSignalSequence([{dtr:!1,rts:!0,delayMs:100},{dtr:!0,rts:!1,delayMs:50},{dtr:!1,delayMs:200}])}async hardResetToFirmware(){await this.runSignalSequence([{dtr:!1,rts:!0,delayMs:100},{rts:!1,delayMs:50},{delayMs:200}])}async hardResetUnixTight(){await this.runSignalSequence([{dtr:!0,rts:!0},{dtr:!1,rts:!1},{dtr:!1,rts:!0,delayMs:100},{dtr:!0,rts:!1,delayMs:50},{dtr:!1,rts:!1},{dtr:!1,delayMs:200}])}async setRTSWebUSB(t){this.state_RTS=t,await this.port.setSignals({requestToSend:t,dataTerminalReady:this.state_DTR})}async setDTRWebUSB(t){this.state_DTR=t,await this.port.setSignals({dataTerminalReady:t,requestToSend:this.state_RTS})}async setDTRandRTSWebUSB(t,e){this.state_DTR=t,this.state_RTS=e,await this.port.setSignals({dataTerminalReady:t,requestToSend:e})}async hardResetUSBJTAGSerialInvertedDTRWebUSB(){await this.runSignalSequence([{rts:!1,dtr:!0,delayMs:100},{dtr:!1,rts:!1,delayMs:100},{rts:!0,dtr:!0,delayMs:100},{dtr:!0,rts:!1,delayMs:200}])}async hardResetClassicLongDelayWebUSB(){await this.runSignalSequence([{dtr:!1,rts:!0,delayMs:500},{dtr:!0,rts:!1,delayMs:200},{dtr:!1,delayMs:500}])}async hardResetClassicShortDelayWebUSB(){await this.runSignalSequence([{dtr:!1,rts:!0,delayMs:50},{dtr:!0,rts:!1,delayMs:25},{dtr:!1,delayMs:100}])}async hardResetInvertedWebUSB(){await this.runSignalSequence([{dtr:!0,rts:!1,delayMs:100},{dtr:!1,rts:!0,delayMs:50},{dtr:!0,delayMs:200}])}async hardResetInvertedDTRWebUSB(){await this.runSignalSequence([{dtr:!0,rts:!0,delayMs:100},{dtr:!1,rts:!1,delayMs:50},{dtr:!0,delayMs:200}])}async hardResetInvertedRTSWebUSB(){await this.runSignalSequence([{dtr:!1,rts:!1,delayMs:100},{dtr:!0,rts:!0,delayMs:50},{dtr:!1,delayMs:200}])}isWebUSB(){return!0===this.port.isWebUSB}async connectWithResetStrategies(){const t=this.port.getInfo(),e=4097===t.usbProductId,i=12346===t.usbVendorId,s=[],a=this,n=!e&&!i;if(this.isWebUSB()){const r=4292===t.usbVendorId,o=6790===t.usbVendorId,h=12346===t.usbVendorId&&2===t.usbProductId;(e||i)&&(h?(s.push({name:"USB-JTAG/Serial (WebUSB) - ESP32-S2",fn:async()=>await a.hardResetUSBJTAGSerial()}),s.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB) - ESP32-S2",fn:async()=>await a.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),s.push({name:"UnixTight (WebUSB) - ESP32-S2 CDC",fn:async()=>await a.hardResetUnixTight()}),s.push({name:"Classic (WebUSB) - ESP32-S2 CDC",fn:async()=>await a.hardResetClassic()})):(s.push({name:"USB-JTAG/Serial Inverted DTR (WebUSB)",fn:async()=>await a.hardResetUSBJTAGSerialInvertedDTRWebUSB()}),s.push({name:"USB-JTAG/Serial (WebUSB)",fn:async()=>await a.hardResetUSBJTAGSerial()}),s.push({name:"Inverted DTR Classic (WebUSB)",fn:async()=>await a.hardResetInvertedDTRWebUSB()}))),n&&(o?(s.push({name:"UnixTight (WebUSB) - CH34x",fn:async()=>await a.hardResetUnixTight()}),s.push({name:"Classic (WebUSB) - CH34x",fn:async()=>await a.hardResetClassic()}),s.push({name:"Inverted Both (WebUSB) - CH34x",fn:async()=>await a.hardResetInvertedWebUSB()}),s.push({name:"Inverted RTS (WebUSB) - CH34x",fn:async()=>await a.hardResetInvertedRTSWebUSB()}),s.push({name:"Inverted DTR (WebUSB) - CH34x",fn:async()=>await a.hardResetInvertedDTRWebUSB()})):r?(s.push({name:"UnixTight (WebUSB) - CP2102",fn:async()=>await a.hardResetUnixTight()}),s.push({name:"Classic (WebUSB) - CP2102",fn:async()=>await a.hardResetClassic()}),s.push({name:"Inverted Both (WebUSB) - CP2102",fn:async()=>await a.hardResetInvertedWebUSB()}),s.push({name:"Inverted RTS (WebUSB) - CP2102",fn:async()=>await a.hardResetInvertedRTSWebUSB()}),s.push({name:"Inverted DTR (WebUSB) - CP2102",fn:async()=>await a.hardResetInvertedDTRWebUSB()})):(s.push({name:"UnixTight (WebUSB)",fn:async()=>await a.hardResetUnixTight()}),s.push({name:"Classic (WebUSB)",fn:async function(){return await a.hardResetClassic()}}),s.push({name:"Inverted Both (WebUSB)",fn:async function(){return await a.hardResetInvertedWebUSB()}}),s.push({name:"Inverted RTS (WebUSB)",fn:async function(){return await a.hardResetInvertedRTSWebUSB()}}),s.push({name:"Inverted DTR (WebUSB)",fn:async function(){return await a.hardResetInvertedDTRWebUSB()}}))),n||r||h||e||(6790!==t.usbVendorId&&s.push({name:"Classic (WebUSB)",fn:async function(){return await a.hardResetClassic()}}),s.push({name:"UnixTight (WebUSB)",fn:async function(){return await a.hardResetUnixTight()}}),s.push({name:"Classic Long Delay (WebUSB)",fn:async function(){return await a.hardResetClassicLongDelayWebUSB()}}),s.push({name:"Classic Short Delay (WebUSB)",fn:async function(){return await a.hardResetClassicShortDelayWebUSB()}}),i||s.push({name:"USB-JTAG/Serial fallback (WebUSB)",fn:async function(){return await a.hardResetUSBJTAGSerial()}}))}else(e||i)&&s.push({name:"USB-JTAG/Serial",fn:async function(){return await a.hardResetUSBJTAGSerial()}}),s.push({name:"UnixTight",fn:async function(){return await a.hardResetUnixTight()}}),e||i||s.push({name:"USB-JTAG/Serial (fallback)",fn:async function(){return await a.hardResetUSBJTAGSerial()}});let o=null;for(const t of s)try{if(!this.connected||!this.port.writable){this.logger.debug(`Port disconnected, skipping ${t.name} reset`);continue}if(this._abandonCurrentOperation=!1,await t.fn(),n){if(await this.syncWithTimeout(2e3))return void this.logger.log(`Connected USB Serial successfully with ${t.name} reset.`);throw new Error("Sync timeout or abandoned")}{const e=this.sync(),i=new Promise((t,e)=>setTimeout(()=>e(new Error("Sync timeout")),1e3));try{return await Promise.race([e,i]),void this.logger.debug(`Connected CDC/JTAG successfully with ${t.name} reset.`)}catch(t){throw new Error("Sync timeout or abandoned")}}}catch(t){if(o=t,this._abandonCurrentOperation=!0,await r(100),!this.connected||!this.port.writable){this.logger.log("Port disconnected during reset attempt");break}this._clearInputBuffer(),await this.drainInputBuffer(200),await this.flushSerialBuffers()}throw this._abandonCurrentOperation=!1,new Error(`Couldn't sync to ESP. Try resetting manually. Last error: ${null==o?void 0:o.message}`)}async watchdogReset(){await this.rtcWdtResetChipSpecific()}async rtcWdtResetChipSpecific(){let t,e,i,s;if(this.logger.debug("Hard resetting with watchdog timer..."),this.chipFamily===C)t=1061191852,e=1061191828,i=1061191832,s=1356348065;else if(this.chipFamily===E)t=1610645680,e=1610645656,i=1610645660,s=1356348065;else if(this.chipFamily===x)t=1610645672,e=1610645648,i=1610645652,s=1356348065;else if(this.chipFamily===M||this.chipFamily===U)t=1611340824,e=1611340800,i=1611340804,s=1356348065;else if(this.chipFamily===T)t=1343315992,e=1343315968,i=1343315972,s=1356348065;else{if(this.chipFamily!==L)throw new Error(`rtcWdtResetChipSpecific() is not supported for ${this.chipFamily}`);t=545263640,e=545263616,i=545263620,s=1356348065}await this.writeRegister(t,s,void 0,0),await this.writeRegister(i,2e3,void 0,0);await this.writeRegister(e,-805306110,void 0,0),await this.writeRegister(t,0,void 0,0),await r(500)}async resetToFirmwareMode(t=!0){this.logger.debug("Resetting from bootloader to firmware mode...");try{if(await this.detectUsbConnectionType()){let e;this.logger.debug("USB-JTAG/OTG detected - checking WDT reset support");try{e=await this.getUsbMode(),this.logger.debug(`USB mode: ${e.mode} (uartNo=${e.uartNo})`)}catch(t){this.logger.debug(`Could not get USB mode: ${t}`),e={mode:"usb-jtag-serial",uartNo:0}}if(!(this.chipFamily===C||this.chipFamily===E||this.chipFamily===T||this.chipFamily===L))return this.logger.debug(`${this.chipName} does not support WDT reset - using classic reset instead`),await this.hardResetToFirmware(),this.logger.debug("Classic reset to firmware complete"),!1;if(this.logger.debug(`${this.chipName} supports WDT reset - using WDT reset strategy`),this.IS_STUB){this.logger.debug("On stub - returning to ROM before WDT reset"),this.currentBaudRate!==h&&(this.logger.debug(`Changing baudrate from ${this.currentBaudRate} to 115200`),await this.reconfigurePort(h),this.currentBaudRate=h,this.logger.debug("Baudrate changed to 115200"));const t=this._consoleMode;this._consoleMode=!1,await this.hardReset(!0),await r(200),this._consoleMode=t,await this.sync(),this.IS_STUB=!1,this.logger.debug("Now on ROM")}else this.currentBaudRate!==h&&(this.logger.debug(`Not on stub, but baudrate is ${this.currentBaudRate} - changing to 115200 for WDT reset`),await this.reconfigurePort(h),this.currentBaudRate=h,this.logger.debug("Baudrate changed to 115200"));if(t&&"usb-otg"===e.mode){await this._clearForceDownloadBootIfNeeded()&&this.logger.debug("Force download boot flag cleared")}await this.rtcWdtResetChipSpecific(),this.logger.debug("WDT reset performed - device will boot to firmware");return!!("usb-otg"===e.mode||"usb-jtag-serial"===e.mode)&&(this.logger.debug(`Port will change after WDT reset (${e.mode}) - port reselection needed`),!0)}return this.logger.debug("External serial chip detected - using classic reset"),await this.hardResetToFirmware(),this.logger.debug("Classic reset to firmware complete"),!1}catch(t){throw this.logger.error(`Failed to reset to firmware mode: ${t}`),t}}async hardReset(t=!1){if(this._consoleMode)return t?void this.logger.debug("Skipping bootloader reset - device is in console mode"):(this.logger.debug("Performing hardware reset (console mode)..."),await this.resetInConsoleMode(),void this.logger.debug("Hardware reset complete"));if(t)4097===this.port.getInfo().usbProductId?(await this.hardResetUSBJTAGSerial(),this.logger.debug("USB-JTAG/Serial reset to bootloader.")):(await this.hardResetClassic(),this.logger.debug("Classic reset to bootloader."));else{this.logger.debug("Resetting to firmware mode...");if(await this.detectUsbConnectionType()){let t;this.logger.debug("USB-JTAG/OTG detected - using WDT reset");try{t=await this.getUsbMode(),this.logger.debug(`USB mode: ${t.mode} (uartNo=${t.uartNo})`)}catch(e){this.logger.debug(`Could not get USB mode: ${e}`),t={mode:"usb-jtag-serial",uartNo:0}}if("usb-otg"===t.mode)try{await this._clearForceDownloadBootIfNeeded()&&this.logger.debug("Force download boot flag cleared")}catch(t){this.logger.debug(`Could not clear force download flag: ${t}`)}return await this.rtcWdtResetChipSpecific(),void this.logger.debug(`${this.chipName}: WDT reset to firmware complete`)}this.logger.debug("External serial chip detected - using classic reset"),this.isWebUSB()?(await this.setRTSWebUSB(!0),await r(200),await this.setRTSWebUSB(!1),await r(200),this.logger.debug("Hard reset to firmware (WebUSB).")):(await this.setRTS(!0),await r(100),await this.setRTS(!1),this.logger.debug("Hard reset to firmware."))}await new Promise(t=>setTimeout(t,1e3))}macAddr(){const t=new Array(6).fill(0),e=this._efuses[0],i=this._efuses[1],s=this._efuses[2],a=this._efuses[3];let r;if(this.chipFamily==R){if(0!=a)r=[a>>16&255,a>>8&255,255&a];else if(i>>16&255){if(1!=(i>>16&255))throw new Error("Couldnt determine OUI");r=[172,208,116]}else r=[24,254,52];t[0]=r[0],t[1]=r[1],t[2]=r[2],t[3]=i>>8&255,t[4]=255&i,t[5]=e>>24&255}else if(this.chipFamily==v)t[0]=s>>8&255,t[1]=255&s,t[2]=i>>24&255,t[3]=i>>16&255,t[4]=i>>8&255,t[5]=255&i;else{if(this.chipFamily!=C&&this.chipFamily!=E&&this.chipFamily!=k&&this.chipFamily!=x&&this.chipFamily!=M&&this.chipFamily!=U&&this.chipFamily!=D&&this.chipFamily!=O&&this.chipFamily!=A&&this.chipFamily!=F&&this.chipFamily!=T&&this.chipFamily!=L)throw new Error("Unknown chip family");t[0]=i>>8&255,t[1]=255&i,t[2]=e>>24&255,t[3]=e>>16&255,t[4]=e>>8&255,t[5]=255&e}return t}async readRegister(t){this.debug&&this.logger.debug("Reading from Register "+s(t,8));const e=Oi("{a=Math.min(a,ut),await this.sendCommand(t,e,i);const[r,n]=await this.getResponse(t,a);if(null===n)throw new Error("Didn't get enough status bytes");let o=n,h=0;if(this.IS_STUB||this.chipFamily==R?h=2:[v,C,E,k,x,M,U,D,O,A,F,T,L].includes(this.chipFamily)||20===t?h=4:[2,4].includes(o.length)?h=o.length:(h=2,this.logger.debug(`Unknown chip family, defaulting to 2-byte status (opcode: ${s(t)}, data.length: ${o.length})`)),o.lengtht){throw new mt("Timed out waiting for packet "+(null===e?"header":"content"))}if(0!==this._inputBufferAvailable)for(;this._inputBufferAvailable>0;){if(Date.now()-n>t){throw new mt("Timed out waiting for packet "+(null===e?"header":"content"))}const r=this._readByte();if(null===e){if(r!=this.SLIP_END)throw this.debug&&(this.logger.debug("Read invalid data: "+s(r)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new mt("Invalid head of packet ("+s(r)+")");e=[]}else if(a)if(a=!1,r==this.SLIP_ESC_END)e.push(this.SLIP_END);else{if(r!=this.SLIP_ESC_ESC)throw this.debug&&(this.logger.debug("Read invalid data: "+s(r)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new mt("Invalid SLIP escape (0xdb, "+s(r)+")");e.push(this.SLIP_ESC)}else if(r==this.SLIP_ESC)a=!0;else{if(r==this.SLIP_END)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(r)}}else await r(1)}}else{let n=[];for(;;){if(this._abandonCurrentOperation)throw new mt("Operation abandoned (reset strategy timeout)");const o=Date.now();for(n=[];Date.now()-o0){n.push(this._readByte());break}await r(1)}if(0==n.length){throw new mt("Timed out waiting for packet "+(null===e?"header":"content"))}this.debug&&this.logger.debug("Read "+n.length+" bytes: "+i(n));for(const t of n)if(null===e){if(t!=this.SLIP_END)throw this.debug&&(this.logger.debug("Read invalid data: "+s(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new mt("Invalid head of packet ("+s(t)+")");e=[]}else if(a)if(a=!1,t==this.SLIP_ESC_END)e.push(this.SLIP_END);else{if(t!=this.SLIP_ESC_ESC)throw this.debug&&(this.logger.debug("Read invalid data: "+s(t)),this.logger.debug("Remaining data in serial buffer: "+i(this._inputBuffer))),new mt("Invalid SLIP escape (0xdb, "+s(t)+")");e.push(this.SLIP_ESC)}else if(t==this.SLIP_ESC)a=!0;else{if(t==this.SLIP_END)return this.debug&&this.logger.debug("Received full packet: "+i(e)),this._compactInputBuffer(),e;e.push(t)}}}}async getResponse(t,e=3e3){for(let i=0;i<100;i++){const i=await this.readPacket(e);if(i.length<8)continue;const[a,r,,n]=Ai(">>24}async getC5CrystalFreqDetected(){const t=1048575&await this.readRegister(1610612756),e=h*t/1e6;return e>45?48:e>33?40:26}async setBaudrate(t){const e=this._parent?this._parent.chipFamily:this.chipFamily;if(this.IS_STUB||e!==M)try{const e=Oi("i&&(this.logger.log(`⚠️ WARNING: Baudrate ${t} exceeds USB-Serial chip limit (${i})!`),this.logger.log("⚠️ This may cause data corruption or connection failures!")),this.logger.debug(`Changed baud rate to ${t}`)}async setBaudrateC5Rom(t){const e=await this.getC5CrystalFreqRomExpect(),i=await this.getC5CrystalFreqDetected();this.logger.log(`ROM expects crystal freq: ${e} MHz, detected ${i} MHz.`);let s=t;48===i&&40===e?s=Math.trunc(40*t/48):40===i&&48===e&&(s=Math.trunc(48*t/40)),this.logger.log(`Changing baud rate to ${s}...`);try{const t=Oi("t)return!1;if(this._abandonCurrentOperation)return!1;this._clearInputBuffer();try{if(await this._sync())return await r(gt),!0}catch(t){if(this._abandonCurrentOperation)return!1}await r(gt)}return!1}async sync(){for(let t=0;t<5;t++){this._clearInputBuffer();if(await this._sync())return await r(gt),!0;await r(gt)}throw new Error("Couldn't sync to ESP. Try resetting.")}async _sync(){await this.sendCommand(8,I);for(let t=0;t<8;t++)try{const[,t]=await this.getResponse(8,gt);if(t.length>1&&0==t[0]&&0==t[1])return!0}catch(e){this.debug&&this.logger.debug(`Sync attempt ${t+1} failed: ${e}`)}return!1}getFlashWriteSize(){return this.IS_STUB?16384:1024}async flashData(t,e,i=0,a=!1){if(t.byteLength>=8){const e=Array.from(new Uint8Array(t,0,4)),i=e[0],a=e[2],r=e[3];this.logger.log(`Image header, Magic=${s(i)}, FlashMode=${s(a)}, FlashSizeFreq=${s(r)}`)}const r=(t=function(t,e,i=255){const s=t.length%e;if(0!==s){const a=new Uint8Array(e-s).fill(i),r=new Uint8Array(t.length+a.length);return r.set(t),r.set(a,t.length),r}return t}(new Uint8Array(t),4).buffer).byteLength;let n,o=0,h=dt;a?(n=Ui(new Uint8Array(t),{level:9}).buffer,o=n.byteLength,this.logger.log(`Writing data with filesize: ${r}. Compressed Size: ${o}`),h=await this.flashDeflBegin(r,o,i)):(this.logger.log(`Writing data with filesize: ${r}`),n=t,await this.flashBegin(r,i));let l=[],d=0,c=0,u=0;const g=Date.now(),f=this.getFlashWriteSize(),_=a?o:r;for(;_-u>0;)this.debug&&this.logger.log(`Writing at ${s(i+d*f,8)} `),_-u>=f?l=Array.from(new Uint8Array(n,u,f)):(l=Array.from(new Uint8Array(n,u,_-u)),a||(l=l.concat(new Array(f-l.length).fill(255)))),a?await this.flashDeflBlock(l,d,h):await this.flashBlock(l,d),d+=1,c+=a?Math.round(l.length*r/o):l.length,u+=f,e(Math.min(c,r),r);this.logger.log("Took "+(Date.now()-g)+"ms to write "+_+" bytes"),this.IS_STUB&&(await this.flashBegin(0,0),a?await this.flashDeflFinish():await this.flashFinish())}async flashBlock(t,e,i=3e3){await this.checkCommand(3,Oi("0&&(r=r.concat(Oi("0&&await this.writeRegister(s,e-1),i>0&&await this.writeRegister(a,i-1)}else{const s=t.regBase+t.usr1Offs,a=(0==i?0:i-1)<<8|(0==e?0:e-1)<<17;await this.writeRegister(s,a)}}async waitDone(t,e){for(let i=0;i<10;i++){if(0==(await this.readRegister(t)&e))return}throw Error("SPI command did not complete in time")}async runSpiFlashCommand(t,e,i=0){const a=wt(this.getChipFamily()),r=a.regBase,n=r,o=r+a.usrOffs,h=r+a.usr2Offs,l=r+a.w0Offs,d=1<<18;if(i>32)throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported");if(e.length>64)throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported");const c=8*e.length,u=await this.readRegister(o),g=await this.readRegister(h);let f=1<<31;if(i>0&&(f|=268435456),c>0&&(f|=134217728),await this.setDataLengths(a,c,i),await this.writeRegister(o,f),await this.writeRegister(h,7<<28|t),0==c)await this.writeRegister(l,0);else{const t=(4-e.length%4)%4;e=e.concat(new Array(t).fill(0));const i=Ai("I".repeat(Math.floor(e.length/4)),e);let a=l;this.logger.debug(`Words Length: ${i.length}`);for(const t of i)this.logger.debug(`Writing word ${s(t)} to register offset ${s(a)}`),await this.writeRegister(a,t),a+=4}await this.writeRegister(n,d),await this.waitDone(n,d);const _=await this.readRegister(l);return await this.writeRegister(o,u),await this.writeRegister(h,g),_}async detectFlashSize(){this.logger.debug("Detecting Flash Size");const t=await this.flashId(),e=255&t,i=t>>16&255,s=(t>>8&255)<<8|i,a=St[e],r=Bt[e<<16|s];this.logger.log(`Flash Manufacturer: ${a||"Unknown"} (0x${e.toString(16)})`),this.logger.log(`Flash Device: ${r||`Unknown (0x${s.toString(16)})`}`),this.flashSize=n[i],this.logger.log(`Auto-detected Flash size: ${this.flashSize}`)}getEraseSize(t,e){const i=o,s=Math.floor((e+i-1)/i);let a=16-Math.floor(t/i)%16;return sr&&(a=r),await this.memBlock(s.slice(e,a),t)}}await this.memFinish(e.entry);const s=await this.readPacket(500),a=String.fromCharCode(...s);if("OHAI"!=a)throw new Error("Failed to start stub. Unexpected response: "+a);this.logger.debug("Stub is now running...");const r=new Ti(this.port,this.logger,this);return t||await r.detectFlashSize(),r}get _writer(){return this._parent?this._parent._writer:this.__writer}set _writer(t){this._parent?this._parent._writer=t:this.__writer=t}get _writeChain(){return this._parent?this._parent._writeChain:this.__writeChain}set _writeChain(t){this._parent?this._parent._writeChain=t:this.__writeChain=t}async writeToStream(t){if(this.port.writable){if(this._isReconfiguring)throw new Error("Cannot write during port reconfiguration");this._writeChain=this._writeChain.then(async()=>{if(!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.error(`Failed to get writer: ${t}`),t}await this._writer.write(new Uint8Array(t))},async()=>{if(this.logger.debug("Previous write failed, attempting recovery for current write"),!this.port.writable)throw new Error("Port became unavailable during write");if(!this._writer)try{this._writer=this.port.writable.getWriter()}catch(t){throw this.logger.debug(`Failed to get writer in recovery: ${t}`),new Error("Cannot acquire writer lock")}await this._writer.write(new Uint8Array(t))}).catch(t=>{if(this.logger.error(`Write error: ${t}`),this._writer){try{this._writer.releaseLock()}catch{}this._writer=void 0}throw t}),await this._writeChain}else this.logger.debug("Port writable stream not available, skipping write")}async disconnect(){if(this._parent)await this._parent.disconnect();else if(this.port.writable){try{await this._writeChain}catch(t){}if(this._writer){try{await this._writer.close(),this._writer.releaseLock()}catch(t){}this._writer=void 0}else try{const t=this.port.writable.getWriter();await t.close(),t.releaseLock()}catch(t){}await new Promise(t=>{if(!this._reader)return void t(void 0);const e=setTimeout(()=>{this.logger.debug("Disconnect timeout - forcing resolution"),t(void 0)},1e3);this.addEventListener("disconnect",()=>{clearTimeout(e),t(void 0)},{once:!0});try{this._reader.cancel()}catch(i){clearTimeout(e),t(void 0)}}),this.connected=!1;try{await this.port.close(),this.logger.debug("Port closed successfully")}catch(t){this.logger.debug(`Port close error: ${t}`)}}}async releaseReaderWriter(){if(this._parent)await this._parent.releaseReaderWriter();else{try{await this._writeChain}catch(t){}if(this._writer){try{this._writer.releaseLock(),this.logger.debug("Writer released")}catch(t){this.logger.debug(`Writer release error: ${t}`)}this._writer=void 0}if(this._reader)try{this._suppressDisconnect=!0,await this._reader.cancel(),this.logger.debug("Reader cancelled - waiting for readLoop to finish"),await r(50),this.logger.debug("ReadLoop cleanup should be complete")}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}}}async resetToFirmware(){return await this._resetToFirmwareIfNeeded()}async detectUsbConnectionType(){const t=this.port.getInfo(),e=t.usbProductId;if(!(12346===t.usbVendorId))return this.logger.debug("Not Espressif VID - external serial chip"),!1;const i=[2,18,4097].includes(e||0);return this.logger.debug(`USB-JTAG/OTG detection: ${i?"YES":"NO"} (PID=0x${null==e?void 0:e.toString(16)})`),i}async getUsbMode(){var t,e;const i=this._parent?this._parent.chipFamily:this.chipFamily,s=this._parent?null!==(t=this._parent.chipRevision)&&void 0!==t?t:0:null!==(e=this.chipRevision)&&void 0!==e?e:0;let a=null,r=null,n=null;switch(i){case C:a=1073741076,n=2;break;case E:a=1070526796,r=4,n=3;break;case x:a=(s<101?1070461028:1070461024)+24,r=3;break;case M:a=1082520852,r=3;break;case U:a=1082652032,r=3;break;case D:a=s<=200?1082455532:1082455524,r=s<=200?3:4;break;case O:a=1082457852,r=3;break;case A:a=1082652032,r=3;break;case T:a=s<300?1341390536:1341914824,r=6,n=5}if(null===a)return{mode:"uart",uartNo:0};const o=255&await this.readRegister(a);return null!==n&&o===n?(this.logger.debug(`USB mode: USB-OTG (uartNo=${o})`),{mode:"usb-otg",uartNo:o}):null!==r&&o===r?(this.logger.debug(`USB mode: USB-JTAG/Serial (uartNo=${o})`),{mode:"usb-jtag-serial",uartNo:o}):(this.logger.debug(`USB mode: UART (uartNo=${o})`),{mode:"uart",uartNo:o})}supportsNativeUsb(){const t=this._parent?this._parent.chipFamily:this.chipFamily;return[C,E,x,M,U,D,O,A,T].includes(t)}async _ensureStreamsReady(){if(this.isWebUSB())try{await this.port.recreateStreams(),this.logger.debug("WebUSB streams recreated");let t=30;for(;t>0&&!this.port.readable;)await r(100),t--;if(!this.port.readable)throw new Error("Readable stream not available after recreating streams");this.logger.debug("WebUSB streams are ready")}catch(t){throw this.logger.error(`Failed to recreate WebUSB streams: ${t}`),this._consoleMode=!1,t}else{let t=20;for(;t>0&&!this.port.readable;)await r(100),t--;if(!this.port.readable)throw this._consoleMode=!1,new Error("Readable stream not available after reset");this.logger.debug("Port streams are ready")}}async enterConsoleMode(){if(!this.port.writable||!this.port.readable)return this.logger.debug("Port is not open - port selection needed"),!0;let t;try{t=await this.detectUsbConnectionType(),this.logger.debug("USB connection type detected: "+(t?"USB-JTAG/OTG":"External Serial Chip")),this._isUsbJtagOrOtg=t}catch(e){if(void 0===this.isUsbJtagOrOtg)throw new Error(`Cannot enter console mode: USB connection type unknown and detection failed: ${e}`);this.logger.debug(`USB detection failed, using cached value: ${this.isUsbJtagOrOtg}`),t=this.isUsbJtagOrOtg}if(this._consoleMode=!0,t){return!!await this._resetToFirmwareIfNeeded()||(await this._ensureStreamsReady(),!1)}try{await this.releaseReaderWriter(),await r(100)}catch(t){this.logger.debug(`Failed to release locks: ${t}`)}try{await this.hardResetToFirmware(),this.logger.debug("Device reset to firmware mode")}catch(t){this.logger.debug(`Could not reset device: ${t}`)}return await this._ensureStreamsReady(),!1}async _clearForceDownloadBootIfNeeded(){try{let t,e,i;if(this.chipFamily===C)t=1061191976,e=1,i="ESP32-S2";else if(this.chipFamily===E)t=1610645804,e=1,i="ESP32-S3";else{if(this.chipFamily!==T)return!1;t=1343291400,e=4,i="ESP32-P4"}const s=await this.readRegister(t);this.logger.debug(`${i} force download boot register: 0x${s.toString(16)} (mask: 0x${e.toString(16)})`);return 0!==(s&e)?(this.logger.debug(`${i} force download boot flag is SET - clearing it`),await this.writeRegister(t,0,e,0),this.logger.debug(`${i} force download boot flag cleared`),!0):(this.logger.debug(`${i} force download boot flag is already CLEAR - no action needed`),!1)}catch(t){return this.logger.debug(`Error checking/clearing force download flag: ${t}`),!1}}async _resetToFirmwareIfNeeded(){const t=await this.detectUsbConnectionType();try{if(!this.port.writable||!this.port.readable)return this.logger.debug("Port is not open - assuming device is already in firmware mode"),!1;t?this.logger.debug("USB-JTAG/OTG: Keeping reader/writer active for WDT reset"):(await this.releaseReaderWriter(),this.logger.debug("External serial: Reader/writer released before reset"));return await this.resetToFirmwareMode(!0)?(this.logger.debug(`${this.chipName}: Port will change after WDT reset - user must reselect port`),this.dispatchEvent(new CustomEvent("usb-otg-port-change",{detail:{chipName:this.chipName,message:`${this.chipName} USB port changed after reset. Please select the new port.`,reason:"wdt-reset-to-firmware"}})),!0):(t&&(await this.releaseReaderWriter(),this.logger.debug("Reader/writer released after reset")),!1)}catch(e){return this.logger.error(`Reset to firmware mode failed: ${e}`),t?(this.logger.debug("Forcing port reselection due to USB-JTAG/OTG reset failure"),!0):(this.logger.debug("External serial reset failed, but port should still be usable"),!1)}}async reconnect(){if(this._parent)await this._parent.reconnect();else try{this.logger.log("Reconnecting serial port...");const t=this.currentBaudRate;this.connected=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0;try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconnect: ${t}`)}if(this._isReconfiguring=!0,this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconnect: ${t}`)}this._writer=void 0}if(this._reader){try{await this._reader.cancel()}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}this._reader=void 0}try{await this.port.close(),this.logger.debug("Port closed")}catch(t){this.logger.debug(`Port close error: ${t}`)}this.logger.debug("Opening port...");try{await this.port.open({baudRate:h}),this.connected=!0,this.currentBaudRate=h}catch(t){throw new Error(`Failed to open port: ${t}`)}if(!this.port.readable||!this.port.writable)throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this._isReconfiguring=!1;const e=this.chipFamily,i=this.chipName,s=this.chipRevision,a=this.chipVariant,r=this.flashSize;if(await this.hardReset(!0),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.readLoop()),await this.flushSerialBuffers(),await this.sync(),this.chipFamily=e,this.chipName=i,this.chipRevision=s,this.chipVariant=a,this.flashSize=r,this.logger.debug(`Reconnect complete (chip: ${this.chipName})`),!this.port.writable||!this.port.readable)throw new Error("Port not ready after reconnect");this.chipFamily===T&&301===this.chipRevision&&await this.powerOnFlash();const n=await this.runStub(!0);if(this.logger.debug("Stub loaded"),t!==h&&(await n.setBaudrate(t),!this.port.writable||!this.port.readable))throw new Error(`Port not ready after baudrate change (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this.IS_STUB=!0,this.logger.debug("Reconnection successful")}catch(t){throw this._isReconfiguring=!1,t}}async reconnectToBootloader(){if(this._parent)await this._parent.reconnectToBootloader();else try{this.logger.log("Reconnecting to bootloader mode..."),this._consoleMode=!1,this.connected=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0;try{await this._writeChain}catch(t){this.logger.debug(`Pending write error during reconnect: ${t}`)}if(this._isReconfiguring=!0,this._writer){try{this._writer.releaseLock()}catch(t){this.logger.debug(`Writer release error during reconnect: ${t}`)}this._writer=void 0}if(this._reader){try{await this._reader.cancel()}catch(t){this.logger.debug(`Reader cancel error: ${t}`)}this._reader=void 0}try{await this.port.close(),this.logger.debug("Port closed")}catch(t){this.logger.debug(`Port close error: ${t}`)}this.logger.debug("Opening port...");try{await this.port.open({baudRate:h}),this.connected=!0,this.currentBaudRate=h}catch(t){throw new Error(`Failed to open port: ${t}`)}if(!this.port.readable||!this.port.writable)throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`);this._isReconfiguring=!1,this.__chipFamily=void 0,this.chipName="Unknown Chip",this.chipRevision=null,this.chipVariant=null,this.IS_STUB=!1,this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.readLoop()),await r(100),await this.connectWithResetStrategies(),await this.detectChip(),this.logger.debug(`Reconnected to bootloader: ${this.chipName}`)}catch(t){throw this._isReconfiguring=!1,t}}async exitConsoleMode(){if(this._parent)return await this._parent.exitConsoleMode();this._consoleMode=!1;const t=this.chipFamily===C||this.chipFamily===T;let e=this._isUsbJtagOrOtg;if(t&&void 0===e)try{e=await this.detectUsbConnectionType()}catch(t){this.logger.debug(`USB detection failed, assuming USB-JTAG/OTG for ${this.chipName}: ${t}`),e=!0}if(t&&e){this.logger.debug(`${this.chipName} USB: Resetting to bootloader mode`);try{await this.hardResetClassic(),this.logger.debug("Reset to bootloader initiated")}catch(t){this.logger.debug(`Reset error: ${t}`)}return await r(500),this.logger.debug(`${this.chipName}: Port changed. Please select the bootloader port.`),this.dispatchEvent(new CustomEvent("usb-otg-port-change",{detail:{chipName:this.chipName,message:`${this.chipName}: Port changed. Please select the bootloader port.`,reason:"exit-console-to-bootloader"}})),!0}return await this.reconnectToBootloader(),!1}isConsoleResetSupported(){if(this._parent)return this._parent.isConsoleResetSupported();return!(this.chipFamily===C&&(!0===this._isUsbJtagOrOtg||void 0===this._isUsbJtagOrOtg))}async resetInConsoleMode(){if(this._parent)return await this._parent.resetInConsoleMode();if(!this.isConsoleResetSupported())return this.logger.debug("Simple Console reset not supported for ESP32-S2 USB-JTAG/CDC - using exitConsoleMode to enter bootloader"),await this.exitConsoleMode(),void this.logger.debug("S2 now in bootloader mode - caller must do syncAndWdtReset on new port, then reconnect console");try{this.logger.debug("Resetting device in console mode"),await this.hardResetToFirmware(),this.logger.debug("Device reset complete")}catch(t){throw this.logger.error(`Reset failed: ${t}`),t}}async syncAndWdtReset(t){this._parent?await this._parent.syncAndWdtReset(t):(this.port=t,this.connected=!1,this.IS_STUB=!1,this.__inputBuffer=[],this.__inputBufferReadIndex=0,this.__totalBytesRead=0,this.logger.debug("Opening bootloader port at 115200..."),await this.port.open({baudRate:h}),this.connected=!0,this.currentBaudRate=h,this.readLoop(),await r(100),this.logger.debug("Syncing with bootloader ROM..."),await this.sync(),this.logger.debug("Bootloader sync OK, no stub"),this.logger.debug("Firing WDT reset..."),await this.rtcWdtResetChipSpecific(),this.logger.debug("WDT reset fired - device will boot to firmware"))}async drainInputBuffer(t=200){await r(t);let e=0;const i=Date.now();for(;e<112&&Date.now()-i<100;)if(this._inputBufferAvailable>0){void 0!==this._readByte()&&e++}else await r(1);e>0&&this.logger.debug(`Drained ${e} bytes from input buffer`),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0)}async flushSerialBuffers(){this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),await r(gt),this._parent||(this.__inputBuffer=[],this.__inputBufferReadIndex=0),this.logger.debug("Serial buffers flushed")}async readFlash(e,i,s,a){if(!this.IS_STUB)throw new Error("Reading flash is only supported in stub mode. Please run runStub() first.");await this.flushSerialBuffers();const n=Date.now();let o;this.logger.log(`Reading ${i} bytes from flash at address 0x${e.toString(16)}...`),this.isWebUSB()&&(this._isCDCDevice?(this._adaptiveBlockMultiplier=8,this._adaptiveMaxInFlightMultiplier=8,this._consecutiveSuccessfulChunks=0,this.logger.debug(`CDC device - Initialized: blockMultiplier=${this._adaptiveBlockMultiplier}, maxInFlightMultiplier=${this._adaptiveMaxInFlightMultiplier}`)):(this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0,this.logger.debug("Non-CDC device - Fixed values: blockSize=31, maxInFlight=31"))),void 0!==(null==a?void 0:a.chunkSize)?(o=a.chunkSize,this.logger.log(`Using custom chunk size: 0x${o.toString(16)} bytes`)):o=this.isWebUSB()?16384:262144;let h=new Uint8Array(0),l=e,d=i;for(;d>0;){const e=Math.min(o,d);let n=!1,c=0;const u=5;let g=!1;for(;!n&&c<=u;){let i=new Uint8Array(0);try{let s,o;if(0===c&&this.logger.debug(`Reading chunk at 0x${l.toString(16)}, size: 0x${e.toString(16)}`),void 0!==(null==a?void 0:a.blockSize)&&void 0!==(null==a?void 0:a.maxInFlight))s=a.blockSize,o=a.maxInFlight,0===c&&this.logger.debug(`Using custom parameters: blockSize=${s}, maxInFlight=${o}`);else if(this.isWebUSB()){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2);s=e*this._adaptiveBlockMultiplier,o=e*this._adaptiveMaxInFlightMultiplier}else{const t=63;s=65*t,o=130*t}const d=Math.max(1,Math.ceil(o/s)),u=Oi("=e)break}throw t}if(s&&s.length>0){const e=new Uint8Array(s),a=new Uint8Array(i.length+e.length);a.set(i),a.set(e,i.length),i=a;const r=Oi("=2)){const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=8,s=8;let a=!1;if(this._adaptiveBlockMultiplier1||this._adaptiveMaxInFlightMultiplier>1){this._adaptiveBlockMultiplier=1,this._adaptiveMaxInFlightMultiplier=1,this._consecutiveSuccessfulChunks=0;const t=this.port.maxTransferSize||64,e=Math.floor((t-2)/2),i=e*this._adaptiveBlockMultiplier,s=e*this._adaptiveMaxInFlightMultiplier;this.logger.debug(`Error at higher speed - reduced to minimum: blockSize=${i}, maxInFlight=${s}`)}else this.logger.debug("Error at minimum speed (blockSize=31, maxInFlight=31) - not a speed issue");if(!(t instanceof mt))throw t;if(c<=u)this.logger.debug(`Cleared buffer and retrying (attempt ${c}/${u})...`);else{if(g)throw new Error(`Failed to read chunk at 0x${l.toString(16)} after ${u} retries and recovery attempt`);g=!0,this.logger.log(`All retries exhausted at 0x${l.toString(16)}. Attempting recovery (close and reopen port)...`);try{await this.reconnect(),this.logger.log("Deep recovery successful. Resuming read from current position..."),c=0;continue}catch(t){throw new Error(`Failed to read chunk at 0x${l.toString(16)} after ${u} retries and recovery failed: ${t}`)}}}}s&&s(new Uint8Array(e),h.length,i),l+=e,d-=e,this.logger.debug(`Total progress: 0x${h.length.toString(16)} from 0x${i.toString(16)} bytes`)}const c=Date.now()-n,u=(h.length/1024/(c/1e3)).toFixed(1);return this.logger.log(`Read complete: ${h.length} bytes in ${(c/1e3).toFixed(1)} s (${u} KB/s)`),h}}class Ti extends Fi{constructor(){super(...arguments),this.IS_STUB=!0}async memBegin(t,e,i,a){const r=await yt(this.chipFamily,this.chipRevision);if(null===r)return[0,[]];const n=a,o=a+t;this.logger.debug(`Load range: ${s(n,8)}-${s(o,8)}`),this.logger.debug(`Stub data: ${s(r.data_start,8)}, len: ${r.data.length}, text: ${s(r.text_start,8)}, len: ${r.text.length}`);for(const[t,e]of[[r.data_start,r.data_start+r.data.length],[r.text_start,r.text_start+r.text.length]])if(nt)throw new Error("Software loader is resident at "+s(t,8)+"-"+s(e,8)+". Can't load binary at overlapping address range "+s(n,8)+"-"+s(o,8)+". Try changing the binary loading address.");return[0,[]]}async eraseFlash(){await this.checkCommand(208,[],0,ct)}async eraseRegion(t,e){if(t<0)throw new Error(`Invalid offset: ${t} (must be non-negative)`);if(e<0)throw new Error(`Invalid size: ${e} (must be non-negative)`);if(0===e)return void this.logger.log("eraseRegion: size is 0, skipping erase");if(t%o!==0)throw new Error(`Offset ${t} (0x${t.toString(16)}) is not aligned to flash sector size 4096 (0x${o.toString(16)})`);if(e%o!==0)throw new Error(`Size ${e} (0x${e.toString(16)}) is not aligned to flash sector size 4096 (0x${o.toString(16)})`);const i=4294967295;if(t>i)throw new Error(`Offset ${t} exceeds maximum value 4294967295`);if(e>i)throw new Error(`Size ${e} exceeds maximum value 4294967295`);if(t+e>i)throw new Error(`Region end (offset + size = ${t+e}) exceeds maximum addressable range 4294967295`);const s=bt(ft,e),a=Oi("t.length)break;const r=t.slice(s,s+i),n=r[0]|r[1]<<8;for(let t=0;t=32&&r[e]<127)i++;else if(0===r[e])break;if(i>=4){e+=5;break}}if(32768&n){const t=32767&n;t>0&&t<4096&&(e+=2)}}return e>=10}function Qi(t,e,i){const s=Wi;for(const a of s)for(let s=0;s<2;s++){const r=s*a,n=r+8;if(n+8>t.length)continue;if("littlefs"===String.fromCharCode(t[n],t[n+1],t[n+2],t[n+3],t[n+4],t[n+5],t[n+6],t[n+7])){const s=r+16,n=t[s]|t[s+1]<<8|t[s+2]<<16|t[s+3]<<24;if(0!==n&&n>>>0!=4294967295){const s=r+24;if(s+4<=t.length){const r=t[s]|t[s+1]<<8|t[s+2]<<16|t[s+3]<<24;if(r>0&&r<1e5){const t=r*a;if(t>0&&e+t<=i)return{start:e,end:e+t,size:t,page:256,block:a}}}return Vi(e,i,a)}}}if(Ji(t))return Vi(e,i,Hi);if(t.length>=4){if(538182953===(t[0]|t[1]<<8|t[2]<<16|t[3]<<24)){let s=!0;if(t.length>=16){let e=!0;for(let i=4;i<16;i++)if(255!==t[i]){e=!1;break}e&&(s=!1)}if(s)return Vi(e,i,Hi)}}const a=[0,4096];for(const s of a){if(t.length0&&r>0&&r<1e8){const t=r*a,n=e+s;if(t>0&&n+t<=i)return{start:n,end:n+t,size:t,page:a,block:a}}}}return null}function Vi(t,e,i){const s=e/1048576;if(s>=16){if(1048576===t)return{start:1048576,end:16752640,size:15704064,page:256,block:i};if(2097152===t)return{start:2097152,end:16752640,size:14655488,page:256,block:i}}if(s>=8){if(1048576===t)return{start:1048576,end:8364032,size:7315456,page:256,block:i};if(2097152===t)return{start:2097152,end:8364032,size:6266880,page:256,block:i}}if(s>=4){if(1048576===t)return{start:1048576,end:4169728,size:3121152,page:256,block:i};if(2097152===t)return{start:2097152,end:4169728,size:2072576,page:256,block:i};if(3145728===t)return{start:3145728,end:4169728,size:1024e3,page:256,block:i}}if(s>=2){if(1048576===t)return{start:1048576,end:2072576,size:1024e3,page:256,block:i};if(1572864===t)return{start:1572864,end:2072576,size:499712,page:256,block:i};if(1835008===t)return{start:1835008,end:2076672,size:241664,page:256,block:i};if(1966080===t)return{start:1966080,end:2076672,size:110592,page:256,block:i};if(2031616===t)return{start:2031616,end:2076672,size:45056,page:256,block:i}}if(s>=1){if(503808===t)return{start:503808,end:1028096,size:524288,page:256,block:i};if(765952===t)return{start:765952,end:1028096,size:262144,page:256,block:i};if(831488===t)return{start:831488,end:1028096,size:196608,page:256,block:i};if(864256===t)return{start:864256,end:1028096,size:163840,page:256,block:i};if(880640===t)return{start:880640,end:1028096,size:147456,page:256,block:i};if(897024===t)return{start:897024,end:1028096,size:131072,page:256,block:i};if(962560===t)return{start:962560,end:1028096,size:65536,page:256,block:i}}if(s>=.5){if(372736===t)return{start:372736,end:503808,size:131072,page:256,block:i};if(438272===t)return{start:438272,end:503808,size:65536,page:256,block:i};if(471040===t)return{start:471040,end:503808,size:32768,page:256,block:i}}return{start:t,end:e,size:e-t,page:256,block:i}}function Zi(t){return t>=16?[{start:1048576,end:16752640,size:15704064,page:256,block:8192},{start:2097152,end:16752640,size:14655488,page:256,block:8192}]:t>=8?[{start:1048576,end:8364032,size:7315456,page:256,block:8192},{start:2097152,end:8364032,size:6266880,page:256,block:8192}]:t>=4?[{start:2097152,end:4169728,size:2072576,page:256,block:8192},{start:1048576,end:4169728,size:3121152,page:256,block:8192},{start:3145728,end:4169728,size:1024e3,page:256,block:8192}]:t>=2?[{start:1048576,end:2072576,size:1024e3,page:256,block:8192},{start:1572864,end:2072576,size:499712,page:256,block:8192},{start:1835008,end:2076672,size:241664,page:256,block:8192},{start:1966080,end:2076672,size:110592,page:256,block:8192},{start:2031616,end:2076672,size:45056,page:256,block:8192}]:t>=1?[{start:897024,end:1028096,size:131072,page:256,block:8192},{start:503808,end:1028096,size:524288,page:256,block:8192},{start:765952,end:1028096,size:262144,page:256,block:8192},{start:831488,end:1028096,size:196608,page:256,block:8192},{start:864256,end:1028096,size:163840,page:256,block:8192},{start:880640,end:1028096,size:147456,page:256,block:8192},{start:962560,end:1028096,size:65536,page:256,block:8192}]:t>=.5?[{start:372736,end:503808,size:131072,page:256,block:8192},{start:438272,end:503808,size:65536,page:256,block:8192},{start:471040,end:503808,size:32768,page:256,block:8192}]:[]}var Xi;function Ki(t){return 1!==t.type?Xi.UNKNOWN:129===t.subtype?Xi.FATFS:Xi.UNKNOWN}function qi(t,e){if(t.length<512)return Xi.UNKNOWN;const i=(null==e?void 0:e.toUpperCase().includes("ESP8266"))?Wi:zi;for(const e of i)for(let i=0;i<2;i++){const s=i*e;if(s+20>t.length)continue;const a=s+8;if(a+8<=t.length){if("littlefs"===String.fromCharCode(t[a],t[a+1],t[a+2],t[a+3],t[a+4],t[a+5],t[a+6],t[a+7])){const e=s+16,i=t[e]|t[e+1]<<8|t[e+2]<<16|t[e+3]<<24;if(0!==i&&i>>>0!=4294967295)return Xi.LITTLEFS}}}const s=[0,4096];for(const e of s){if(t.length=e+62?String.fromCharCode(t[e+54],t[e+55],t[e+56],t[e+57],t[e+58]):"",s=t.length>=e+90?String.fromCharCode(t[e+82],t[e+83],t[e+84],t[e+85],t[e+86]):"";if(i.startsWith("FAT")||s.startsWith("FAT"))return Xi.FATFS}}if(t.length>=4){if(538182953===(t[0]|t[1]<<8|t[2]<<16|t[3]<<24))return Xi.SPIFFS}return Ji(t)?Xi.SPIFFS:Xi.UNKNOWN}function Yi(t,e){const i=null==e?void 0:e.toUpperCase().includes("ESP8266");switch(t){case Xi.FATFS:return 4096;case Xi.LITTLEFS:default:return i?$i:4096}}function ts(t,e){const i=null==e?void 0:e.toUpperCase().includes("ESP8266");switch(t){case Xi.FATFS:return Ni;case Xi.LITTLEFS:return i?Wi:zi;default:return i?Wi:[4096,2048,1024,512]}}!function(t){t.UNKNOWN="unknown",t.LITTLEFS="littlefs",t.FATFS="fatfs",t.SPIFFS="spiffs"}(Xi||(Xi={}));const es={0:"app",1:"data"},is={0:"factory",16:"ota_0",17:"ota_1",18:"ota_2",19:"ota_3",20:"ota_4",21:"ota_5",22:"ota_6",23:"ota_7",24:"ota_8",25:"ota_9",26:"ota_10",27:"ota_11",28:"ota_12",29:"ota_13",30:"ota_14",31:"ota_15",32:"test"},ss={0:"ota",1:"phy",2:"nvs",3:"coredump",4:"nvs_keys",5:"efuse",128:"esphttpd",129:"fat",130:"spiffs",131:"littlefs"};function as(t){if(t.length<32)return null;if(20650!==(65535&(t[0]|t[1]<<8)))return null;const e=t[2],i=t[3],s=t[4]|t[5]<<8|t[6]<<16|t[7]<<24,a=t[8]|t[9]<<8|t[10]<<16|t[11]<<24;let r="";for(let e=12;e<28&&0!==t[e];e++)r+=String.fromCharCode(t[e]);const n=t[28]|t[29]<<8|t[30]<<16|t[31]<<24,o=es[e]||`unknown(0x${e.toString(16)})`;let h="";return h=0===e?is[i]||`unknown(0x${i.toString(16)})`:1===e?ss[i]||`unknown(0x${i.toString(16)})`:`0x${i.toString(16)}`,{name:r,type:e,subtype:i,offset:s,size:a,flags:n,typeName:o,subtypeName:h}}function rs(t){const e=[];for(let i=0;i=2)for(let s=0;sthis.buildConfig.objNameLen)throw new Error(`object name '${t}' too long`);const i=t;let s=0;try{this.blocks[this.blocks.length-1].beginObj(this.curObjId,e.length,i)}catch{this.createBlock().beginObj(this.curObjId,e.length,i)}for(;s0;){const s=new fs(e,this.buildConfig);t.push(s.toBinary(this.blocksLim)),i--,e++}else{const e=this.imgSize-t.length*this.buildConfig.blockSize;if(e>0){const i=new Uint8Array(e);i.fill(255),t.push(i)}}const s=t.reduce((t,e)=>t+e.length,0),a=new Uint8Array(s);let r=0;for(const e of t)a.set(e,r),r+=e.length;return a}listFiles(){throw new Error("listFiles requires fromBinary to be called first")}readFile(){throw new Error("readFile requires fromBinary to be called first")}deleteFile(){throw new Error("deleteFile not yet implemented - requires filesystem recreation")}}class ps{constructor(t,e){this.imageData=t,this.buildConfig=e,this.filesMap=new Map}unpack(t,e,i=0){const s=new DataView(e.buffer,e.byteOffset+i),a=[];let r=0;for(const e of t)switch(e){case"B":a.push(s.getUint8(r)),r+=1;break;case"H":a.push("little"===this.buildConfig.endianness?s.getUint16(r,!0):s.getUint16(r,!1)),r+=2;break;case"I":a.push("little"===this.buildConfig.endianness?s.getUint32(r,!0):s.getUint32(r,!1)),r+=4}return a}parse(){const t=Math.floor(this.imageData.length/this.buildConfig.blockSize);for(let e=0;es.length);t+=this.buildConfig.objIdLen){const e=s.slice(t,t+this.buildConfig.objIdLen),[i]=this.unpack(1===this.buildConfig.objIdLen?"B":2===this.buildConfig.objIdLen?"H":"I",e);if(i===(1<<8*this.buildConfig.objIdLen)-1)continue;const a=!!(i&1<<8*this.buildConfig.objIdLen-1),r=i&~(1<<8*this.buildConfig.objIdLen-1);a&&!this.filesMap.has(r)&&this.filesMap.set(r,{name:null,size:0,dataPages:[]})}}for(let e=this.buildConfig.OBJ_LU_PAGES_PER_BLOCK;et[0]-e[0]);const i=[];let s=0;for(const[,t]of e.dataPages){const a=e.size-s;if(a<=0)break;const r=Math.min(t.length,a);i.push(t.slice(0,r)),s+=r}const a=new Uint8Array(s);let r=0;for(const t of i)a.set(t,r),r+=t.length;t.push({name:e.name,size:e.size,data:a})}return t}readFile(t){const e=this.listFiles().find(e=>e.name===t||e.name==="/"+t);return e?e.data:null}}const bs={pageSize:256,blockSize:4096,objNameLen:32,metaLen:4,useMagic:!0,useMagicLen:!0,alignedObjIxTables:!1},ws=async t=>{let e;const i=globalThis.requestSerialPort;if("function"==typeof i)e=await i();else{if(!navigator.serial)throw new Error("Web Serial API is not supported in this browser. Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. Note: The page must be served over HTTPS or localhost.");e=await navigator.serial.requestPort()}return e.readable&&e.writable||await e.open({baudRate:h}),new Fi(e,t)},ms=async(t,e)=>{if(!t)throw new Error("Port is required");return t.readable&&t.writable||await t.open({baudRate:h}),new Fi(t,e)};export{ct as CHIP_ERASE_TIMEOUT,v as CHIP_FAMILY_ESP32,k as CHIP_FAMILY_ESP32C2,x as CHIP_FAMILY_ESP32C3,M as CHIP_FAMILY_ESP32C5,U as CHIP_FAMILY_ESP32C6,D as CHIP_FAMILY_ESP32C61,O as CHIP_FAMILY_ESP32H2,F as CHIP_FAMILY_ESP32H21,A as CHIP_FAMILY_ESP32H4,T as CHIP_FAMILY_ESP32P4,C as CHIP_FAMILY_ESP32S2,E as CHIP_FAMILY_ESP32S3,L as CHIP_FAMILY_ESP32S31,R as CHIP_FAMILY_ESP8266,bs as DEFAULT_SPIFFS_CONFIG,dt as DEFAULT_TIMEOUT,ft as ERASE_REGION_TIMEOUT_PER_MB,$i as ESP8266_LITTLEFS_BLOCK_SIZE,Wi as ESP8266_LITTLEFS_BLOCK_SIZE_CANDIDATES,ji as ESP8266_LITTLEFS_PAGE_SIZE,Hi as ESP8266_SPIFFS_BLOCK_SIZE,Gi as ESP8266_SPIFFS_PAGE_SIZE,Fi as ESPLoader,tt as ESP_CHANGE_BAUDRATE,st as ESP_CHECKSUM_MAGIC,Z as ESP_ERASE_FLASH,X as ESP_ERASE_REGION,N as ESP_FLASH_BEGIN,$ as ESP_FLASH_DATA,at as ESP_FLASH_DEFL_BEGIN,rt as ESP_FLASH_DEFL_DATA,nt as ESP_FLASH_DEFL_END,W as ESP_FLASH_END,it as ESP_GET_SECURITY_INFO,j as ESP_MEM_BEGIN,H as ESP_MEM_DATA,G as ESP_MEM_END,lt as ESP_RAM_BLOCK,K as ESP_READ_FLASH,V as ESP_READ_REG,Y as ESP_SPI_ATTACH,et as ESP_SPI_FLASH_MD5,q as ESP_SPI_SET_PARAMS,J as ESP_SYNC,Q as ESP_WRITE_REG,Ni as FATFS_BLOCK_SIZE_CANDIDATES,Pi as FATFS_DEFAULT_BLOCK_SIZE,pt as FLASH_READ_TIMEOUT,Xi as FilesystemType,zi as LITTLEFS_BLOCK_SIZE_CANDIDATES,Li as LITTLEFS_DEFAULT_BLOCK_SIZE,ut as MAX_TIMEOUT,_t as MEM_END_ROM_TIMEOUT,ot as ROM_INVALID_RECV_MSG,gt as SYNC_TIMEOUT,os as SpiffsBuildConfig,_s as SpiffsFS,ps as SpiffsReader,ht as USB_RAM_BLOCK,ws as connect,ms as connectWithPort,qi as detectFilesystemFromImage,Ki as detectFilesystemType,a as formatMacAddr,ns as formatSize,ts as getBlockSizeCandidates,Yi as getDefaultBlockSize,Zi as getESP8266FilesystemLayout,i as hexFormatter,rs as parsePartitionTable,Qi as scanESP8266Filesystem,r as sleep,s as toHex}; +/** + * @name slipEncode + * Take an array buffer and return back a new array where + * 0xdb is replaced with 0xdb 0xdd and 0xc0 is replaced with 0xdb 0xdc + */ +const slipEncode = (buffer) => { + let encoded = [0xc0]; + for (const byte of buffer) { + if (byte == 0xdb) { + encoded = encoded.concat([0xdb, 0xdd]); + } + else if (byte == 0xc0) { + encoded = encoded.concat([0xdb, 0xdc]); + } + else { + encoded.push(byte); + } + } + encoded.push(0xc0); + return encoded; +}; +/** + * @name toByteArray + * Convert a string to a byte array + */ +const toByteArray = (str) => { + const byteArray = []; + for (let i = 0; i < str.length; i++) { + const charcode = str.charCodeAt(i); + if (charcode <= 0xff) { + byteArray.push(charcode); + } + } + return byteArray; +}; +const hexFormatter = (bytes) => "[" + bytes.map((value) => toHex(value)).join(", ") + "]"; +const toHex = (value, size = 2) => { + const hex = value.toString(16).toUpperCase(); + if (hex.startsWith("-")) { + return "-0x" + hex.substring(1).padStart(size, "0"); + } + else { + return "0x" + hex.padStart(size, "0"); + } +}; +/** + * Format MAC address array to string (e.g., [0xAA, 0xBB, 0xCC] -> "AA:BB:CC:DD:EE:FF") + */ +const formatMacAddr = (macAddr) => { + return macAddr + .map((value) => value.toString(16).toUpperCase().padStart(2, "0")) + .join(":"); +}; +/** + * @name padTo + * Pad data to the next alignment boundary with the given fill byte (default 0xFF) + */ +function padTo(data, alignment, padCharacter = 0xff) { + const padMod = data.length % alignment; + if (padMod !== 0) { + const padding = new Uint8Array(alignment - padMod).fill(padCharacter); + const paddedData = new Uint8Array(data.length + padding.length); + paddedData.set(data); + paddedData.set(padding, data.length); + return paddedData; + } + return data; +} +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +const DETECTED_FLASH_SIZES = { + 0x12: "256KB", + 0x13: "512KB", + 0x14: "1MB", + 0x15: "2MB", + 0x16: "4MB", + 0x17: "8MB", + 0x18: "16MB", + 0x19: "32MB", + 0x1a: "64MB", + 0x1b: "128MB", + 0x1c: "256MB", + 0x20: "64MB", + 0x21: "128MB", + 0x22: "256MB", + 0x32: "256KB", + 0x33: "512KB", + 0x34: "1MB", + 0x35: "2MB", + 0x36: "4MB", + 0x37: "8MB", + 0x38: "16MB", + 0x39: "32MB", + 0x3a: "64MB", +}; +const FLASH_WRITE_SIZE = 0x400; +const STUB_FLASH_WRITE_SIZE = 0x4000; +const FLASH_SECTOR_SIZE = 0x1000; // Flash sector size, minimum unit of erase. +const ESP_ROM_BAUD = 115200; +const USB_JTAG_SERIAL_PID = 0x1001; +const ESP8266_SPI_REG_BASE = 0x60000200; +const ESP8266_BASEFUSEADDR = 0x3ff00050; +const ESP8266_MACFUSEADDR = 0x3ff00050; +const ESP8266_SPI_USR_OFFS = 0x1c; +const ESP8266_SPI_USR1_OFFS = 0x20; +const ESP8266_SPI_USR2_OFFS = 0x24; +const ESP8266_SPI_MOSI_DLEN_OFFS = -1; +const ESP8266_SPI_MISO_DLEN_OFFS = -1; +const ESP8266_SPI_W0_OFFS = 0x40; +const ESP8266_UART_DATE_REG_ADDR = 0x60000078; +const ESP8266_BOOTLOADER_FLASH_OFFSET = 0x0000; +const ESP32_SPI_REG_BASE = 0x3ff42000; +const ESP32_BASEFUSEADDR = 0x3ff5a000; +const ESP32_MACFUSEADDR = 0x3ff5a000; +const ESP32_SPI_USR_OFFS = 0x1c; +const ESP32_SPI_USR1_OFFS = 0x20; +const ESP32_SPI_USR2_OFFS = 0x24; +const ESP32_SPI_MOSI_DLEN_OFFS = 0x28; +const ESP32_SPI_MISO_DLEN_OFFS = 0x2c; +const ESP32_SPI_W0_OFFS = 0x80; +const ESP32_UART_DATE_REG_ADDR = 0x60000078; +const ESP32_BOOTLOADER_FLASH_OFFSET = 0x1000; +const ESP32_APB_CTL_DATE_ADDR = 0x3ff66000 + 0x7c; +const ESP32S2_SPI_REG_BASE = 0x3f402000; +const ESP32S2_BASEFUSEADDR = 0x3f41a000; +const ESP32S2_EFUSE_BLOCK1_ADDR = ESP32S2_BASEFUSEADDR + 0x044; +const ESP32S2_MACFUSEADDR = 0x3f41a044; +const ESP32S2_SPI_USR_OFFS = 0x18; +const ESP32S2_SPI_USR1_OFFS = 0x1c; +const ESP32S2_SPI_USR2_OFFS = 0x20; +const ESP32S2_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32S2_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32S2_SPI_W0_OFFS = 0x58; +const ESP32S2_UART_DATE_REG_ADDR = 0x60000078; +const ESP32S2_BOOTLOADER_FLASH_OFFSET = 0x1000; +// ESP32-S2 RTC Watchdog Timer registers for USB-OTG reset +const ESP32S2_RTCCNTL_BASE_REG = 0x3f408000; +const ESP32S2_RTC_CNTL_WDTWPROTECT_REG = ESP32S2_RTCCNTL_BASE_REG + 0x00ac; +const ESP32S2_RTC_CNTL_WDTCONFIG0_REG = ESP32S2_RTCCNTL_BASE_REG + 0x0094; +const ESP32S2_RTC_CNTL_WDTCONFIG1_REG = ESP32S2_RTCCNTL_BASE_REG + 0x0098; +const ESP32S2_RTC_CNTL_WDT_WKEY = 0x50d83aa1; +const ESP32S2_RTC_CNTL_OPTION1_REG = 0x3f408128; +const ESP32S2_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 0x1; // Is download mode forced over USB? +const ESP32S2_UARTDEV_BUF_NO = 0x3ffffd14; // Variable in ROM .bss which indicates the port in use +const ESP32S2_UARTDEV_BUF_NO_USB_OTG = 2; // Value of the above indicating that USB-OTG is in use +const ESP32S3_SPI_REG_BASE = 0x60002000; +const ESP32S3_BASEFUSEADDR = 0x60007000; +const ESP32S3_EFUSE_BLOCK1_ADDR = ESP32S3_BASEFUSEADDR + 0x044; +const ESP32S3_MACFUSEADDR = 0x60007000 + 0x044; +const ESP32S3_SPI_USR_OFFS = 0x18; +const ESP32S3_SPI_USR1_OFFS = 0x1c; +const ESP32S3_SPI_USR2_OFFS = 0x20; +const ESP32S3_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32S3_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32S3_SPI_W0_OFFS = 0x58; +const ESP32S3_UART_DATE_REG_ADDR = 0x60000080; +const ESP32S3_BOOTLOADER_FLASH_OFFSET = 0x0000; +// ESP32-S3 RTC Watchdog Timer registers for USB-OTG reset +const ESP32S3_RTCCNTL_BASE_REG = 0x60008000; +const ESP32S3_RTC_CNTL_WDTWPROTECT_REG = ESP32S3_RTCCNTL_BASE_REG + 0x00b0; +const ESP32S3_RTC_CNTL_WDTCONFIG0_REG = ESP32S3_RTCCNTL_BASE_REG + 0x0098; +const ESP32S3_RTC_CNTL_WDTCONFIG1_REG = ESP32S3_RTCCNTL_BASE_REG + 0x009c; +const ESP32S3_RTC_CNTL_WDT_WKEY = 0x50d83aa1; +const ESP32S3_RTC_CNTL_OPTION1_REG = 0x6000812c; +const ESP32S3_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 0x1; // Is download mode forced over USB? +const ESP32S3_UARTDEV_BUF_NO = 0x3fcef14c; // Variable in ROM .bss which indicates the port in use +const ESP32S3_UARTDEV_BUF_NO_USB_OTG = 3; // The above var when USB-OTG is used +const ESP32S3_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 4; // The above var when USB-JTAG/Serial is used +const ESP32C2_SPI_REG_BASE = 0x60002000; +const ESP32C2_BASEFUSEADDR = 0x60008800; +const ESP32C2_EFUSE_BLOCK2_ADDR = ESP32C2_BASEFUSEADDR + 0x040; +const ESP32C2_MACFUSEADDR = ESP32C2_BASEFUSEADDR + 0x040; +const ESP32C2_SPI_USR_OFFS = 0x18; +const ESP32C2_SPI_USR1_OFFS = 0x1c; +const ESP32C2_SPI_USR2_OFFS = 0x20; +const ESP32C2_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32C2_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32C2_SPI_W0_OFFS = 0x58; +const ESP32C2_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32C2_BOOTLOADER_FLASH_OFFSET = 0x0000; +const ESP32C3_SPI_REG_BASE = 0x60002000; +const ESP32C3_BASEFUSEADDR = 0x60008800; +const ESP32C3_MACFUSEADDR = 0x60008800 + 0x044; +const ESP32C3_SPI_USR_OFFS = 0x18; +const ESP32C3_SPI_USR1_OFFS = 0x1c; +const ESP32C3_SPI_USR2_OFFS = 0x20; +const ESP32C3_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32C3_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32C3_SPI_W0_OFFS = 0x58; +const ESP32C3_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32C3_BOOTLOADER_FLASH_OFFSET = 0x0000; +// ESP32-C3 RTC Watchdog Timer registers +const ESP32C3_RTC_CNTL_BASE_REG = 0x60008000; +const ESP32C3_RTC_CNTL_WDTWPROTECT_REG = ESP32C3_RTC_CNTL_BASE_REG + 0x00a8; +const ESP32C3_RTC_CNTL_WDTCONFIG0_REG = ESP32C3_RTC_CNTL_BASE_REG + 0x0090; +const ESP32C3_RTC_CNTL_WDTCONFIG1_REG = ESP32C3_RTC_CNTL_BASE_REG + 0x0094; +const ESP32C3_RTC_CNTL_WDT_WKEY = 0x50d83aa1; +const ESP32C3_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used +const ESP32C3_BUF_UART_NO_OFFSET = 24; +// Note: ESP32C3_BSS_UART_DEV_ADDR is calculated dynamically based on chip revision in esp_loader.ts +// Revision < 101: 0x3FCDF064, Revision >= 101: 0x3FCDF060 +// ESP32-C3 EFUSE registers for chip revision detection +const ESP32C3_EFUSE_RD_MAC_SPI_SYS_3_REG = 0x60008850; +const ESP32C3_EFUSE_RD_MAC_SPI_SYS_5_REG = 0x60008858; +const ESP32C5_SPI_REG_BASE = 0x60003000; +const ESP32C5_BASEFUSEADDR = 0x600b4800; +const ESP32C5_EFUSE_BLOCK1_ADDR = ESP32C5_BASEFUSEADDR + 0x044; +const ESP32C5_MACFUSEADDR = 0x600b4800 + 0x044; +const ESP32C5_SPI_USR_OFFS = 0x18; +const ESP32C5_SPI_USR1_OFFS = 0x1c; +const ESP32C5_SPI_USR2_OFFS = 0x20; +const ESP32C5_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32C5_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32C5_SPI_W0_OFFS = 0x58; +const ESP32C5_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32C5_UART_CLKDIV_REG = 0x60000014; +const ESP32C5_BOOTLOADER_FLASH_OFFSET = 0x2000; +// ESP32-C5 Crystal frequency detection registers +const ESP32C5_PCR_SYSCLK_CONF_REG = 0x60096110; +const ESP32C5_PCR_SYSCLK_XTAL_FREQ_V = 0x7f << 24; +const ESP32C5_PCR_SYSCLK_XTAL_FREQ_S = 24; +// ESP32-C5 USB-JTAG/Serial detection +const ESP32C5_UARTDEV_BUF_NO = 0x4085f514; // Variable in ROM .bss which indicates the port in use +const ESP32C5_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used +const ESP32C6_SPI_REG_BASE = 0x60003000; +const ESP32C6_BASEFUSEADDR = 0x600b0800; +const ESP32C6_EFUSE_BLOCK1_ADDR = ESP32C6_BASEFUSEADDR + 0x044; +const ESP32C6_MACFUSEADDR = 0x600b0800 + 0x044; +const ESP32C6_SPI_USR_OFFS = 0x18; +const ESP32C6_SPI_USR1_OFFS = 0x1c; +const ESP32C6_SPI_USR2_OFFS = 0x20; +const ESP32C6_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32C6_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32C6_SPI_W0_OFFS = 0x58; +const ESP32C6_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32C6_BOOTLOADER_FLASH_OFFSET = 0x0000; +// ESP32-C6 USB-JTAG/Serial detection +const ESP32C6_UARTDEV_BUF_NO = 0x4087f580; // Variable in ROM .bss which indicates the port in use +const ESP32C6_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used +// ESP32-C5/C6 LP Watchdog Timer registers (Low Power WDT) +const ESP32C5_C6_DR_REG_LP_WDT_BASE = 0x600b1c00; +const ESP32C5_C6_RTC_CNTL_WDTCONFIG0_REG = ESP32C5_C6_DR_REG_LP_WDT_BASE + 0x0000; // LP_WDT_RWDT_CONFIG0_REG +const ESP32C5_C6_RTC_CNTL_WDTCONFIG1_REG = ESP32C5_C6_DR_REG_LP_WDT_BASE + 0x0004; // LP_WDT_RWDT_CONFIG1_REG +const ESP32C5_C6_RTC_CNTL_WDTWPROTECT_REG = ESP32C5_C6_DR_REG_LP_WDT_BASE + 0x0018; // LP_WDT_RWDT_WPROTECT_REG +const ESP32C5_C6_RTC_CNTL_WDT_WKEY = 0x50d83aa1; // LP_WDT_SWD_WKEY +const ESP32C61_SPI_REG_BASE = 0x60003000; +const ESP32C61_BASEFUSEADDR = 0x600b4800; +const ESP32C61_EFUSE_BLOCK1_ADDR = ESP32C61_BASEFUSEADDR + 0x044; +const ESP32C61_MACFUSEADDR = 0x600b4800 + 0x044; +const ESP32C61_SPI_USR_OFFS = 0x18; +const ESP32C61_SPI_USR1_OFFS = 0x1c; +const ESP32C61_SPI_USR2_OFFS = 0x20; +const ESP32C61_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32C61_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32C61_SPI_W0_OFFS = 0x58; +const ESP32C61_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32C61_BOOTLOADER_FLASH_OFFSET = 0x0000; +// ESP32-C61 USB-JTAG/Serial detection (dynamic based on chip revision) +const ESP32C61_UARTDEV_BUF_NO_REV_LE2 = 0x4084f5ec; // revision <= 2 +const ESP32C61_UARTDEV_BUF_NO_REV_GT2 = 0x4084f5e4; // revision > 2 +const ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_LE2 = 3; // revision <= 2 +const ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_GT2 = 4; // revision > 2 +const ESP32H2_SPI_REG_BASE = 0x60003000; +const ESP32H2_BASEFUSEADDR = 0x600b0800; +const ESP32H2_EFUSE_BLOCK1_ADDR = ESP32H2_BASEFUSEADDR + 0x044; +const ESP32H2_MACFUSEADDR = 0x600b0800 + 0x044; +const ESP32H2_SPI_USR_OFFS = 0x18; +const ESP32H2_SPI_USR1_OFFS = 0x1c; +const ESP32H2_SPI_USR2_OFFS = 0x20; +const ESP32H2_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32H2_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32H2_SPI_W0_OFFS = 0x58; +const ESP32H2_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32H2_BOOTLOADER_FLASH_OFFSET = 0x0000; +// ESP32-H2 USB-JTAG/Serial detection +const ESP32H2_UARTDEV_BUF_NO = 0x4084fefc; // Variable in ROM .bss which indicates the port in use +const ESP32H2_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used +const ESP32H4_SPI_REG_BASE = 0x60099000; +const ESP32H4_BASEFUSEADDR = 0x600b1800; +const ESP32H4_EFUSE_BLOCK1_ADDR = ESP32H4_BASEFUSEADDR + 0x044; +const ESP32H4_MACFUSEADDR = 0x600b1800 + 0x044; +const ESP32H4_SPI_USR_OFFS = 0x18; +const ESP32H4_SPI_USR1_OFFS = 0x1c; +const ESP32H4_SPI_USR2_OFFS = 0x20; +const ESP32H4_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32H4_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32H4_SPI_W0_OFFS = 0x58; +const ESP32H4_UART_DATE_REG_ADDR = 0x60012000 + 0x7c; +const ESP32H4_BOOTLOADER_FLASH_OFFSET = 0x2000; +// ESP32-H4 USB-JTAG/Serial detection +const ESP32H4_UARTDEV_BUF_NO = 0x4087f580; // Variable in ROM .bss which indicates the port in use +const ESP32H4_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used +const ESP32H21_SPI_REG_BASE = 0x60003000; +const ESP32H21_BASEFUSEADDR = 0x600b4000; +const ESP32H21_MACFUSEADDR = 0x600b4000 + 0x044; +const ESP32H21_SPI_USR_OFFS = 0x18; +const ESP32H21_SPI_USR1_OFFS = 0x1c; +const ESP32H21_SPI_USR2_OFFS = 0x20; +const ESP32H21_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32H21_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32H21_SPI_W0_OFFS = 0x58; +const ESP32H21_UART_DATE_REG_ADDR = 0x6000007c; +const ESP32H21_BOOTLOADER_FLASH_OFFSET = 0x0000; +const ESP32P4_SPI_REG_BASE = 0x5008d000; +const ESP32P4_BASEFUSEADDR = 0x5012d000; +const ESP32P4_EFUSE_BLOCK1_ADDR = ESP32P4_BASEFUSEADDR + 0x044; +const ESP32P4_MACFUSEADDR = 0x5012d000 + 0x044; +const ESP32P4_SPI_USR_OFFS = 0x18; +const ESP32P4_SPI_USR1_OFFS = 0x1c; +const ESP32P4_SPI_USR2_OFFS = 0x20; +const ESP32P4_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32P4_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32P4_SPI_W0_OFFS = 0x58; +const ESP32P4_UART_DATE_REG_ADDR = 0x500ca000 + 0x8c; +const ESP32P4_BOOTLOADER_FLASH_OFFSET = 0x2000; +// ESP32-P4 RTC Watchdog Timer registers +const ESP32P4_DR_REG_LP_WDT_BASE = 0x50116000; +const ESP32P4_RTC_CNTL_WDTWPROTECT_REG = ESP32P4_DR_REG_LP_WDT_BASE + 0x0018; // LP_WDT_WPROTECT_REG +const ESP32P4_RTC_CNTL_WDTCONFIG0_REG = ESP32P4_DR_REG_LP_WDT_BASE + 0x0000; // LP_WDT_CONFIG0_REG +const ESP32P4_RTC_CNTL_WDTCONFIG1_REG = ESP32P4_DR_REG_LP_WDT_BASE + 0x0004; // LP_WDT_CONFIG1_REG +const ESP32P4_RTC_CNTL_WDT_WKEY = 0x50d83aa1; +// ESP32-P4 USB-JTAG/Serial and USB-OTG detection +// Note: UARTDEV_BUF_NO is dynamic based on chip revision +// Revision < 300: 0x4FF3FEB0 + 24 = 0x4FF3FEC8 +// Revision >= 300: 0x4FFBFEB0 + 24 = 0x4FFBFEC8 +const ESP32P4_UARTDEV_BUF_NO_REV0 = 0x4ff3fec8; // Variable in ROM .bss (revision < 300) +const ESP32P4_UARTDEV_BUF_NO_REV300 = 0x4ffbfec8; // Variable in ROM .bss (revision >= 300) +const ESP32P4_UARTDEV_BUF_NO_USB_OTG = 5; // The above var when USB-OTG is used +const ESP32P4_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 6; // The above var when USB-JTAG/Serial is used +const ESP32P4_RTC_CNTL_OPTION1_REG = 0x50110008; +const ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 0x4; // Is download mode forced over USB? +const ESP32P4_EFUSE_RD_REPEAT_DATA1_REG = ESP32P4_BASEFUSEADDR + 0x034; +const ESP32P4_EFUSE_DOWNLOAD_MODE_XPD_ON_MASK = 0x1 << 16; +// Flash power-on related registers and bits needed for ECO6 (Rev 301) +const ESP32P4_DR_REG_LPAON_BASE = 0x50110000; +const ESP32P4_DR_REG_PMU_BASE = ESP32P4_DR_REG_LPAON_BASE + 0x5000; +const ESP32P4_DR_REG_LP_SYS_BASE = ESP32P4_DR_REG_LPAON_BASE + 0x0; +const ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG = ESP32P4_DR_REG_LP_SYS_BASE + 0x10c; +const ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG = ESP32P4_DR_REG_PMU_BASE + 0x1bc; +const ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0 = 1 << 27; +const ESP32P4_PMU_EXT_LDO_P0_0P1A_REG = ESP32P4_DR_REG_PMU_BASE + 0x1b8; +const ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0 = 1 << 7; +const ESP32P4_PMU_DATE_REG = ESP32P4_DR_REG_PMU_BASE + 0x3fc; +const ESP32S31_SPI_REG_BASE = 0x20501000; +const ESP32S31_BASEFUSEADDR = 0x20715000; +const ESP32S31_EFUSE_BLOCK1_ADDR = ESP32S31_BASEFUSEADDR + 0x050; +const ESP32S31_MACFUSEADDR = ESP32S31_BASEFUSEADDR + 0x050; +const ESP32S31_SPI_USR_OFFS = 0x18; +const ESP32S31_SPI_USR1_OFFS = 0x1c; +const ESP32S31_SPI_USR2_OFFS = 0x20; +const ESP32S31_SPI_MOSI_DLEN_OFFS = 0x24; +const ESP32S31_SPI_MISO_DLEN_OFFS = 0x28; +const ESP32S31_SPI_W0_OFFS = 0x58; +const ESP32S31_UART_DATE_REG_ADDR = 0x2038a000 + 0x8c; +const ESP32S31_BOOTLOADER_FLASH_OFFSET = 0x2000; +// ESP32-S31 RTC Watchdog Timer registers (LP_WDT) +const ESP32S31_DR_REG_LP_WDT_BASE = 0x20801000; +const ESP32S31_RTC_CNTL_WDTCONFIG0_REG = ESP32S31_DR_REG_LP_WDT_BASE + 0x0000; // LP_WDT_RWDT_CONFIG0_REG +const ESP32S31_RTC_CNTL_WDTCONFIG1_REG = ESP32S31_DR_REG_LP_WDT_BASE + 0x0004; // LP_WDT_RWDT_CONFIG1_REG +const ESP32S31_RTC_CNTL_WDTWPROTECT_REG = ESP32S31_DR_REG_LP_WDT_BASE + 0x0018; // LP_WDT_RWDT_WPROTECT_REG +const ESP32S31_RTC_CNTL_WDT_WKEY = 0x50d83aa1; +const SYNC_PACKET = toByteArray("\x07\x07\x12 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU"); +const CHIP_DETECT_MAGIC_REG_ADDR = 0x40001000; +// Image Chip IDs (used by ESP32-C3 and later for chip detection) +// These values for the families are made up; nothing that esptool uses. +const CHIP_FAMILY_ESP8266 = 0x8266; +const CHIP_FAMILY_ESP32 = 0x32; +const CHIP_FAMILY_ESP32S2 = 0x3252; +const CHIP_FAMILY_ESP32S3 = 0x3253; +const CHIP_FAMILY_ESP32C2 = 0x32c2; +const CHIP_FAMILY_ESP32C3 = 0x32c3; +const CHIP_FAMILY_ESP32C5 = 0x32c5; +const CHIP_FAMILY_ESP32C6 = 0x32c6; +const CHIP_FAMILY_ESP32C61 = 0x32c61; +const CHIP_FAMILY_ESP32H2 = 0x3272; +const CHIP_FAMILY_ESP32H4 = 0x3274; +const CHIP_FAMILY_ESP32H21 = 0x3275; +const CHIP_FAMILY_ESP32P4 = 0x3280; +const CHIP_FAMILY_ESP32S31 = 0x3231; +const CHIP_ID_TO_INFO = { + 5: { name: "ESP32-C3", family: CHIP_FAMILY_ESP32C3 }, + 9: { name: "ESP32-S3", family: CHIP_FAMILY_ESP32S3 }, + 12: { name: "ESP32-C2", family: CHIP_FAMILY_ESP32C2 }, + 13: { name: "ESP32-C6", family: CHIP_FAMILY_ESP32C6 }, + 16: { name: "ESP32-H2", family: CHIP_FAMILY_ESP32H2 }, + 18: { name: "ESP32-P4", family: CHIP_FAMILY_ESP32P4 }, + 20: { name: "ESP32-C61", family: CHIP_FAMILY_ESP32C61 }, + 23: { name: "ESP32-C5", family: CHIP_FAMILY_ESP32C5 }, + 25: { name: "ESP32-H21", family: CHIP_FAMILY_ESP32H21 }, + 28: { name: "ESP32-H4", family: CHIP_FAMILY_ESP32H4 }, + 32: { name: "ESP32-S31", family: CHIP_FAMILY_ESP32S31 }, +}; +const CHIP_DETECT_MAGIC_VALUES = { + 0xfff0c101: { name: "ESP8266", family: CHIP_FAMILY_ESP8266 }, + 0x00f01d83: { name: "ESP32", family: CHIP_FAMILY_ESP32 }, + 0x000007c6: { name: "ESP32-S2", family: CHIP_FAMILY_ESP32S2 }, +}; +// Commands supported by ESP8266 ROM bootloader +const ESP_FLASH_BEGIN = 0x02; +const ESP_FLASH_DATA = 0x03; +const ESP_FLASH_END = 0x04; +const ESP_MEM_BEGIN = 0x05; +const ESP_MEM_END = 0x06; +const ESP_MEM_DATA = 0x07; +const ESP_SYNC = 0x08; +const ESP_WRITE_REG = 0x09; +const ESP_READ_REG = 0x0a; +const ESP_ERASE_FLASH = 0xd0; +const ESP_ERASE_REGION = 0xd1; +const ESP_READ_FLASH = 0xd2; +const ESP_SPI_SET_PARAMS = 0x0b; +const ESP_SPI_ATTACH = 0x0d; +const ESP_CHANGE_BAUDRATE = 0x0f; +const ESP_SPI_FLASH_MD5 = 0x13; +const ESP_GET_SECURITY_INFO = 0x14; +const ESP_CHECKSUM_MAGIC = 0xef; +const ESP_FLASH_DEFL_BEGIN = 0x10; +const ESP_FLASH_DEFL_DATA = 0x11; +const ESP_FLASH_DEFL_END = 0x12; +const ROM_INVALID_RECV_MSG = 0x05; +const USB_RAM_BLOCK = 0x800; +const ESP_RAM_BLOCK = 0x1800; +// Timeouts +const DEFAULT_TIMEOUT = 3000; +const CHIP_ERASE_TIMEOUT = 150000; // timeout for full chip erase in ms +const MAX_TIMEOUT = CHIP_ERASE_TIMEOUT * 2; // longest any command can run in ms +const SYNC_TIMEOUT = 100; // timeout for syncing with bootloader in ms +const ERASE_REGION_TIMEOUT_PER_MB = 30000; // timeout (per megabyte) for erasing a region in ms +const MEM_END_ROM_TIMEOUT = 500; +const FLASH_READ_TIMEOUT = 100; // timeout for reading flash in ms +/** + * @name timeoutPerMb + * Scales timeouts which are size-specific + */ +const timeoutPerMb = (secondsPerMb, sizeBytes) => { + const result = Math.floor(secondsPerMb * (sizeBytes / 0x1e6)); + if (result < DEFAULT_TIMEOUT) { + return DEFAULT_TIMEOUT; + } + return result; +}; +const getSpiFlashAddresses = (chipFamily) => { + switch (chipFamily) { + case CHIP_FAMILY_ESP32: + return { + regBase: ESP32_SPI_REG_BASE, + baseFuse: ESP32_BASEFUSEADDR, + macFuse: ESP32_MACFUSEADDR, + usrOffs: ESP32_SPI_USR_OFFS, + usr1Offs: ESP32_SPI_USR1_OFFS, + usr2Offs: ESP32_SPI_USR2_OFFS, + mosiDlenOffs: ESP32_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32_SPI_W0_OFFS, + uartDateReg: ESP32_UART_DATE_REG_ADDR, + flashOffs: ESP32_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32S2: + return { + regBase: ESP32S2_SPI_REG_BASE, + baseFuse: ESP32S2_BASEFUSEADDR, + macFuse: ESP32S2_MACFUSEADDR, + usrOffs: ESP32S2_SPI_USR_OFFS, + usr1Offs: ESP32S2_SPI_USR1_OFFS, + usr2Offs: ESP32S2_SPI_USR2_OFFS, + mosiDlenOffs: ESP32S2_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32S2_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32S2_SPI_W0_OFFS, + uartDateReg: ESP32S2_UART_DATE_REG_ADDR, + flashOffs: ESP32S2_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32S3: + return { + regBase: ESP32S3_SPI_REG_BASE, + usrOffs: ESP32S3_SPI_USR_OFFS, + baseFuse: ESP32S3_BASEFUSEADDR, + macFuse: ESP32S3_MACFUSEADDR, + usr1Offs: ESP32S3_SPI_USR1_OFFS, + usr2Offs: ESP32S3_SPI_USR2_OFFS, + mosiDlenOffs: ESP32S3_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32S3_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32S3_SPI_W0_OFFS, + uartDateReg: ESP32S3_UART_DATE_REG_ADDR, + flashOffs: ESP32S3_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP8266: + return { + regBase: ESP8266_SPI_REG_BASE, + usrOffs: ESP8266_SPI_USR_OFFS, + baseFuse: ESP8266_BASEFUSEADDR, + macFuse: ESP8266_MACFUSEADDR, + usr1Offs: ESP8266_SPI_USR1_OFFS, + usr2Offs: ESP8266_SPI_USR2_OFFS, + mosiDlenOffs: ESP8266_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP8266_SPI_MISO_DLEN_OFFS, + w0Offs: ESP8266_SPI_W0_OFFS, + uartDateReg: ESP8266_UART_DATE_REG_ADDR, + flashOffs: ESP8266_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32C2: + return { + regBase: ESP32C2_SPI_REG_BASE, + baseFuse: ESP32C2_BASEFUSEADDR, + macFuse: ESP32C2_MACFUSEADDR, + usrOffs: ESP32C2_SPI_USR_OFFS, + usr1Offs: ESP32C2_SPI_USR1_OFFS, + usr2Offs: ESP32C2_SPI_USR2_OFFS, + mosiDlenOffs: ESP32C2_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32C2_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32C2_SPI_W0_OFFS, + uartDateReg: ESP32C2_UART_DATE_REG_ADDR, + flashOffs: ESP32C2_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32C3: + return { + regBase: ESP32C3_SPI_REG_BASE, + baseFuse: ESP32C3_BASEFUSEADDR, + macFuse: ESP32C3_MACFUSEADDR, + usrOffs: ESP32C3_SPI_USR_OFFS, + usr1Offs: ESP32C3_SPI_USR1_OFFS, + usr2Offs: ESP32C3_SPI_USR2_OFFS, + mosiDlenOffs: ESP32C3_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32C3_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32C3_SPI_W0_OFFS, + uartDateReg: ESP32C3_UART_DATE_REG_ADDR, + flashOffs: ESP32C3_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32C5: + return { + regBase: ESP32C5_SPI_REG_BASE, + baseFuse: ESP32C5_BASEFUSEADDR, + macFuse: ESP32C5_MACFUSEADDR, + usrOffs: ESP32C5_SPI_USR_OFFS, + usr1Offs: ESP32C5_SPI_USR1_OFFS, + usr2Offs: ESP32C5_SPI_USR2_OFFS, + mosiDlenOffs: ESP32C5_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32C5_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32C5_SPI_W0_OFFS, + uartDateReg: ESP32C5_UART_DATE_REG_ADDR, + flashOffs: ESP32C5_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32C6: + return { + regBase: ESP32C6_SPI_REG_BASE, + baseFuse: ESP32C6_BASEFUSEADDR, + macFuse: ESP32C6_MACFUSEADDR, + usrOffs: ESP32C6_SPI_USR_OFFS, + usr1Offs: ESP32C6_SPI_USR1_OFFS, + usr2Offs: ESP32C6_SPI_USR2_OFFS, + mosiDlenOffs: ESP32C6_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32C6_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32C6_SPI_W0_OFFS, + uartDateReg: ESP32C6_UART_DATE_REG_ADDR, + flashOffs: ESP32C6_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32C61: + return { + regBase: ESP32C61_SPI_REG_BASE, + baseFuse: ESP32C61_BASEFUSEADDR, + macFuse: ESP32C61_MACFUSEADDR, + usrOffs: ESP32C61_SPI_USR_OFFS, + usr1Offs: ESP32C61_SPI_USR1_OFFS, + usr2Offs: ESP32C61_SPI_USR2_OFFS, + mosiDlenOffs: ESP32C61_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32C61_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32C61_SPI_W0_OFFS, + uartDateReg: ESP32C61_UART_DATE_REG_ADDR, + flashOffs: ESP32C61_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32H2: + return { + regBase: ESP32H2_SPI_REG_BASE, + baseFuse: ESP32H2_BASEFUSEADDR, + macFuse: ESP32H2_MACFUSEADDR, + usrOffs: ESP32H2_SPI_USR_OFFS, + usr1Offs: ESP32H2_SPI_USR1_OFFS, + usr2Offs: ESP32H2_SPI_USR2_OFFS, + mosiDlenOffs: ESP32H2_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32H2_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32H2_SPI_W0_OFFS, + uartDateReg: ESP32H2_UART_DATE_REG_ADDR, + flashOffs: ESP32H2_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32H4: + return { + regBase: ESP32H4_SPI_REG_BASE, + baseFuse: ESP32H4_BASEFUSEADDR, + macFuse: ESP32H4_MACFUSEADDR, + usrOffs: ESP32H4_SPI_USR_OFFS, + usr1Offs: ESP32H4_SPI_USR1_OFFS, + usr2Offs: ESP32H4_SPI_USR2_OFFS, + mosiDlenOffs: ESP32H4_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32H4_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32H4_SPI_W0_OFFS, + uartDateReg: ESP32H4_UART_DATE_REG_ADDR, + flashOffs: ESP32H4_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32H21: + return { + regBase: ESP32H21_SPI_REG_BASE, + baseFuse: ESP32H21_BASEFUSEADDR, + macFuse: ESP32H21_MACFUSEADDR, + usrOffs: ESP32H21_SPI_USR_OFFS, + usr1Offs: ESP32H21_SPI_USR1_OFFS, + usr2Offs: ESP32H21_SPI_USR2_OFFS, + mosiDlenOffs: ESP32H21_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32H21_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32H21_SPI_W0_OFFS, + uartDateReg: ESP32H21_UART_DATE_REG_ADDR, + flashOffs: ESP32H21_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32P4: + return { + regBase: ESP32P4_SPI_REG_BASE, + baseFuse: ESP32P4_BASEFUSEADDR, + macFuse: ESP32P4_MACFUSEADDR, + usrOffs: ESP32P4_SPI_USR_OFFS, + usr1Offs: ESP32P4_SPI_USR1_OFFS, + usr2Offs: ESP32P4_SPI_USR2_OFFS, + mosiDlenOffs: ESP32P4_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32P4_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32P4_SPI_W0_OFFS, + uartDateReg: ESP32P4_UART_DATE_REG_ADDR, + flashOffs: ESP32P4_BOOTLOADER_FLASH_OFFSET, + }; + case CHIP_FAMILY_ESP32S31: + return { + regBase: ESP32S31_SPI_REG_BASE, + baseFuse: ESP32S31_BASEFUSEADDR, + macFuse: ESP32S31_MACFUSEADDR, + usrOffs: ESP32S31_SPI_USR_OFFS, + usr1Offs: ESP32S31_SPI_USR1_OFFS, + usr2Offs: ESP32S31_SPI_USR2_OFFS, + mosiDlenOffs: ESP32S31_SPI_MOSI_DLEN_OFFS, + misoDlenOffs: ESP32S31_SPI_MISO_DLEN_OFFS, + w0Offs: ESP32S31_SPI_W0_OFFS, + uartDateReg: ESP32S31_UART_DATE_REG_ADDR, + flashOffs: ESP32S31_BOOTLOADER_FLASH_OFFSET, + }; + default: + return { + regBase: -1, + baseFuse: -1, + macFuse: -1, + usrOffs: -1, + usr1Offs: -1, + usr2Offs: -1, + mosiDlenOffs: -1, + misoDlenOffs: -1, + w0Offs: -1, + uartDateReg: -1, + flashOffs: -1, + }; + } +}; +class SlipReadError extends Error { + constructor(message) { + super(message); + this.name = "SlipReadError"; + } +} + +const getStubCode = async (chipFamily, chipRevision) => { + var _a; + let stubcode; + // Chips without stub support yet + if (chipFamily == CHIP_FAMILY_ESP32H21) { + return null; + } + if (chipFamily == CHIP_FAMILY_ESP32) { + stubcode = await import('./esp32-B8850rv8.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32S2) { + stubcode = await import('./esp32s2-BOpIARj_.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32S3) { + stubcode = await import('./esp32s3-CRbHylBG.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP8266) { + stubcode = await import('./esp8266-uMlyfdAd.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32C2) { + stubcode = await import('./esp32c2-CTp4VfBB.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32C3) { + stubcode = await import('./esp32c3-DrQN2m6I.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32C5) { + stubcode = await import('./esp32c5-CwEu6-ud.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32C6) { + stubcode = await import('./esp32c6-BHggnM95.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32C61) { + stubcode = await import('./esp32c61-CywZQrZW.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32H2) { + stubcode = await import('./esp32h2-Ct40LsfK.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32H4) { + stubcode = await import('./esp32h4-C-JLQLQQ.js'); + } + else if (chipFamily == CHIP_FAMILY_ESP32P4) { + // esp32p4.json for Rev 3.x (300+) and + // esp32p4-rev1.json for older revisions. + if (chipRevision !== null && + chipRevision !== undefined && + chipRevision >= 300) { + stubcode = await import('./esp32p4-BDw23zUX.js'); + } + else { + stubcode = await import('./esp32p4-rev1-CGY2cc8x.js'); + } + } + else if (chipFamily == CHIP_FAMILY_ESP32S31) { + stubcode = await import('./esp32s31-AEZQRkUU.js'); + } + else { + // Unknown chip family - no stub available + return null; + } + const sc = (_a = stubcode === null || stubcode === void 0 ? void 0 : stubcode.default) !== null && _a !== void 0 ? _a : stubcode; + // Base64 decode the text and data + return { + ...sc, + text: toByteArray(atob(sc.text)), + data: toByteArray(atob(sc.data)), + }; +}; + +const FLASH_MANUFACTURERS = { + 0xef: "Winbond", + 0xc8: "GigaDevice", + 0x9d: "ISSI", + 0xc2: "Macronix/MXIC", + 0x20: "XMC / Micron", + 0x1c: "EON", + 0x85: "Puya", + 0x68: "BOYA", + 0xa1: "Fudan Microelectronics (FM)", + 0x01: "Spansion/Cypress", + 0x5e: "Zbit", + 0x37: "AMIC", + 0xe0: "Berg Micro", + 0x46: "XTX Technology", +}; +const FLASH_DEVICES = { + 0x010219: "S25FL256S (256Mbit)", + 0x014015: "S25FL016K (16Mbit)", + 0x014016: "S25FL032K (32Mbit)", + 0x016017: "S25FL064L (64Mbit)", + 0x016018: "S25FL128L (128Mbit)", + 0x1c3013: "EN25Q40 (4Mbit)", + 0x1c3014: "EN25Q80A (8Mbit)", + 0x1c3015: "EN25Q16 (16Mbit)", + 0x1c3016: "EN25Q32B (32Mbit)", + 0x1c3017: "EN25Q64 (64Mbit)", + 0x1c3018: "EN25Q128 (128Mbit)", + 0x1c7015: "EN25QH16 (16Mbit)", + 0x1c7016: "EN25QH32 (32Mbit)", + 0x1c7017: "EN25QH64 (64Mbit)", + 0x1c7018: "EN25QH128 (128Mbit)", + 0x204015: "XM25QH16C (16Mbit)", + 0x204016: "XM25QH32B (32Mbit)", + 0x204017: "XM25QH64C (64Mbit)", + 0x204018: "XM25QH128C (128Mbit)", + 0x204019: "XM25QH256C (256Mbit)", + 0x204119: "XM25QU256C (256Mbit)", + 0x207017: "XM25QH64A (64Mbit)", + 0x207018: "XM25QH128A (128Mbit)", + 0x20ba16: "N25Q032A (32Mbit)", + 0x20ba17: "N25Q064A (64Mbit)", + 0x20ba18: "N25Q128A (128Mbit)", + 0x20bb15: "N25Q016A (16Mbit)", + 0x372015: "A25L016 (16Mbit)", + 0x372016: "A25L032 (32Mbit)", + 0x374016: "A25LQ032 (32Mbit)", + 0x5e4015: "ZB25VQ16 (16Mbit)", + 0x5e4016: "ZB25VQ32 (32Mbit)", + 0x5e4017: "ZB25VQ64 (64Mbit)", + 0x5e4018: "ZB25VQ128 (128Mbit)", + 0x684015: "BY25Q16 (16Mbit)", + 0x684016: "BY25Q32 (32Mbit)", + 0x684017: "BY25Q64 (64Mbit)", + 0x684018: "BY25Q128 (128Mbit)", + 0x856015: "P25Q16H (16Mbit)", + 0x856016: "P25Q32H (32Mbit)", + 0x856017: "P25Q64H (64Mbit)", + 0x856018: "P25Q128H (128Mbit)", + 0x9d6015: "IS25LP016 (16Mbit)", + 0x9d6016: "IS25LP032 (32Mbit)", + 0x9d6017: "IS25LP064 (64Mbit)", + 0x9d6018: "IS25LP128 (128Mbit)", + 0x9d6019: "IS25LP256 (256Mbit)", + 0x9d7015: "IS25WP016 (16Mbit)", + 0x9d7016: "IS25WP032 (32Mbit)", + 0x9d7017: "IS25WP064 (64Mbit)", + 0x9d7018: "IS25WP128 (128Mbit)", + 0x9d7019: "IS25WP256 (256Mbit)", + 0xa14014: "FM25Q08 (8Mbit)", + 0xa14015: "FM25Q16 (16Mbit)", + 0xa14016: "FM25Q32 (32Mbit)", + 0xa14017: "FM25Q64 (64Mbit)", + 0xa14018: "FM25Q128 (128Mbit)", + 0xc22010: "MX25L512E (512Kbit)", + 0xc22011: "MX25L1005C (1Mbit)", + 0xc22012: "MX25L2005C (2Mbit)", + 0xc22013: "MX25L4005 (4Mbit)", + 0xc22014: "MX25L8005 (8Mbit)", + 0xc22015: "MX25L1605D (16Mbit)", + 0xc22016: "MX25L3205D (32Mbit)", + 0xc22017: "MX25L6405D (64Mbit)", + 0xc22018: "MX25L12805D (128Mbit)", + 0xc22019: "MX25L25635E (256Mbit)", + 0xc2201a: "MX25L51245G (512Mbit)", + 0xc25e16: "MX25L3233F (32Mbit)", + 0xc84011: "GD25Q10 (1Mbit)", + 0xc84012: "GD25Q20 (2Mbit)", + 0xc84013: "GD25Q40 (4Mbit)", + 0xc84014: "GD25Q80 (8Mbit)", + 0xc84015: "GD25Q16 (16Mbit)", + 0xc84016: "GD25Q32 (32Mbit)", + 0xc84017: "GD25Q64 (64Mbit)", + 0xc84018: "GD25Q127C (128Mbit)", + 0xc84019: "GD25Q256 (256Mbit)", + 0xc84020: "GD25Q512 (512Mbit)", + 0xc86019: "GD25LQ256D (256Mbit)", + 0xe04015: "BG25Q16A (16Mbit)", + 0xe04016: "BG25Q32 (32Mbit)", + 0xe04017: "BG25Q64 (64Mbit)", + 0xe04018: "BG25Q128 (128Mbit)", + 0xef4014: "W25Q80 (8Mbit)", + 0xef4015: "W25Q16 (16Mbit)", + 0xef4016: "W25Q32 (32Mbit)", + 0xef4017: "W25Q64 (64Mbit)", + 0xef4018: "W25Q128 (128Mbit)", + 0xef4019: "W25Q256 (256Mbit)", + 0xef4020: "W25Q512JV (512Mbit)", + 0xef5012: "W25Q20BW (2Mbit)", + 0xef5013: "W25Q40BW (4Mbit)", + 0xef6011: "W25Q10EW (1Mbit)", + 0xef6012: "W25Q20EW (2Mbit)", + 0xef6013: "W25Q40EW (4Mbit)", + 0x464015: "XT25F16B (16Mbit)", + 0x464016: "XT25F32B (32Mbit)", + 0x464017: "XT25F64B (64Mbit)", + 0x464018: "XT25F128B (128Mbit)", +}; + +/*! pako 2.2.0 https://github.com/nodeca/pako @license (MIT AND Zlib) */ +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +/* eslint-disable space-unary-ops */ + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + + +//const Z_FILTERED = 1; +//const Z_HUFFMAN_ONLY = 2; +//const Z_RLE = 3; +const Z_FIXED$1 = 4; +//const Z_DEFAULT_STRATEGY = 0; + +/* Possible values of the data_type field (though see inflate()) */ +const Z_BINARY = 0; +const Z_TEXT = 1; +//const Z_ASCII = 1; // = Z_TEXT +const Z_UNKNOWN$1 = 2; + +/*============================================================================*/ + + +function zero$1(buf) { let len = buf.length; while (--len >= 0) { buf[len] = 0; } } + +// From zutil.h + +const STORED_BLOCK = 0; +const STATIC_TREES = 1; +const DYN_TREES = 2; +/* The three kinds of block type */ + +const MIN_MATCH$1 = 3; +const MAX_MATCH$1 = 258; +/* The minimum and maximum match lengths */ + +// From deflate.h +/* =========================================================================== + * Internal compression state. + */ + +const LENGTH_CODES$1 = 29; +/* number of length codes, not counting the special END_BLOCK code */ + +const LITERALS$1 = 256; +/* number of literal bytes 0..255 */ + +const L_CODES$1 = LITERALS$1 + 1 + LENGTH_CODES$1; +/* number of Literal or Length codes, including the END_BLOCK code */ + +const D_CODES$1 = 30; +/* number of distance codes */ + +const BL_CODES$1 = 19; +/* number of codes used to transfer the bit lengths */ + +const HEAP_SIZE$1 = 2 * L_CODES$1 + 1; +/* maximum heap size */ + +const MAX_BITS$1 = 15; +/* All codes must not exceed MAX_BITS bits */ + +const Buf_size = 16; +/* size of bit buffer in bi_buf */ + + +/* =========================================================================== + * Constants + */ + +const MAX_BL_BITS = 7; +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +const END_BLOCK = 256; +/* end of block literal code */ + +const REP_3_6 = 16; +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +const REPZ_3_10 = 17; +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +const REPZ_11_138 = 18; +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +/* eslint-disable comma-spacing,array-bracket-spacing */ +const extra_lbits = /* extra bits for each length code */ + new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]); + +const extra_dbits = /* extra bits for each distance code */ + new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]); + +const extra_blbits = /* extra bits for each bit length code */ + new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]); + +const bl_order = + new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]); +/* eslint-enable comma-spacing,array-bracket-spacing */ + +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +// We pre-fill arrays with 0 to avoid uninitialized gaps + +const DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + +// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1 +const static_ltree = new Array((L_CODES$1 + 2) * 2); +zero$1(static_ltree); +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +const static_dtree = new Array(D_CODES$1 * 2); +zero$1(static_dtree); +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +const _dist_code = new Array(DIST_CODE_LEN); +zero$1(_dist_code); +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +const _length_code = new Array(MAX_MATCH$1 - MIN_MATCH$1 + 1); +zero$1(_length_code); +/* length code for each normalized match length (0 == MIN_MATCH) */ + +const base_length = new Array(LENGTH_CODES$1); +zero$1(base_length); +/* First normalized length for each code (0 = MIN_MATCH) */ + +const base_dist = new Array(D_CODES$1); +zero$1(base_dist); +/* First normalized distance for each code (0 = distance of 1) */ + + +function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ + + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; +} + + +let static_l_desc; +let static_d_desc; +let static_bl_desc; + + +function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ +} + + + +const d_code = (dist) => { + + return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; +}; + + +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +const put_short = (s, w) => { +// put_byte(s, (uch)((w) & 0xff)); +// put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +}; + + +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +const send_bits = (s, value, length) => { + + if (s.bi_valid > (Buf_size - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short(s, s.bi_buf); + s.bi_buf = value >> (Buf_size - s.bi_valid); + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; + } +}; + + +const send_code = (s, c, tree) => { + + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); +}; + + +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +const bi_reverse = (code, len) => { + + let res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; +}; + + +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +const bi_flush = (s) => { + + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; + + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } +}; + + +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +const gen_bitlen = (s, desc) => { +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ + + const tree = desc.dyn_tree; + const max_code = desc.max_code; + const stree = desc.stat_desc.static_tree; + const has_stree = desc.stat_desc.has_stree; + const extra = desc.stat_desc.extra_bits; + const base = desc.stat_desc.extra_base; + const max_length = desc.stat_desc.max_length; + let h; /* heap index */ + let n, m; /* iterate over the tree elements */ + let bits; /* bit length */ + let xbits; /* extra bits */ + let f; /* frequency */ + let overflow = 0; /* number of elements with bit length too large */ + + for (bits = 0; bits <= MAX_BITS$1; bits++) { + s.bl_count[bits] = 0; + } + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + + for (h = s.heap_max + 1; h < HEAP_SIZE$1; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ + + if (n > max_code) { continue; } /* not a leaf node */ + + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } + + // Tracev((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ + + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } +}; + + +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +const gen_codes = (tree, max_code, bl_count) => { +// ct_data *tree; /* the tree to decorate */ +// int max_code; /* largest code with non zero frequency */ +// ushf *bl_count; /* number of codes at each bit length */ + + const next_code = new Array(MAX_BITS$1 + 1); /* next code value for each bit length */ + let code = 0; /* running code value */ + let bits; /* bit index */ + let n; /* code index */ + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= MAX_BITS$1; bits++) { + code = (code + bl_count[bits - 1]) << 1; + next_code[bits] = code; + } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1< { + + let n; /* iterates over tree elements */ + let bits; /* bit counter */ + let length; /* length value */ + let code; /* code value */ + let dist; /* distance index */ + const bl_count = new Array(MAX_BITS$1 + 1); + /* number of codes at each bit length for an optimal tree */ + + // do check in _tr_init() + //if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +/*#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif*/ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES$1 - 1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + _length_code[length++] = code; + } + } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + _dist_code[dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES$1; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { + _dist_code[256 + dist++] = code; + } + } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS$1; bits++) { + bl_count[bits] = 0; + } + + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes(static_ltree, L_CODES$1 + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES$1; n++) { + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); + } + + // Now data ready and we can init static trees + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS$1 + 1, L_CODES$1, MAX_BITS$1); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES$1, MAX_BITS$1); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES$1, MAX_BL_BITS); + + //static_init_done = true; +}; + + +/* =========================================================================== + * Initialize a new block. + */ +const init_block = (s) => { + + let n; /* iterates over tree elements */ + + /* Initialize the trees. */ + for (n = 0; n < L_CODES$1; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES$1; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES$1; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.sym_next = s.matches = 0; +}; + + +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +const bi_windup = (s) => +{ + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; + } + s.bi_buf = 0; + s.bi_valid = 0; +}; + +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +const smaller = (tree, n, m, depth) => { + + const _n2 = n * 2; + const _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); +}; + +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +const pqdownheap = (s, tree, k) => { +// deflate_state *s; +// ct_data *tree; /* the tree to restore */ +// int k; /* node to move down */ + + const v = s.heap[k]; + let j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; + } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s.heap[j], s.depth)) { break; } + + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; + + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; +}; + + +// inlined manually +// const SMALLEST = 1; + +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +const compress_block = (s, ltree, dtree) => { +// deflate_state *s; +// const ct_data *ltree; /* literal tree */ +// const ct_data *dtree; /* distance tree */ + + let dist; /* distance of matched string */ + let lc; /* match length or unmatched char (if dist == 0) */ + let sx = 0; /* running index in sym_buf */ + let code; /* the code to send */ + let extra; /* number of extra bits to send */ + + if (s.sym_next !== 0) { + do { + dist = s.pending_buf[s.sym_buf + sx++] & 0xff; + dist += (s.pending_buf[s.sym_buf + sx++] & 0xff) << 8; + lc = s.pending_buf[s.sym_buf + sx++]; + if (dist === 0) { + send_code(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS$1 + 1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + //Assert (code < D_CODES, "bad d_code"); + + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra !== 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ + + /* Check that the overlay between pending_buf and sym_buf is ok: */ + //Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); + + } while (sx < s.sym_next); + } + + send_code(s, END_BLOCK, ltree); +}; + + +/* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ +const build_tree = (s, desc) => { +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ + + const tree = desc.dyn_tree; + const stree = desc.stat_desc.static_tree; + const has_stree = desc.stat_desc.has_stree; + const elems = desc.stat_desc.elems; + let n, m; /* iterate over heap elements */ + let max_code = -1; /* largest code with non zero frequency */ + let node; /* new node being created */ + + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE$1; + + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; + + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } + + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; + + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap(s, tree, 1/*SMALLEST*/); + /***/ + + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; + + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap(s, tree, 1/*SMALLEST*/); + + } while (s.heap_len >= 2); + + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, desc); + + /* The field len is now set, we can generate the bit codes */ + gen_codes(tree, max_code, s.bl_count); +}; + + +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +const scan_tree = (s, tree, max_code) => { +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ + + let n; /* iterates over all tree elements */ + let prevlen = -1; /* last emitted length */ + let curlen; /* length of current code */ + + let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + let count = 0; /* repeat count of the current code */ + let max_count = 7; /* max repeat count */ + let min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; + + } else if (curlen !== 0) { + + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; + + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; + + } else { + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + } + + count = 0; + prevlen = curlen; + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } +}; + + +/* =========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ +const send_tree = (s, tree, max_code) => { +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ + + let n; /* iterates over all tree elements */ + let prevlen = -1; /* last emitted length */ + let curlen; /* length of current code */ + + let nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + + let count = 0; /* repeat count of the current code */ + let max_count = 7; /* max repeat count */ + let min_count = 4; /* min repeat count */ + + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + + if (++count < max_count && curlen === nextlen) { + continue; + + } else if (count < min_count) { + do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); + + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); + + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); + + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); + } + + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + + } else { + max_count = 7; + min_count = 4; + } + } +}; + + +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +const build_bl_tree = (s) => { + + let max_blindex; /* index of last bit length code of non zero freq */ + + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); + + /* Build the bit length tree: */ + build_tree(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES$1 - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; +}; + + +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +const send_all_trees = (s, lcodes, dcodes, blcodes) => { +// deflate_state *s; +// int lcodes, dcodes, blcodes; /* number of codes for each tree */ + + let rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); +}; + + +/* =========================================================================== + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "block list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. + */ +const detect_data_type = (s) => { + /* block_mask is the bit mask of block-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + let block_mask = 0xf3ffc07f; + let n; + + /* Check for non-textual ("block-listed") bytes. */ + for (n = 0; n <= 31; n++, block_mask >>>= 1) { + if ((block_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY; + } + } + + /* Check for textual ("allow-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + for (n = 32; n < LITERALS$1; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + } + + /* There are no "block-listed" or "allow-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; +}; + + +let static_init_done = false; + +/* =========================================================================== + * Initialize the tree data structures for a new zlib stream. + */ +const _tr_init$1 = (s) => +{ + + if (!static_init_done) { + tr_static_init(); + static_init_done = true; + } + + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); + + s.bi_buf = 0; + s.bi_valid = 0; + + /* Initialize the first block of the first file: */ + init_block(s); +}; + + +/* =========================================================================== + * Send a stored block + */ +const _tr_stored_block$1 = (s, buf, stored_len, last) => { +//DeflateState *s; +//charf *buf; /* input block */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ + + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ + bi_windup(s); /* align on byte boundary */ + put_short(s, stored_len); + put_short(s, ~stored_len); + if (stored_len) { + s.pending_buf.set(s.window.subarray(buf, buf + stored_len), s.pending); + } + s.pending += stored_len; +}; + + +/* =========================================================================== + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. + */ +const _tr_align$1 = (s) => { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); +}; + + +/* =========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and write out the encoded block. + */ +const _tr_flush_block$1 = (s, buf, stored_len, last) => { +//DeflateState *s; +//charf *buf; /* input block, or NULL if too old */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ + + let opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + let max_blindex = 0; /* index of last bit length code of non zero freq */ + + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { + + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN$1) { + s.strm.data_type = detect_data_type(s); + } + + /* Construct the literal and distance trees */ + build_tree(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + + build_tree(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->sym_next / 3)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ + } + + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + _tr_stored_block$1(s, buf, stored_len, last); + + } else if (s.strategy === Z_FIXED$1 || static_lenb === opt_lenb) { + + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. + */ + init_block(s); + + if (last) { + bi_windup(s); + } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); +}; + +/* =========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ +const _tr_tally$1 = (s, dist, lc) => { +// deflate_state *s; +// unsigned dist; /* distance of matched string */ +// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ + + s.pending_buf[s.sym_buf + s.sym_next++] = dist; + s.pending_buf[s.sym_buf + s.sym_next++] = dist >> 8; + s.pending_buf[s.sym_buf + s.sym_next++] = lc; + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code[lc] + LITERALS$1 + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; + } + + return (s.sym_next === s.sym_end); +}; + +var _tr_init_1 = _tr_init$1; +var _tr_stored_block_1 = _tr_stored_block$1; +var _tr_flush_block_1 = _tr_flush_block$1; +var _tr_tally_1 = _tr_tally$1; +var _tr_align_1 = _tr_align$1; + +var trees = { + _tr_init: _tr_init_1, + _tr_stored_block: _tr_stored_block_1, + _tr_flush_block: _tr_flush_block_1, + _tr_tally: _tr_tally_1, + _tr_align: _tr_align_1 +}; + +// Note: adler32 takes 12% for level 0 and 2% for level 6. +// It isn't worth it to make additional optimizations as in original. +// Small size is preferable. + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +const adler32 = (adler, buf, len, pos) => { + let s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; + + while (len !== 0) { + // Set limit ~ twice less than 5552, to keep + // s2 in 31-bits, because we force signed ints. + // in other case %= will fail. + n = len > 2000 ? 2000 : len; + len -= n; + + do { + s1 = (s1 + buf[pos++]) |0; + s2 = (s2 + s1) |0; + } while (--n); + + s1 %= 65521; + s2 %= 65521; + } + + return (s1 | (s2 << 16)) |0; +}; + + +var adler32_1 = adler32; + +// Note: we can't get significant speed boost here. +// So write code to minimize size - no pregenerated tables +// and array tools dependencies. + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +// Use ordinary array, since untyped makes no boost here +const makeTable = () => { + let c, table = []; + + for (var n = 0; n < 256; n++) { + c = n; + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + } + table[n] = c; + } + + return table; +}; + +// Create table on load. Just 255 signed longs. Not a problem. +const crcTable = new Uint32Array(makeTable()); + + +const crc32 = (crc, buf, len, pos) => { + const t = crcTable; + const end = pos + len; + + crc ^= -1; + + for (let i = pos; i < end; i++) { + crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; + } + + return (crc ^ (-1)); // >>> 0; +}; + + +var crc32_1 = crc32; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +var messages = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +var constants$2 = { + + /* Allowed flush values; see deflate() and inflate() below for details */ + Z_NO_FLUSH: 0, + Z_PARTIAL_FLUSH: 1, + Z_SYNC_FLUSH: 2, + Z_FULL_FLUSH: 3, + Z_FINISH: 4, + Z_BLOCK: 5, + /* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + Z_OK: 0, + Z_STREAM_END: 1, + Z_STREAM_ERROR: -2, + Z_DATA_ERROR: -3, + Z_BUF_ERROR: -5, + Z_DEFAULT_COMPRESSION: -1, + + + Z_FILTERED: 1, + Z_HUFFMAN_ONLY: 2, + Z_RLE: 3, + Z_FIXED: 4, + Z_DEFAULT_STRATEGY: 0, + + //Z_ASCII: 1, // = Z_TEXT (deprecated) + Z_UNKNOWN: 2, + + /* The deflate compression method */ + Z_DEFLATED: 8 + //Z_NULL: null // Use -1 or null inline, depending on var type +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +const { _tr_init, _tr_stored_block, _tr_flush_block, _tr_tally, _tr_align } = trees; + + + + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + +const { + Z_NO_FLUSH: Z_NO_FLUSH$2, Z_PARTIAL_FLUSH, Z_FULL_FLUSH: Z_FULL_FLUSH$1, Z_FINISH: Z_FINISH$3, Z_BLOCK: Z_BLOCK$1, + Z_OK: Z_OK$3, Z_STREAM_END: Z_STREAM_END$3, Z_STREAM_ERROR: Z_STREAM_ERROR$2, Z_DATA_ERROR: Z_DATA_ERROR$2, Z_BUF_ERROR: Z_BUF_ERROR$2, + Z_DEFAULT_COMPRESSION: Z_DEFAULT_COMPRESSION$1, + Z_FILTERED, Z_HUFFMAN_ONLY, Z_RLE, Z_FIXED, Z_DEFAULT_STRATEGY: Z_DEFAULT_STRATEGY$1, + Z_UNKNOWN, + Z_DEFLATED: Z_DEFLATED$2 +} = constants$2; + +/*============================================================================*/ + + +const MAX_MEM_LEVEL = 9; +/* Maximum value for memLevel in deflateInit2 */ +const MAX_WBITS$1 = 15; +/* 32K LZ77 window */ +const DEF_MEM_LEVEL = 8; + + +const LENGTH_CODES = 29; +/* number of length codes, not counting the special END_BLOCK code */ +const LITERALS = 256; +/* number of literal bytes 0..255 */ +const L_CODES = LITERALS + 1 + LENGTH_CODES; +/* number of Literal or Length codes, including the END_BLOCK code */ +const D_CODES = 30; +/* number of distance codes */ +const BL_CODES = 19; +/* number of codes used to transfer the bit lengths */ +const HEAP_SIZE = 2 * L_CODES + 1; +/* maximum heap size */ +const MAX_BITS = 15; +/* All codes must not exceed MAX_BITS bits */ + +const MIN_MATCH = 3; +const MAX_MATCH = 258; +const MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); + +const PRESET_DICT = 0x20; + +const INIT_STATE = 42; /* zlib header -> BUSY_STATE */ +//#ifdef GZIP +const GZIP_STATE = 57; /* gzip header -> BUSY_STATE | EXTRA_STATE */ +//#endif +const EXTRA_STATE = 69; /* gzip extra block -> NAME_STATE */ +const NAME_STATE = 73; /* gzip file name -> COMMENT_STATE */ +const COMMENT_STATE = 91; /* gzip comment -> HCRC_STATE */ +const HCRC_STATE = 103; /* gzip header CRC -> BUSY_STATE */ +const BUSY_STATE = 113; /* deflate -> FINISH_STATE */ +const FINISH_STATE = 666; /* stream complete */ + +const BS_NEED_MORE = 1; /* block not completed, need more input or more output */ +const BS_BLOCK_DONE = 2; /* block flush performed */ +const BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */ +const BS_FINISH_DONE = 4; /* finish done, accept no more input or output */ + +const OS_CODE = 0x03; // Unix :) . Don't detect, use this default. + +const err = (strm, errorCode) => { + strm.msg = messages[errorCode]; + return errorCode; +}; + +const rank = (f) => { + return ((f) * 2) - ((f) > 4 ? 9 : 0); +}; + +const zero = (buf) => { + let len = buf.length; while (--len >= 0) { buf[len] = 0; } +}; + +/* =========================================================================== + * Slide the hash table when sliding the window down (could be avoided with 32 + * bit values at the expense of memory usage). We slide even when level == 0 to + * keep the hash table consistent if we switch back to level > 0 later. + */ +const slide_hash = (s) => { + let n, m; + let p; + let wsize = s.w_size; + + n = s.hash_size; + p = n; + do { + m = s.head[--p]; + s.head[p] = (m >= wsize ? m - wsize : 0); + } while (--n); + n = wsize; +//#ifndef FASTEST + p = n; + do { + m = s.prev[--p]; + s.prev[p] = (m >= wsize ? m - wsize : 0); + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + } while (--n); +//#endif +}; + +/* eslint-disable new-cap */ +let HASH = (s, prev, data) => ((prev << s.hash_shift) ^ data) & s.hash_mask; + + +/* =========================================================================== + * Insert string str in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to INSERT_STRING are made with consecutive input + * characters and the first MIN_MATCH bytes of str are valid (except for + * the last MIN_MATCH-1 bytes of the input file). + */ +const INSERT_STRING = (s, str) => { + let h; + if (s.legacy_hash) { + /* UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]); */ + h = s.ins_h = HASH(s, s.ins_h, s.window[str + MIN_MATCH - 1]); + } else { + // ANZAC++ hash: reads 4 bytes, matches node.js zlib output (legacyHash + // restores classic zlib hash). Faster, with fewer collisions. + const w = s.window; + // Read 4 bytes little-endian. Math.imul reproduces C uint32 overflow in + // `(value * 66521 + 66521) >> 16` exactly. + const value = w[str] | (w[str + 1] << 8) | (w[str + 2] << 16) | (w[str + 3] << 24); + h = s.ins_h = ((Math.imul(value, 66521) + 66521) >>> 16) & s.hash_mask; + } + const hash_head = s.prev[str & s.w_mask] = s.head[h]; + s.head[h] = str; + return hash_head; +}; + + +/* ========================================================================= + * Flush as much pending output as possible. All deflate() output, except for + * some deflate_stored() output, goes through this function so some + * applications may wish to modify it to avoid allocating a large + * strm->next_out buffer and copying into it. (See also read_buf()). + */ +const flush_pending = (strm) => { + const s = strm.state; + + //_tr_flush_bits(s); + let len = s.pending; + if (len > strm.avail_out) { + len = strm.avail_out; + } + if (len === 0) { return; } + + strm.output.set(s.pending_buf.subarray(s.pending_out, s.pending_out + len), strm.next_out); + strm.next_out += len; + s.pending_out += len; + strm.total_out += len; + strm.avail_out -= len; + s.pending -= len; + if (s.pending === 0) { + s.pending_out = 0; + } +}; + + +const flush_block_only = (s, last) => { + _tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); + s.block_start = s.strstart; + flush_pending(s.strm); +}; + + +const put_byte = (s, b) => { + s.pending_buf[s.pending++] = b; +}; + + +/* ========================================================================= + * Put a short in the pending buffer. The 16-bit value is put in MSB order. + * IN assertion: the stream state is correct and there is enough room in + * pending_buf. + */ +const putShortMSB = (s, b) => { + + // put_byte(s, (Byte)(b >> 8)); +// put_byte(s, (Byte)(b & 0xff)); + s.pending_buf[s.pending++] = (b >>> 8) & 0xff; + s.pending_buf[s.pending++] = b & 0xff; +}; + + +/* =========================================================================== + * Read a new buffer from the current input stream, update the adler32 + * and total number of bytes read. All deflate() input goes through + * this function so some applications may wish to modify it to avoid + * allocating a large strm->input buffer and copying from it. + * (See also flush_pending()). + */ +const read_buf = (strm, buf, start, size) => { + + let len = strm.avail_in; + + if (len > size) { len = size; } + if (len === 0) { return 0; } + + strm.avail_in -= len; + + // zmemcpy(buf, strm->next_in, len); + buf.set(strm.input.subarray(strm.next_in, strm.next_in + len), start); + if (strm.state.wrap === 1) { + strm.adler = adler32_1(strm.adler, buf, len, start); + } + + else if (strm.state.wrap === 2) { + strm.adler = crc32_1(strm.adler, buf, len, start); + } + + strm.next_in += len; + strm.total_in += len; + + return len; +}; + + +/* =========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + * OUT assertion: the match length is not greater than s->lookahead. + */ +const longest_match = (s, cur_match) => { + + let chain_length = s.max_chain_length; /* max hash chain length */ + let scan = s.strstart; /* current string */ + let match; /* matched string */ + let len; /* length of current match */ + let best_len = s.prev_length; /* best match length so far */ + let nice_match = s.nice_match; /* stop if match long enough */ + const limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ? + s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/; + + const _win = s.window; // shortcut + + const wmask = s.w_mask; + const prev = s.prev; + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + + const strend = s.strstart + MAX_MATCH; + let scan_end1 = _win[scan + best_len - 1]; + let scan_end = _win[scan + best_len]; + + /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. + * It is easy to get rid of this optimization if necessary. + */ + // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever"); + + /* Do not waste too much time if we already have a good match: */ + if (s.prev_length >= s.good_match) { + chain_length >>= 2; + } + /* Do not look for matches beyond the end of the input. This is necessary + * to make deflate deterministic. + */ + if (nice_match > s.lookahead) { nice_match = s.lookahead; } + + // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead"); + + do { + // Assert(cur_match < s->strstart, "no future"); + match = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2. Note that the checks below + * for insufficient lookahead only occur occasionally for performance + * reasons. Therefore uninitialized memory will be accessed, and + * conditional jumps will be made that depend on those values. + * However the length of the match is limited to the lookahead, so + * the output of deflate is not affected by the uninitialized values. + */ + + if (_win[match + best_len] !== scan_end || + _win[match + best_len - 1] !== scan_end1 || + _win[match] !== _win[scan] || + _win[++match] !== _win[scan + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scan += 2; + match++; + // Assert(*scan == *match, "match[2]?"); + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + /*jshint noempty:false*/ + } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && + scan < strend); + + // Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan"); + + len = MAX_MATCH - (strend - scan); + scan = strend - MAX_MATCH; + + if (len > best_len) { + s.match_start = cur_match; + best_len = len; + if (len >= nice_match) { + break; + } + scan_end1 = _win[scan + best_len - 1]; + scan_end = _win[scan + best_len]; + } + } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0); + + if (best_len <= s.lookahead) { + return best_len; + } + return s.lookahead; +}; + + +/* =========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead. + * + * IN assertion: lookahead < MIN_LOOKAHEAD + * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD + * At least one byte has been read, or avail_in == 0; reads are + * performed for at least two bytes (required for the zip translate_eol + * option -- not supported here). + */ +const fill_window = (s) => { + + const _w_size = s.w_size; + let n, more, str; + + //Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead"); + + do { + more = s.window_size - s.lookahead - s.strstart; + + // JS ints have 32 bit, block below not needed + /* Deal with !@#$% 64K limit: */ + //if (sizeof(int) <= 2) { + // if (more == 0 && s->strstart == 0 && s->lookahead == 0) { + // more = wsize; + // + // } else if (more == (unsigned)(-1)) { + // /* Very unlikely, but possible on 16 bit machine if + // * strstart == 0 && lookahead == 1 (input done a byte at time) + // */ + // more--; + // } + //} + + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) { + + s.window.set(s.window.subarray(_w_size, _w_size + _w_size - more), 0); + s.match_start -= _w_size; + s.strstart -= _w_size; + /* we now have strstart >= MAX_DIST */ + s.block_start -= _w_size; + if (s.insert > s.strstart) { + s.insert = s.strstart; + } + slide_hash(s); + more += _w_size; + } + if (s.strm.avail_in === 0) { + break; + } + + /* If there was no sliding: + * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && + * more == window_size - lookahead - strstart + * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) + * => more >= window_size - 2*WSIZE + 2 + * In the BIG_MEM or MMAP case (not yet supported), + * window_size == input_size + MIN_LOOKAHEAD && + * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. + * Otherwise, window_size == 2*WSIZE so more >= 2. + * If there was sliding, more >= WSIZE. So in all cases, more >= 2. + */ + //Assert(more >= 2, "more < 2"); + n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more); + s.lookahead += n; + + /* Initialize the hash value now that we have some input: */ + if (!s.legacy_hash) { + /* The 4-byte hash reads one extra byte, so it needs one more available. */ + if (s.lookahead + s.insert > MIN_MATCH) { + str = s.strstart - s.insert; + while (s.insert) { + INSERT_STRING(s, str); + str++; + s.insert--; + if (s.lookahead + s.insert <= MIN_MATCH) { + break; + } + } + } + } else if (s.lookahead + s.insert >= MIN_MATCH) { + str = s.strstart - s.insert; + s.ins_h = s.window[str]; + + /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */ + s.ins_h = HASH(s, s.ins_h, s.window[str + 1]); +//#if MIN_MATCH != 3 +// Call update_hash() MIN_MATCH-3 more times +//#endif + while (s.insert) { + INSERT_STRING(s, str); + str++; + s.insert--; + if (s.lookahead + s.insert < MIN_MATCH) { + break; + } + } + } + /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage, + * but this is not important since only literal bytes will be emitted. + */ + + } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ +// if (s.high_water < s.window_size) { +// const curr = s.strstart + s.lookahead; +// let init = 0; +// +// if (s.high_water < curr) { +// /* Previous high water mark below current data -- zero WIN_INIT +// * bytes or up to end of window, whichever is less. +// */ +// init = s.window_size - curr; +// if (init > WIN_INIT) +// init = WIN_INIT; +// zmemzero(s->window + curr, (unsigned)init); +// s->high_water = curr + init; +// } +// else if (s->high_water < (ulg)curr + WIN_INIT) { +// /* High water mark at or above current data, but below current data +// * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up +// * to end of window, whichever is less. +// */ +// init = (ulg)curr + WIN_INIT - s->high_water; +// if (init > s->window_size - s->high_water) +// init = s->window_size - s->high_water; +// zmemzero(s->window + s->high_water, (unsigned)init); +// s->high_water += init; +// } +// } +// +// Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD, +// "not enough room for search"); +}; + +/* =========================================================================== + * Copy without compression as much as possible from the input stream, return + * the current block state. + * + * In case deflateParams() is used to later switch to a non-zero compression + * level, s->matches (otherwise unused when storing) keeps track of the number + * of hash table slides to perform. If s->matches is 1, then one hash table + * slide will be done when switching. If s->matches is 2, the maximum value + * allowed here, then the hash table will be cleared, since two or more slides + * is the same as a clear. + * + * deflate_stored() is written to minimize the number of times an input byte is + * copied. It is most efficient with large input and output buffers, which + * maximizes the opportunites to have a single copy from next_in to next_out. + */ +const deflate_stored = (s, flush) => { + + /* Smallest worthy block size when not flushing or finishing. By default + * this is 32K. This can be as small as 507 bytes for memLevel == 1. For + * large input and output buffers, the stored block size will be larger. + */ + let min_block = s.pending_buf_size - 5 > s.w_size ? s.w_size : s.pending_buf_size - 5; + + /* Copy as many min_block or larger stored blocks directly to next_out as + * possible. If flushing, copy the remaining available input to next_out as + * stored blocks, if there is enough space. + */ + let len, left, have, last = 0; + let used = s.strm.avail_in; + do { + /* Set len to the maximum size block that we can copy directly with the + * available input data and output space. Set left to how much of that + * would be copied from what's left in the window. + */ + len = 65535/* MAX_STORED */; /* maximum deflate stored block length */ + have = (s.bi_valid + 42) >> 3; /* number of header bytes */ + if (s.strm.avail_out < have) { /* need room for header */ + break; + } + /* maximum stored block length that will fit in avail_out: */ + have = s.strm.avail_out - have; + left = s.strstart - s.block_start; /* bytes left in window */ + if (len > left + s.strm.avail_in) { + len = left + s.strm.avail_in; /* limit len to the input */ + } + if (len > have) { + len = have; /* limit len to the output */ + } + + /* If the stored block would be less than min_block in length, or if + * unable to copy all of the available input when flushing, then try + * copying to the window and the pending buffer instead. Also don't + * write an empty block when flushing -- deflate() does that. + */ + if (len < min_block && ((len === 0 && flush !== Z_FINISH$3) || + flush === Z_NO_FLUSH$2 || + len !== left + s.strm.avail_in)) { + break; + } + + /* Make a dummy stored block in pending to get the header bytes, + * including any pending bits. This also updates the debugging counts. + */ + last = flush === Z_FINISH$3 && len === left + s.strm.avail_in ? 1 : 0; + _tr_stored_block(s, 0, 0, last); + + /* Replace the lengths in the dummy stored block with len. */ + s.pending_buf[s.pending - 4] = len; + s.pending_buf[s.pending - 3] = len >> 8; + s.pending_buf[s.pending - 2] = ~len; + s.pending_buf[s.pending - 1] = ~len >> 8; + + /* Write the stored block header bytes. */ + flush_pending(s.strm); + +//#ifdef ZLIB_DEBUG +// /* Update debugging counts for the data about to be copied. */ +// s->compressed_len += len << 3; +// s->bits_sent += len << 3; +//#endif + + /* Copy uncompressed bytes from the window to next_out. */ + if (left) { + if (left > len) { + left = len; + } + //zmemcpy(s->strm->next_out, s->window + s->block_start, left); + s.strm.output.set(s.window.subarray(s.block_start, s.block_start + left), s.strm.next_out); + s.strm.next_out += left; + s.strm.avail_out -= left; + s.strm.total_out += left; + s.block_start += left; + len -= left; + } + + /* Copy uncompressed bytes directly from next_in to next_out, updating + * the check value. + */ + if (len) { + read_buf(s.strm, s.strm.output, s.strm.next_out, len); + s.strm.next_out += len; + s.strm.avail_out -= len; + s.strm.total_out += len; + } + } while (last === 0); + + /* Update the sliding window with the last s->w_size bytes of the copied + * data, or append all of the copied data to the existing window if less + * than s->w_size bytes were copied. Also update the number of bytes to + * insert in the hash tables, in the event that deflateParams() switches to + * a non-zero compression level. + */ + used -= s.strm.avail_in; /* number of input bytes directly copied */ + if (used) { + /* If any input was used, then no unused input remains in the window, + * therefore s->block_start == s->strstart. + */ + if (used >= s.w_size) { /* supplant the previous history */ + s.matches = 2; /* clear hash */ + //zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size); + s.window.set(s.strm.input.subarray(s.strm.next_in - s.w_size, s.strm.next_in), 0); + s.strstart = s.w_size; + s.insert = s.strstart; + } + else { + if (s.window_size - s.strstart <= used) { + /* Slide the window down. */ + s.strstart -= s.w_size; + //zmemcpy(s->window, s->window + s->w_size, s->strstart); + s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); + if (s.matches < 2) { + s.matches++; /* add a pending slide_hash() */ + } + if (s.insert > s.strstart) { + s.insert = s.strstart; + } + } + //zmemcpy(s->window + s->strstart, s->strm->next_in - used, used); + s.window.set(s.strm.input.subarray(s.strm.next_in - used, s.strm.next_in), s.strstart); + s.strstart += used; + s.insert += used > s.w_size - s.insert ? s.w_size - s.insert : used; + } + s.block_start = s.strstart; + } + if (s.high_water < s.strstart) { + s.high_water = s.strstart; + } + + /* If the last block was written to next_out, then done. */ + if (last) { + return BS_FINISH_DONE; + } + + /* If flushing and all input has been consumed, then done. */ + if (flush !== Z_NO_FLUSH$2 && flush !== Z_FINISH$3 && + s.strm.avail_in === 0 && s.strstart === s.block_start) { + return BS_BLOCK_DONE; + } + + /* Fill the window with any remaining input. */ + have = s.window_size - s.strstart; + if (s.strm.avail_in > have && s.block_start >= s.w_size) { + /* Slide the window down. */ + s.block_start -= s.w_size; + s.strstart -= s.w_size; + //zmemcpy(s->window, s->window + s->w_size, s->strstart); + s.window.set(s.window.subarray(s.w_size, s.w_size + s.strstart), 0); + if (s.matches < 2) { + s.matches++; /* add a pending slide_hash() */ + } + have += s.w_size; /* more space now */ + if (s.insert > s.strstart) { + s.insert = s.strstart; + } + } + if (have > s.strm.avail_in) { + have = s.strm.avail_in; + } + if (have) { + read_buf(s.strm, s.window, s.strstart, have); + s.strstart += have; + s.insert += have > s.w_size - s.insert ? s.w_size - s.insert : have; + } + if (s.high_water < s.strstart) { + s.high_water = s.strstart; + } + + /* There was not enough avail_out to write a complete worthy or flushed + * stored block to next_out. Write a stored block to pending instead, if we + * have enough input for a worthy block, or if flushing and there is enough + * room for the remaining input as a stored block in the pending buffer. + */ + have = (s.bi_valid + 42) >> 3; /* number of header bytes */ + /* maximum stored block length that will fit in pending: */ + have = s.pending_buf_size - have > 65535/* MAX_STORED */ ? 65535/* MAX_STORED */ : s.pending_buf_size - have; + min_block = have > s.w_size ? s.w_size : have; + left = s.strstart - s.block_start; + if (left >= min_block || + ((left || flush === Z_FINISH$3) && flush !== Z_NO_FLUSH$2 && + s.strm.avail_in === 0 && left <= have)) { + len = left > have ? have : left; + last = flush === Z_FINISH$3 && s.strm.avail_in === 0 && + len === left ? 1 : 0; + _tr_stored_block(s, s.block_start, len, last); + s.block_start += len; + flush_pending(s.strm); + } + + /* We've done all we can with the available input and output. */ + return last ? BS_FINISH_STARTED : BS_NEED_MORE; +}; + + +/* =========================================================================== + * Compress as much as possible from the input stream, return the current + * block state. + * This function does not perform lazy evaluation of matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ +const deflate_fast = (s, flush) => { + + let hash_head; /* head of the hash chain */ + let bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { + break; /* flush the current block */ + } + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH) { + hash_head = INSERT_STRING(s, s.strstart); + } + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + } + if (s.match_length >= MIN_MATCH) { + // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only + + /*** _tr_tally_dist(s, s.strstart - s.match_start, + s.match_length - MIN_MATCH, bflush); ***/ + bflush = _tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH); + + s.lookahead -= s.match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) { + s.match_length--; /* string at strstart already in table */ + do { + s.strstart++; + hash_head = INSERT_STRING(s, s.strstart); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. + */ + } while (--s.match_length !== 0); + s.strstart++; + } else + { + s.strstart += s.match_length; + s.match_length = 0; + if (s.legacy_hash) { + s.ins_h = s.window[s.strstart]; + /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */ + s.ins_h = HASH(s, s.ins_h, s.window[s.strstart + 1]); + +//#if MIN_MATCH != 3 +// Call UPDATE_HASH() MIN_MATCH-3 more times +//#endif + /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not + * matter since it will be recomputed at next deflate call. + */ + } + } + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s.window[s.strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +}; + +/* =========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ +const deflate_slow = (s, flush) => { + + let hash_head; /* head of hash chain */ + let bflush; /* set if current block must be flushed */ + + let max_insert; + + /* Process the input block. */ + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + if (s.lookahead < MIN_LOOKAHEAD) { + fill_window(s); + if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + hash_head = 0/*NIL*/; + if (s.lookahead >= MIN_MATCH) { + hash_head = INSERT_STRING(s, s.strstart); + } + + /* Find the longest match, discarding those <= prev_length. + */ + s.prev_length = s.match_length; + s.prev_match = s.match_start; + s.match_length = MIN_MATCH - 1; + + if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + s.match_length = longest_match(s, hash_head); + /* longest_match() sets match_start */ + + if (s.match_length <= 5 && + (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) { + + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + s.match_length = MIN_MATCH - 1; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) { + max_insert = s.strstart + s.lookahead - MIN_MATCH; + /* Do not insert strings in hash table beyond this. */ + + //check_match(s, s.strstart-1, s.prev_match, s.prev_length); + + /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, + s.prev_length - MIN_MATCH, bflush);***/ + bflush = _tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. If there is not + * enough lookahead, the last two strings are not inserted in + * the hash table. + */ + s.lookahead -= s.prev_length - 1; + s.prev_length -= 2; + do { + if (++s.strstart <= max_insert) { + hash_head = INSERT_STRING(s, s.strstart); + } + } while (--s.prev_length !== 0); + s.match_available = 0; + s.match_length = MIN_MATCH - 1; + s.strstart++; + + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + } else if (s.match_available) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); + + if (bflush) { + /*** FLUSH_BLOCK_ONLY(s, 0) ***/ + flush_block_only(s, false); + /***/ + } + s.strstart++; + s.lookahead--; + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + s.match_available = 1; + s.strstart++; + s.lookahead--; + } + } + //Assert (flush != Z_NO_FLUSH, "no flush?"); + if (s.match_available) { + //Tracevv((stderr,"%c", s->window[s->strstart-1])); + /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart - 1]); + + s.match_available = 0; + } + s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + + return BS_BLOCK_DONE; +}; + + +/* =========================================================================== + * For Z_RLE, simply look for runs of bytes, generate matches only of distance + * one. Do not maintain a hash table. (It will be regenerated if this run of + * deflate switches away from Z_RLE.) + */ +const deflate_rle = (s, flush) => { + + let bflush; /* set if current block must be flushed */ + let prev; /* byte at distance one to match */ + let scan, strend; /* scan goes up to strend for length of run */ + + const _win = s.window; + + for (;;) { + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the longest run, plus one for the unrolled loop. + */ + if (s.lookahead <= MAX_MATCH) { + fill_window(s); + if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + if (s.lookahead === 0) { break; } /* flush the current block */ + } + + /* See how many times the previous byte repeats */ + s.match_length = 0; + if (s.lookahead >= MIN_MATCH && s.strstart > 0) { + scan = s.strstart - 1; + prev = _win[scan]; + if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) { + strend = s.strstart + MAX_MATCH; + do { + /*jshint noempty:false*/ + } while (prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + prev === _win[++scan] && prev === _win[++scan] && + scan < strend); + s.match_length = MAX_MATCH - (strend - scan); + if (s.match_length > s.lookahead) { + s.match_length = s.lookahead; + } + } + //Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan"); + } + + /* Emit match if have run of MIN_MATCH or longer, else emit literal */ + if (s.match_length >= MIN_MATCH) { + //check_match(s, s.strstart, s.strstart - 1, s.match_length); + + /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/ + bflush = _tr_tally(s, 1, s.match_length - MIN_MATCH); + + s.lookahead -= s.match_length; + s.strstart += s.match_length; + s.match_length = 0; + } else { + /* No match, output a literal byte */ + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart]); + + s.lookahead--; + s.strstart++; + } + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +}; + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +const deflate_huff = (s, flush) => { + + let bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s.lookahead === 0) { + fill_window(s); + if (s.lookahead === 0) { + if (flush === Z_NO_FLUSH$2) { + return BS_NEED_MORE; + } + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s.match_length = 0; + //Tracevv((stderr,"%c", s->window[s->strstart])); + /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/ + bflush = _tr_tally(s, 0, s.window[s.strstart]); + s.lookahead--; + s.strstart++; + if (bflush) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + } + s.insert = 0; + if (flush === Z_FINISH$3) { + /*** FLUSH_BLOCK(s, 1); ***/ + flush_block_only(s, true); + if (s.strm.avail_out === 0) { + return BS_FINISH_STARTED; + } + /***/ + return BS_FINISH_DONE; + } + if (s.sym_next) { + /*** FLUSH_BLOCK(s, 0); ***/ + flush_block_only(s, false); + if (s.strm.avail_out === 0) { + return BS_NEED_MORE; + } + /***/ + } + return BS_BLOCK_DONE; +}; + +/* Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + */ +function Config(good_length, max_lazy, nice_length, max_chain, func) { + + this.good_length = good_length; + this.max_lazy = max_lazy; + this.nice_length = nice_length; + this.max_chain = max_chain; + this.func = func; +} + +const configuration_table = [ + /* good lazy nice chain */ + new Config(0, 0, 0, 0, deflate_stored), /* 0 store only */ + new Config(4, 4, 8, 4, deflate_fast), /* 1 max speed, no lazy matches */ + new Config(4, 5, 16, 8, deflate_fast), /* 2 */ + new Config(4, 6, 32, 32, deflate_fast), /* 3 */ + + new Config(4, 4, 16, 16, deflate_slow), /* 4 lazy matches */ + new Config(8, 16, 32, 32, deflate_slow), /* 5 */ + new Config(8, 16, 128, 128, deflate_slow), /* 6 */ + new Config(8, 32, 128, 256, deflate_slow), /* 7 */ + new Config(32, 128, 258, 1024, deflate_slow), /* 8 */ + new Config(32, 258, 258, 4096, deflate_slow) /* 9 max compression */ +]; + + +/* =========================================================================== + * Initialize the "longest match" routines for a new zlib stream + */ +const lm_init = (s) => { + + s.window_size = 2 * s.w_size; + + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + + /* Set the default configuration parameters: + */ + s.max_lazy_match = configuration_table[s.level].max_lazy; + s.good_match = configuration_table[s.level].good_length; + s.nice_match = configuration_table[s.level].nice_length; + s.max_chain_length = configuration_table[s.level].max_chain; + + s.strstart = 0; + s.block_start = 0; + s.lookahead = 0; + s.insert = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + s.ins_h = 0; +}; + + +function DeflateState() { + this.strm = null; /* pointer back to this zlib stream */ + this.status = 0; /* as the name implies */ + this.pending_buf = null; /* output still pending */ + this.pending_buf_size = 0; /* size of pending_buf */ + this.pending_out = 0; /* next pending byte to output to the stream */ + this.pending = 0; /* nb of bytes in the pending buffer */ + this.wrap = 0; /* bit 0 true for zlib, bit 1 true for gzip */ + this.gzhead = null; /* gzip header information to write */ + this.gzindex = 0; /* where in extra, name, or comment */ + this.method = Z_DEFLATED$2; /* can only be DEFLATED */ + this.last_flush = -1; /* value of flush param for previous deflate call */ + + this.w_size = 0; /* LZ77 window size (32K by default) */ + this.w_bits = 0; /* log2(w_size) (8..16) */ + this.w_mask = 0; /* w_size - 1 */ + + this.window = null; + /* Sliding window. Input bytes are read into the second half of the window, + * and move to the first half later to keep a dictionary of at least wSize + * bytes. With this organization, matches are limited to a distance of + * wSize-MAX_MATCH bytes, but this ensures that IO is always + * performed with a length multiple of the block size. + */ + + this.window_size = 0; + /* Actual size of window: 2*wSize, except when the user input buffer + * is directly used as sliding window. + */ + + this.prev = null; + /* Link to older string with same hash index. To limit the size of this + * array to 64K, this link is maintained only for the last 32K strings. + * An index in this array is thus a window index modulo 32K. + */ + + this.head = null; /* Heads of the hash chains or NIL. */ + + this.ins_h = 0; /* hash index of string to be inserted */ + this.legacy_hash = 0; /* use classic zlib hash instead of default ANZAC++ */ + this.hash_size = 0; /* number of elements in hash table */ + this.hash_bits = 0; /* log2(hash_size) */ + this.hash_mask = 0; /* hash_size-1 */ + + this.hash_shift = 0; + /* Number of bits by which ins_h must be shifted at each input + * step. It must be such that after MIN_MATCH steps, the oldest + * byte no longer takes part in the hash key, that is: + * hash_shift * MIN_MATCH >= hash_bits + */ + + this.block_start = 0; + /* Window position at the beginning of the current output block. Gets + * negative when the window is moved backwards. + */ + + this.match_length = 0; /* length of best match */ + this.prev_match = 0; /* previous match */ + this.match_available = 0; /* set if previous match exists */ + this.strstart = 0; /* start of string to insert */ + this.match_start = 0; /* start of matching string */ + this.lookahead = 0; /* number of valid bytes ahead in window */ + + this.prev_length = 0; + /* Length of the best match at previous step. Matches not greater than this + * are discarded. This is used in the lazy match evaluation. + */ + + this.max_chain_length = 0; + /* To speed up deflation, hash chains are never searched beyond this + * length. A higher limit improves compression ratio but degrades the + * speed. + */ + + this.max_lazy_match = 0; + /* Attempt to find a better match only when the current match is strictly + * smaller than this value. This mechanism is used only for compression + * levels >= 4. + */ + // That's alias to max_lazy_match, don't use directly + //this.max_insert_length = 0; + /* Insert new strings in the hash table only if the match length is not + * greater than this length. This saves time but degrades compression. + * max_insert_length is used only for compression levels <= 3. + */ + + this.level = 0; /* compression level (1..9) */ + this.strategy = 0; /* favor or force Huffman coding*/ + + this.good_match = 0; + /* Use a faster search when the previous match is longer than this */ + + this.nice_match = 0; /* Stop searching when current match exceeds this */ + + /* used by trees.c: */ + + /* Didn't use ct_data typedef below to suppress compiler warning */ + + // struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ + // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ + // struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ + + // Use flat array of DOUBLE size, with interleaved fata, + // because JS does not support effective + this.dyn_ltree = new Uint16Array(HEAP_SIZE * 2); + this.dyn_dtree = new Uint16Array((2 * D_CODES + 1) * 2); + this.bl_tree = new Uint16Array((2 * BL_CODES + 1) * 2); + zero(this.dyn_ltree); + zero(this.dyn_dtree); + zero(this.bl_tree); + + this.l_desc = null; /* desc. for literal tree */ + this.d_desc = null; /* desc. for distance tree */ + this.bl_desc = null; /* desc. for bit length tree */ + + //ush bl_count[MAX_BITS+1]; + this.bl_count = new Uint16Array(MAX_BITS + 1); + /* number of codes at each bit length for an optimal tree */ + + //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ + this.heap = new Uint16Array(2 * L_CODES + 1); /* heap used to build the Huffman trees */ + zero(this.heap); + + this.heap_len = 0; /* number of elements in the heap */ + this.heap_max = 0; /* element of largest frequency */ + /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. + * The same heap array is used to build all trees. + */ + + this.depth = new Uint16Array(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; + zero(this.depth); + /* Depth of each subtree used as tie breaker for trees of equal frequency + */ + + this.sym_buf = 0; /* buffer for distances and literals/lengths */ + + this.lit_bufsize = 0; + /* Size of match buffer for literals/lengths. There are 4 reasons for + * limiting lit_bufsize to 64K: + * - frequencies can be kept in 16 bit counters + * - if compression is not successful for the first block, all input + * data is still in the window so we can still emit a stored block even + * when input comes from standard input. (This can also be done for + * all blocks if lit_bufsize is not greater than 32K.) + * - if compression is not successful for a file smaller than 64K, we can + * even emit a stored file instead of a stored block (saving 5 bytes). + * This is applicable only for zip (not gzip or zlib). + * - creating new Huffman trees less frequently may not provide fast + * adaptation to changes in the input data statistics. (Take for + * example a binary file with poorly compressible code followed by + * a highly compressible string table.) Smaller buffer sizes give + * fast adaptation but have of course the overhead of transmitting + * trees more frequently. + * - I can't count above 4 + */ + + this.sym_next = 0; /* running index in sym_buf */ + this.sym_end = 0; /* symbol table full when sym_next reaches this */ + + this.opt_len = 0; /* bit length of current block with optimal trees */ + this.static_len = 0; /* bit length of current block with static trees */ + this.matches = 0; /* number of string matches in current block */ + this.insert = 0; /* bytes at end of window left to insert */ + + + this.bi_buf = 0; + /* Output buffer. bits are inserted starting at the bottom (least + * significant bits). + */ + this.bi_valid = 0; + /* Number of valid bits in bi_buf. All bits above the last valid bit + * are always zero. + */ + + // Used for window memory init. We safely ignore it for JS. That makes + // sense only for pointers and memory check tools. + //this.high_water = 0; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ +} + + +/* ========================================================================= + * Check for a valid deflate stream state. Return 0 if ok, 1 if not. + */ +const deflateStateCheck = (strm) => { + + if (!strm) { + return 1; + } + const s = strm.state; + if (!s || s.strm !== strm || (s.status !== INIT_STATE && +//#ifdef GZIP + s.status !== GZIP_STATE && +//#endif + s.status !== EXTRA_STATE && + s.status !== NAME_STATE && + s.status !== COMMENT_STATE && + s.status !== HCRC_STATE && + s.status !== BUSY_STATE && + s.status !== FINISH_STATE)) { + return 1; + } + return 0; +}; + + +const deflateResetKeep = (strm) => { + + if (deflateStateCheck(strm)) { + return err(strm, Z_STREAM_ERROR$2); + } + + strm.total_in = strm.total_out = 0; + strm.data_type = Z_UNKNOWN; + + const s = strm.state; + s.pending = 0; + s.pending_out = 0; + + if (s.wrap < 0) { + s.wrap = -s.wrap; + /* was made negative by deflate(..., Z_FINISH); */ + } + s.status = +//#ifdef GZIP + s.wrap === 2 ? GZIP_STATE : +//#endif + s.wrap ? INIT_STATE : BUSY_STATE; + strm.adler = (s.wrap === 2) ? + 0 // crc32(0, Z_NULL, 0) + : + 1; // adler32(0, Z_NULL, 0) + s.last_flush = -2; + _tr_init(s); + return Z_OK$3; +}; + + +const deflateReset = (strm) => { + + const ret = deflateResetKeep(strm); + if (ret === Z_OK$3) { + lm_init(strm.state); + } + return ret; +}; + + +const deflateSetHeader = (strm, head) => { + + if (deflateStateCheck(strm) || strm.state.wrap !== 2) { + return Z_STREAM_ERROR$2; + } + strm.state.gzhead = head; + return Z_OK$3; +}; + + +const deflateInit2 = (strm, level, method, windowBits, memLevel, strategy, legacyHash) => { + + if (!strm) { // === Z_NULL + return Z_STREAM_ERROR$2; + } + let wrap = 1; + + if (level === Z_DEFAULT_COMPRESSION$1) { + level = 6; + } + + if (windowBits < 0) { /* suppress zlib wrapper */ + wrap = 0; + windowBits = -windowBits; + } + + else if (windowBits > 15) { + wrap = 2; /* write gzip wrapper instead */ + windowBits -= 16; + } + + + if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED$2 || + windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || + strategy < 0 || strategy > Z_FIXED || (windowBits === 8 && wrap !== 1)) { + return err(strm, Z_STREAM_ERROR$2); + } + + + if (windowBits === 8) { + windowBits = 9; + } + /* until 256-byte window bug fixed */ + + const s = new DeflateState(); + + strm.state = s; + s.strm = strm; + s.status = INIT_STATE; /* to pass state test in deflateReset() */ + + s.wrap = wrap; + s.gzhead = null; + s.w_bits = windowBits; + s.w_size = 1 << s.w_bits; + s.w_mask = s.w_size - 1; + + s.legacy_hash = legacyHash ? 1 : 0; + + s.hash_bits = memLevel + 7; + /* ANZAC++ hash needs >= 15 hash bits to span its 4 read bytes. */ + if (!s.legacy_hash && s.hash_bits < 15) { + s.hash_bits = 15; + } + s.hash_size = 1 << s.hash_bits; + s.hash_mask = s.hash_size - 1; + s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH); + + s.window = new Uint8Array(s.w_size * 2); + s.head = new Uint16Array(s.hash_size); + s.prev = new Uint16Array(s.w_size); + + // Don't need mem init magic for JS. + //s.high_water = 0; /* nothing written to s->window yet */ + + s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ + + /* We overlay pending_buf and sym_buf. This works since the average size + * for length/distance pairs over any compressed block is assured to be 31 + * bits or less. + * + * Analysis: The longest fixed codes are a length code of 8 bits plus 5 + * extra bits, for lengths 131 to 257. The longest fixed distance codes are + * 5 bits plus 13 extra bits, for distances 16385 to 32768. The longest + * possible fixed-codes length/distance pair is then 31 bits total. + * + * sym_buf starts one-fourth of the way into pending_buf. So there are + * three bytes in sym_buf for every four bytes in pending_buf. Each symbol + * in sym_buf is three bytes -- two for the distance and one for the + * literal/length. As each symbol is consumed, the pointer to the next + * sym_buf value to read moves forward three bytes. From that symbol, up to + * 31 bits are written to pending_buf. The closest the written pending_buf + * bits gets to the next sym_buf symbol to read is just before the last + * code is written. At that time, 31*(n-2) bits have been written, just + * after 24*(n-2) bits have been consumed from sym_buf. sym_buf starts at + * 8*n bits into pending_buf. (Note that the symbol buffer fills when n-1 + * symbols are written.) The closest the writing gets to what is unread is + * then n+14 bits. Here n is lit_bufsize, which is 16384 by default, and + * can range from 128 to 32768. + * + * Therefore, at a minimum, there are 142 bits of space between what is + * written and what is read in the overlain buffers, so the symbols cannot + * be overwritten by the compressed data. That space is actually 139 bits, + * due to the three-bit fixed-code block header. + * + * That covers the case where either Z_FIXED is specified, forcing fixed + * codes, or when the use of fixed codes is chosen, because that choice + * results in a smaller compressed block than dynamic codes. That latter + * condition then assures that the above analysis also covers all dynamic + * blocks. A dynamic-code block will only be chosen to be emitted if it has + * fewer bits than a fixed-code block would for the same set of symbols. + * Therefore its average symbol length is assured to be less than 31. So + * the compressed data for a dynamic block also cannot overwrite the + * symbols from which it is being constructed. + */ + + s.pending_buf_size = s.lit_bufsize * 4; + s.pending_buf = new Uint8Array(s.pending_buf_size); + + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->sym_buf = s->pending_buf + s->lit_bufsize; + s.sym_buf = s.lit_bufsize; + + //s->sym_end = (s->lit_bufsize - 1) * 3; + s.sym_end = (s.lit_bufsize - 1) * 3; + /* We avoid equality with lit_bufsize*3 because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + + s.level = level; + s.strategy = strategy; + s.method = method; + + return deflateReset(strm); +}; + +const deflateInit = (strm, level) => { + + return deflateInit2(strm, level, Z_DEFLATED$2, MAX_WBITS$1, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY$1); +}; + + +/* ========================================================================= */ +const deflate$2 = (strm, flush) => { + + if (deflateStateCheck(strm) || flush > Z_BLOCK$1 || flush < 0) { + return strm ? err(strm, Z_STREAM_ERROR$2) : Z_STREAM_ERROR$2; + } + + const s = strm.state; + + if (!strm.output || + (strm.avail_in !== 0 && !strm.input) || + (s.status === FINISH_STATE && flush !== Z_FINISH$3)) { + return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR$2 : Z_STREAM_ERROR$2); + } + + const old_flush = s.last_flush; + s.last_flush = flush; + + /* Flush as much pending output as possible */ + if (s.pending !== 0) { + flush_pending(strm); + if (strm.avail_out === 0) { + /* Since avail_out is 0, deflate will be called again with + * more output space, but possibly with both pending and + * avail_in equal to zero. There won't be anything to do, + * but this is not an error situation so make sure we + * return OK instead of BUF_ERROR at next call of deflate: + */ + s.last_flush = -1; + return Z_OK$3; + } + + /* Make sure there is something to do and avoid duplicate consecutive + * flushes. For repeated and useless calls with Z_FINISH, we keep + * returning Z_STREAM_END instead of Z_BUF_ERROR. + */ + } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && + flush !== Z_FINISH$3) { + return err(strm, Z_BUF_ERROR$2); + } + + /* User must not provide more input after the first FINISH: */ + if (s.status === FINISH_STATE && strm.avail_in !== 0) { + return err(strm, Z_BUF_ERROR$2); + } + + /* Write the header */ + if (s.status === INIT_STATE && s.wrap === 0) { + s.status = BUSY_STATE; + } + if (s.status === INIT_STATE) { + /* zlib header */ + let header = (Z_DEFLATED$2 + ((s.w_bits - 8) << 4)) << 8; + let level_flags = -1; + + if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) { + level_flags = 0; + } else if (s.level < 6) { + level_flags = 1; + } else if (s.level === 6) { + level_flags = 2; + } else { + level_flags = 3; + } + header |= (level_flags << 6); + if (s.strstart !== 0) { header |= PRESET_DICT; } + header += 31 - (header % 31); + + putShortMSB(s, header); + + /* Save the adler32 of the preset dictionary: */ + if (s.strstart !== 0) { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + strm.adler = 1; // adler32(0L, Z_NULL, 0); + s.status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } +//#ifdef GZIP + if (s.status === GZIP_STATE) { + /* gzip header */ + strm.adler = 0; //crc32(0L, Z_NULL, 0); + put_byte(s, 31); + put_byte(s, 139); + put_byte(s, 8); + if (!s.gzhead) { // s->gzhead == Z_NULL + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, 0); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, OS_CODE); + s.status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } + else { + put_byte(s, (s.gzhead.text ? 1 : 0) + + (s.gzhead.hcrc ? 2 : 0) + + (!s.gzhead.extra ? 0 : 4) + + (!s.gzhead.name ? 0 : 8) + + (!s.gzhead.comment ? 0 : 16) + ); + put_byte(s, s.gzhead.time & 0xff); + put_byte(s, (s.gzhead.time >> 8) & 0xff); + put_byte(s, (s.gzhead.time >> 16) & 0xff); + put_byte(s, (s.gzhead.time >> 24) & 0xff); + put_byte(s, s.level === 9 ? 2 : + (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? + 4 : 0)); + put_byte(s, s.gzhead.os & 0xff); + if (s.gzhead.extra && s.gzhead.extra.length) { + put_byte(s, s.gzhead.extra.length & 0xff); + put_byte(s, (s.gzhead.extra.length >> 8) & 0xff); + } + if (s.gzhead.hcrc) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending, 0); + } + s.gzindex = 0; + s.status = EXTRA_STATE; + } + } + if (s.status === EXTRA_STATE) { + if (s.gzhead.extra/* != Z_NULL*/) { + let beg = s.pending; /* start of bytes to update crc */ + let left = (s.gzhead.extra.length & 0xffff) - s.gzindex; + while (s.pending + left > s.pending_buf_size) { + let copy = s.pending_buf_size - s.pending; + // zmemcpy(s.pending_buf + s.pending, + // s.gzhead.extra + s.gzindex, copy); + s.pending_buf.set(s.gzhead.extra.subarray(s.gzindex, s.gzindex + copy), s.pending); + s.pending = s.pending_buf_size; + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + s.gzindex += copy; + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + beg = 0; + left -= copy; + } + // JS specific: s.gzhead.extra may be TypedArray or Array for backward compatibility + // TypedArray.slice and TypedArray.from don't exist in IE10-IE11 + let gzhead_extra = new Uint8Array(s.gzhead.extra); + // zmemcpy(s->pending_buf + s->pending, + // s->gzhead->extra + s->gzindex, left); + s.pending_buf.set(gzhead_extra.subarray(s.gzindex, s.gzindex + left), s.pending); + s.pending += left; + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + s.gzindex = 0; + } + s.status = NAME_STATE; + } + if (s.status === NAME_STATE) { + if (s.gzhead.name/* != Z_NULL*/) { + let beg = s.pending; /* start of bytes to update crc */ + let val; + do { + if (s.pending === s.pending_buf_size) { + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + beg = 0; + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.name.length) { + val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + s.gzindex = 0; + } + s.status = COMMENT_STATE; + } + if (s.status === COMMENT_STATE) { + if (s.gzhead.comment/* != Z_NULL*/) { + let beg = s.pending; /* start of bytes to update crc */ + let val; + do { + if (s.pending === s.pending_buf_size) { + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + beg = 0; + } + // JS specific: little magic to add zero terminator to end of string + if (s.gzindex < s.gzhead.comment.length) { + val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff; + } else { + val = 0; + } + put_byte(s, val); + } while (val !== 0); + //--- HCRC_UPDATE(beg) ---// + if (s.gzhead.hcrc && s.pending > beg) { + strm.adler = crc32_1(strm.adler, s.pending_buf, s.pending - beg, beg); + } + //---// + } + s.status = HCRC_STATE; + } + if (s.status === HCRC_STATE) { + if (s.gzhead.hcrc) { + if (s.pending + 2 > s.pending_buf_size) { + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + strm.adler = 0; //crc32(0L, Z_NULL, 0); + } + s.status = BUSY_STATE; + + /* Compression must start with an empty pending buffer */ + flush_pending(strm); + if (s.pending !== 0) { + s.last_flush = -1; + return Z_OK$3; + } + } +//#endif + + /* Start a new block or continue the current one. + */ + if (strm.avail_in !== 0 || s.lookahead !== 0 || + (flush !== Z_NO_FLUSH$2 && s.status !== FINISH_STATE)) { + let bstate = s.level === 0 ? deflate_stored(s, flush) : + s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + s.strategy === Z_RLE ? deflate_rle(s, flush) : + configuration_table[s.level].func(s, flush); + + if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) { + s.status = FINISH_STATE; + } + if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) { + if (strm.avail_out === 0) { + s.last_flush = -1; + /* avoid BUF_ERROR next call, see above */ + } + return Z_OK$3; + /* If flush != Z_NO_FLUSH && avail_out == 0, the next call + * of deflate should use the same flush parameter to make sure + * that the flush is complete. So we don't have to output an + * empty block here, this will be done at next call. This also + * ensures that for a very small output buffer, we emit at most + * one empty block. + */ + } + if (bstate === BS_BLOCK_DONE) { + if (flush === Z_PARTIAL_FLUSH) { + _tr_align(s); + } + else if (flush !== Z_BLOCK$1) { /* FULL_FLUSH or SYNC_FLUSH */ + + _tr_stored_block(s, 0, 0, false); + /* For a full flush, this empty block will be recognized + * as a special marker by inflate_sync(). + */ + if (flush === Z_FULL_FLUSH$1) { + /*** CLEAR_HASH(s); ***/ /* forget history */ + zero(s.head); // Fill with NIL (= 0); + + if (s.lookahead === 0) { + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + } + } + flush_pending(strm); + if (strm.avail_out === 0) { + s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */ + return Z_OK$3; + } + } + } + + if (flush !== Z_FINISH$3) { return Z_OK$3; } + if (s.wrap <= 0) { return Z_STREAM_END$3; } + + /* Write the trailer */ + if (s.wrap === 2) { + put_byte(s, strm.adler & 0xff); + put_byte(s, (strm.adler >> 8) & 0xff); + put_byte(s, (strm.adler >> 16) & 0xff); + put_byte(s, (strm.adler >> 24) & 0xff); + put_byte(s, strm.total_in & 0xff); + put_byte(s, (strm.total_in >> 8) & 0xff); + put_byte(s, (strm.total_in >> 16) & 0xff); + put_byte(s, (strm.total_in >> 24) & 0xff); + } + else + { + putShortMSB(s, strm.adler >>> 16); + putShortMSB(s, strm.adler & 0xffff); + } + + flush_pending(strm); + /* If avail_out is zero, the application will call deflate again + * to flush the rest. + */ + if (s.wrap > 0) { s.wrap = -s.wrap; } + /* write the trailer only once! */ + return s.pending !== 0 ? Z_OK$3 : Z_STREAM_END$3; +}; + + +const deflateEnd = (strm) => { + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR$2; + } + + const status = strm.state.status; + + strm.state = null; + + return status === BUSY_STATE ? err(strm, Z_DATA_ERROR$2) : Z_OK$3; +}; + + +/* ========================================================================= + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. + */ +const deflateSetDictionary = (strm, dictionary) => { + + let dictLength = dictionary.length; + + if (deflateStateCheck(strm)) { + return Z_STREAM_ERROR$2; + } + + const s = strm.state; + const wrap = s.wrap; + + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { + return Z_STREAM_ERROR$2; + } + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32_1(strm.adler, dictionary, dictLength, 0); + } + + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + let tmpDict = new Uint8Array(s.w_size); + tmpDict.set(dictionary.subarray(dictLength - s.w_size, dictLength), 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + const avail = strm.avail_in; + const next = strm.next_in; + const input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window(s); + while (s.lookahead >= MIN_MATCH) { + let str = s.strstart; + let n = s.lookahead - (MIN_MATCH - 1); + do { + INSERT_STRING(s, str); + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH - 1; + fill_window(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK$3; +}; + + +var deflateInit_1 = deflateInit; +var deflateInit2_1 = deflateInit2; +var deflateReset_1 = deflateReset; +var deflateResetKeep_1 = deflateResetKeep; +var deflateSetHeader_1 = deflateSetHeader; +var deflate_2$1 = deflate$2; +var deflateEnd_1 = deflateEnd; +var deflateSetDictionary_1 = deflateSetDictionary; +var deflateInfo = 'pako deflate (from Nodeca project)'; + +/* Not implemented +module.exports.deflateBound = deflateBound; +module.exports.deflateCopy = deflateCopy; +module.exports.deflateGetDictionary = deflateGetDictionary; +module.exports.deflateParams = deflateParams; +module.exports.deflatePending = deflatePending; +module.exports.deflatePrime = deflatePrime; +module.exports.deflateTune = deflateTune; +*/ + +var deflate_1$2 = { + deflateInit: deflateInit_1, + deflateInit2: deflateInit2_1, + deflateReset: deflateReset_1, + deflateResetKeep: deflateResetKeep_1, + deflateSetHeader: deflateSetHeader_1, + deflate: deflate_2$1, + deflateEnd: deflateEnd_1, + deflateSetDictionary: deflateSetDictionary_1, + deflateInfo: deflateInfo +}; + +const _has = (obj, key) => { + return Object.prototype.hasOwnProperty.call(obj, key); +}; + +var assign = function (obj /*from1, from2, from3, ...*/) { + const sources = Array.prototype.slice.call(arguments, 1); + while (sources.length) { + const source = sources.shift(); + if (!source) { continue; } + + if (typeof source !== 'object') { + throw new TypeError(source + 'must be non-object'); + } + + for (const p in source) { + if (_has(source, p)) { + obj[p] = source[p]; + } + } + } + + return obj; +}; + + +// Join array of chunks to single array. +var flattenChunks = (chunks) => { + // calculate data length + let len = 0; + + for (let i = 0, l = chunks.length; i < l; i++) { + len += chunks[i].length; + } + + // join chunks + const result = new Uint8Array(len); + + for (let i = 0, pos = 0, l = chunks.length; i < l; i++) { + let chunk = chunks[i]; + result.set(chunk, pos); + pos += chunk.length; + } + + return result; +}; + +var common = { + assign: assign, + flattenChunks: flattenChunks +}; + +// String encode/decode helpers + + +// Quick check if we can use fast array to bin string conversion +// +// - apply(Array) can fail on Android 2.2 +// - apply(Uint8Array) can fail on iOS 5.1 Safari +// +let STR_APPLY_UIA_OK = true; + +try { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; } + + +// Table with utf8 lengths (calculated by first byte of sequence) +// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS, +// because max possible codepoint is 0x10ffff +const _utf8len = new Uint8Array(256); +for (let q = 0; q < 256; q++) { + _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); +} +_utf8len[254] = _utf8len[255] = 1; // Invalid sequence start + + +// convert string to array (typed, when possible) +var string2buf = (str) => { + if (typeof TextEncoder === 'function' && TextEncoder.prototype.encode) { + return new TextEncoder().encode(str); + } + + let buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0; + + // count binary size + for (m_pos = 0; m_pos < str_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4; + } + + // allocate buffer + buf = new Uint8Array(buf_len); + + // convert + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { + c = str.charCodeAt(m_pos); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); + if ((c2 & 0xfc00) === 0xdc00) { + c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); + m_pos++; + } + } + if (c < 0x80) { + /* one byte */ + buf[i++] = c; + } else if (c < 0x800) { + /* two bytes */ + buf[i++] = 0xC0 | (c >>> 6); + buf[i++] = 0x80 | (c & 0x3f); + } else if (c < 0x10000) { + /* three bytes */ + buf[i++] = 0xE0 | (c >>> 12); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } else { + /* four bytes */ + buf[i++] = 0xf0 | (c >>> 18); + buf[i++] = 0x80 | (c >>> 12 & 0x3f); + buf[i++] = 0x80 | (c >>> 6 & 0x3f); + buf[i++] = 0x80 | (c & 0x3f); + } + } + + return buf; +}; + +// Helper +const buf2binstring = (buf, len) => { + // On Chrome, the arguments in a function call that are allowed is `65534`. + // If the length of the buffer is smaller than that, we can use this optimization, + // otherwise we will take a slower path. + if (len < 65534) { + if (buf.subarray && STR_APPLY_UIA_OK) { + return String.fromCharCode.apply(null, buf.length === len ? buf : buf.subarray(0, len)); + } + } + + let result = ''; + for (let i = 0; i < len; i++) { + result += String.fromCharCode(buf[i]); + } + return result; +}; + + +// convert array to string +var buf2string = (buf, max) => { + const len = max || buf.length; + + if (typeof TextDecoder === 'function' && TextDecoder.prototype.decode) { + return new TextDecoder().decode(buf.subarray(0, max)); + } + + let i, out; + + // Reserve max possible length (2 words per char) + // NB: by unknown reasons, Array is significantly faster for + // String.fromCharCode.apply than Uint16Array. + const utf16buf = new Array(len * 2); + + for (out = 0, i = 0; i < len;) { + let c = buf[i++]; + // quick process ascii + if (c < 0x80) { utf16buf[out++] = c; continue; } + + let c_len = _utf8len[c]; + // skip 5 & 6 byte codes + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } + + // apply mask on first byte + c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; + // join the rest + while (c_len > 1 && i < len) { + c = (c << 6) | (buf[i++] & 0x3f); + c_len--; + } + + // terminated by end of string? + if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; } + + if (c < 0x10000) { + utf16buf[out++] = c; + } else { + c -= 0x10000; + utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff); + utf16buf[out++] = 0xdc00 | (c & 0x3ff); + } + } + + return buf2binstring(utf16buf, out); +}; + + +// Calculate max possible position in utf8 buffer, +// that will not break sequence. If that's not possible +// - (very small limits) return max size as is. +// +// buf[] - utf8 bytes array +// max - length limit (mandatory); +var utf8border = (buf, max) => { + + max = max || buf.length; + if (max > buf.length) { max = buf.length; } + + // go back from last position, until start of sequence found + let pos = max - 1; + while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } + + // Very small and broken sequence, + // return max, because we should return something anyway. + if (pos < 0) { return max; } + + // If we came to start of buffer - that means buffer is too small, + // return max too. + if (pos === 0) { return max; } + + return (pos + _utf8len[buf[pos]] > max) ? pos : max; +}; + +var strings = { + string2buf: string2buf, + buf2string: buf2string, + utf8border: utf8border +}; + +// (C) 1995-2013 Jean-loup Gailly and Mark Adler +// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin +// +// This software is provided 'as-is', without any express or implied +// warranty. In no event will the authors be held liable for any damages +// arising from the use of this software. +// +// Permission is granted to anyone to use this software for any purpose, +// including commercial applications, and to alter it and redistribute it +// freely, subject to the following restrictions: +// +// 1. The origin of this software must not be misrepresented; you must not +// claim that you wrote the original software. If you use this software +// in a product, an acknowledgment in the product documentation would be +// appreciated but is not required. +// 2. Altered source versions must be plainly marked as such, and must not be +// misrepresented as being the original software. +// 3. This notice may not be removed or altered from any source distribution. + +function ZStream() { + /* next input byte */ + this.input = null; // JS specific, because we have no pointers + this.next_in = 0; + /* number of bytes available at input */ + this.avail_in = 0; + /* total number of input bytes read so far */ + this.total_in = 0; + /* next output byte should be put there */ + this.output = null; // JS specific, because we have no pointers + this.next_out = 0; + /* remaining free space at output */ + this.avail_out = 0; + /* total number of bytes output so far */ + this.total_out = 0; + /* last error message, NULL if no error */ + this.msg = ''/*Z_NULL*/; + /* not visible by applications */ + this.state = null; + /* best guess about the data type: binary or text */ + this.data_type = 2/*Z_UNKNOWN*/; + /* adler32 value of the uncompressed data */ + this.adler = 0; +} + +var zstream = ZStream; + +const toString$1 = Object.prototype.toString; + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + +const { + Z_NO_FLUSH: Z_NO_FLUSH$1, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH: Z_FINISH$2, + Z_OK: Z_OK$2, Z_STREAM_END: Z_STREAM_END$2, + Z_DEFAULT_COMPRESSION, + Z_DEFAULT_STRATEGY, + Z_DEFLATED: Z_DEFLATED$1 +} = constants$2; + +/* ===========================================================================*/ + +const defaultOptions$1 = { + level: Z_DEFAULT_COMPRESSION, + method: Z_DEFLATED$1, + chunkSize: 16384, + windowBits: 15, + memLevel: 8, + strategy: Z_DEFAULT_STRATEGY, + legacyHash: true +}; + +/** + * class Deflate + * + * Generic JS-style wrapper for zlib calls. If you don't need + * streaming behaviour - use more simple functions: [[deflate]], + * [[deflateRaw]] and [[gzip]]. + **/ + +/* internal + * Deflate.chunks -> Array + * + * Chunks of output data, if [[Deflate#onData]] not overridden. + **/ + +/** + * Deflate.result -> Uint8Array + * + * Compressed result, generated by default [[Deflate#onData]] + * and [[Deflate#onEnd]] handlers. Filled after you push last chunk + * (call [[Deflate#push]] with `Z_FINISH` / `true` param). + **/ + +/** + * Deflate.err -> Number + * + * Error code after deflate finished. 0 (Z_OK) on success. + * You will not need it in real life, because deflate errors + * are possible only on wrong options or bad `onData` / `onEnd` + * custom handlers. + **/ + +/** + * Deflate.msg -> String + * + * Error message, if [[Deflate.err]] != 0 + **/ + + +/** + * new Deflate(options) + * - options (Object): zlib deflate options. + * + * Creates new deflator instance with specified params. Throws exception + * on bad params. Supported options: + * + * - `level` + * - `windowBits` + * - `memLevel` + * - `strategy` + * - `dictionary` + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * - `legacyHash` (Boolean) - use the classic zlib hash (default), which matches + * canonical zlib output byte-for-byte. Set to `false` to use the faster + * ANZAC++ hash, which matches recent (chromium) node.js output instead. + * + * Additional options, for internal needs: + * + * - `chunkSize` - size of generated data chunks (16K by default) + * - `raw` (Boolean) - do raw deflate + * - `gzip` (Boolean) - create gzip wrapper + * - `header` (Object) - custom header for gzip + * - `text` (Boolean) - true if compressed data believed to be text + * - `time` (Number) - modification time, unix timestamp + * - `os` (Number) - operation system code + * - `extra` (Array) - array of bytes with extra data (max 65536) + * - `name` (String) - file name (binary string) + * - `comment` (String) - comment (binary string) + * - `hcrc` (Boolean) - true if header crc should be added + * + * ##### Example: + * + * ```javascript + * const pako = require('pako') + * , chunk1 = new Uint8Array([1,2,3,4,5,6,7,8,9]) + * , chunk2 = new Uint8Array([10,11,12,13,14,15,16,17,18,19]); + * + * const deflate = new pako.Deflate({ level: 3}); + * + * deflate.push(chunk1, false); + * deflate.push(chunk2, true); // true -> last chunk + * + * if (deflate.err) { throw new Error(deflate.err); } + * + * console.log(deflate.result); + * ``` + **/ +function Deflate$1(options) { + this.options = common.assign({}, defaultOptions$1, options || {}); + + let opt = this.options; + + if (opt.raw && (opt.windowBits > 0)) { + opt.windowBits = -opt.windowBits; + } + + else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) { + opt.windowBits += 16; + } + + this.err = 0; // error code, if happens (0 = Z_OK) + this.msg = ''; // error message + this.ended = false; // used to avoid multiple onEnd() calls + this.chunks = []; // chunks of compressed data + + this.strm = new zstream(); + this.strm.avail_out = 0; + + let status = deflate_1$2.deflateInit2( + this.strm, + opt.level, + opt.method, + opt.windowBits, + opt.memLevel, + opt.strategy, + opt.legacyHash + ); + + if (status !== Z_OK$2) { + throw new Error(messages[status]); + } + + if (opt.header) { + deflate_1$2.deflateSetHeader(this.strm, opt.header); + } + + if (opt.dictionary) { + let dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings.string2buf(opt.dictionary); + } else if (toString$1.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + + status = deflate_1$2.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK$2) { + throw new Error(messages[status]); + } + + this._dict_set = true; + } +} + +/** + * Deflate#push(data[, flush_mode]) -> Boolean + * - data (Uint8Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. + * - flush_mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. + * See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH. + * + * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with + * new compressed chunks. Returns `true` on success. The last data block must + * have `flush_mode` Z_FINISH (or `true`). That will flush internal pending + * buffers and call [[Deflate#onEnd]]. + * + * On fail call [[Deflate#onEnd]] with error code and return false. + * + * ##### Example + * + * ```javascript + * push(chunk, false); // push one of data chunks + * ... + * push(chunk, true); // push last chunk + * ``` + **/ +Deflate$1.prototype.push = function (data, flush_mode) { + const strm = this.strm; + const chunkSize = this.options.chunkSize; + let status, _flush_mode; + + if (this.ended) { return false; } + + if (flush_mode === ~~flush_mode) _flush_mode = flush_mode; + else _flush_mode = flush_mode === true ? Z_FINISH$2 : Z_NO_FLUSH$1; + + // Convert data if needed + if (typeof data === 'string') { + // If we need to compress text, change encoding to utf8. + strm.input = strings.string2buf(data); + } else if (toString$1.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); + } else { + strm.input = data; + } + + strm.next_in = 0; + strm.avail_in = strm.input.length; + + for (;;) { + if (strm.avail_out === 0) { + strm.output = new Uint8Array(chunkSize); + strm.next_out = 0; + strm.avail_out = chunkSize; + } + + // Make sure avail_out > 6 to avoid repeating markers + if ((_flush_mode === Z_SYNC_FLUSH || _flush_mode === Z_FULL_FLUSH) && strm.avail_out <= 6) { + this.onData(strm.output.subarray(0, strm.next_out)); + strm.avail_out = 0; + continue; + } + + status = deflate_1$2.deflate(strm, _flush_mode); + + // Ended => flush and finish + if (status === Z_STREAM_END$2) { + if (strm.next_out > 0) { + this.onData(strm.output.subarray(0, strm.next_out)); + } + status = deflate_1$2.deflateEnd(this.strm); + this.onEnd(status); + this.ended = true; + return status === Z_OK$2; + } + + // Flush if out buffer full + if (strm.avail_out === 0) { + this.onData(strm.output); + continue; + } + + // Flush if requested and has data + if (_flush_mode > 0 && strm.next_out > 0) { + this.onData(strm.output.subarray(0, strm.next_out)); + strm.avail_out = 0; + continue; + } + + if (strm.avail_in === 0) break; + } + + return true; +}; + + +/** + * Deflate#onData(chunk) -> Void + * - chunk (Uint8Array): output data. + * + * By default, stores data blocks in `chunks[]` property and glue + * those in `onEnd`. Override this handler, if you need another behaviour. + **/ +Deflate$1.prototype.onData = function (chunk) { + this.chunks.push(chunk); +}; + + +/** + * Deflate#onEnd(status) -> Void + * - status (Number): deflate status. 0 (Z_OK) on success, + * other if not. + * + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH). By default - join collected chunks, + * free memory and fill `results` / `err` properties. + **/ +Deflate$1.prototype.onEnd = function (status) { + // On success - join + if (status === Z_OK$2) { + this.result = common.flattenChunks(this.chunks); + } + this.chunks = []; + this.err = status; + this.msg = this.strm.msg; +}; + + +/** + * deflate(data[, options]) -> Uint8Array + * - data (Uint8Array|ArrayBuffer|String): input data to compress. + * - options (Object): zlib deflate options. + * + * Compress `data` with deflate algorithm and `options`. + * + * Supported options are: + * + * - level + * - windowBits + * - memLevel + * - strategy + * - dictionary + * + * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) + * for more information on these. + * + * Sugar (options): + * + * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify + * negative windowBits implicitly. + * + * ##### Example: + * + * ```javascript + * const pako = require('pako') + * const data = new Uint8Array([1,2,3,4,5,6,7,8,9]); + * + * console.log(pako.deflate(data)); + * ``` + **/ +function deflate$1(input, options) { + const deflator = new Deflate$1(options); + + deflator.push(input, true); + + // That will never happens, if you don't cheat with options :) + if (deflator.err) { throw deflator.msg || messages[deflator.err]; } + + return deflator.result; +} +var deflate_2 = deflate$1; + +var deflate_1$1 = { + deflate: deflate_2}; + +const { deflate} = deflate_1$1; +var deflate_1 = deflate; + +const lut = { + b: { u: DataView.prototype.getInt8, p: DataView.prototype.setInt8, bytes: 1 }, + B: { + u: DataView.prototype.getUint8, + p: DataView.prototype.setUint8, + bytes: 1, + }, + h: { + u: DataView.prototype.getInt16, + p: DataView.prototype.setInt16, + bytes: 2, + }, + H: { + u: DataView.prototype.getUint16, + p: DataView.prototype.setUint16, + bytes: 2, + }, + i: { + u: DataView.prototype.getInt32, + p: DataView.prototype.setInt32, + bytes: 4, + }, + I: { + u: DataView.prototype.getUint32, + p: DataView.prototype.setUint32, + bytes: 4, + }, +}; +const pack = (format, ...data) => { + let pointer = 0; + if (format.replace(/[<>]/, "").length != data.length) { + throw "Pack format to Argument count mismatch"; + } + const bytes = []; + let littleEndian = true; + for (let i = 0; i < format.length; i++) { + if (format[i] == "<") { + littleEndian = true; + } + else if (format[i] == ">") { + littleEndian = false; + } + else { + pushBytes(format[i], data[pointer]); + pointer++; + } + } + function pushBytes(formatChar, value) { + if (!(formatChar in lut)) { + throw "Unhandled character '" + formatChar + "' in pack format"; + } + const dataSize = lut[formatChar].bytes; + const view = new DataView(new ArrayBuffer(dataSize)); + const dataViewFn = lut[formatChar].p.bind(view); + dataViewFn(0, value, littleEndian); + for (let i = 0; i < dataSize; i++) { + bytes.push(view.getUint8(i)); + } + } + return bytes; +}; +const unpack = (format, bytes) => { + let pointer = 0; + const data = []; + let littleEndian = true; + for (const c of format) { + if (c == "<") { + littleEndian = true; + } + else if (c == ">") { + littleEndian = false; + } + else { + pushData(c); + } + } + function pushData(formatChar) { + if (!(formatChar in lut)) { + throw "Unhandled character '" + formatChar + "' in unpack format"; + } + const dataSize = lut[formatChar].bytes; + const view = new DataView(new ArrayBuffer(dataSize)); + for (let i = 0; i < dataSize; i++) { + view.setUint8(i, bytes[pointer + i] & 0xff); + } + const dataViewFn = lut[formatChar].u.bind(view); + data.push(dataViewFn(0, littleEndian)); + pointer += dataSize; + } + return data; +}; + +/// +class ESPLoader extends EventTarget { + /** + * Check if device is using USB-JTAG or USB-OTG (not external serial chip) + * Returns undefined if not yet determined + */ + get isUsbJtagOrOtg() { + return this._parent ? this._parent._isUsbJtagOrOtg : this._isUsbJtagOrOtg; + } + constructor(port, logger, _parent) { + super(); + this.port = port; + this.logger = logger; + this._parent = _parent; + this.__chipName = null; + this.__chipRevision = null; + this.__chipVariant = null; + this._efuses = new Array(4).fill(0); + this._flashsize = 4 * 1024 * 1024; + this.debug = false; + this.IS_STUB = false; + this.connected = true; + this.flashSize = null; + this.currentBaudRate = ESP_ROM_BAUD; + this.SLIP_END = 0xc0; + this.SLIP_ESC = 0xdb; + this.SLIP_ESC_END = 0xdc; + this.SLIP_ESC_ESC = 0xdd; + this._isESP32S2NativeUSB = false; + this._initializationSucceeded = false; + this.__commandLock = Promise.resolve([0, []]); + this.__isReconfiguring = false; + this.__abandonCurrentOperation = false; + this._suppressDisconnect = false; + this.__consoleMode = false; + this._isUsbJtagOrOtg = undefined; + this.state_DTR = false; + this.state_RTS = false; + this.__writeChain = Promise.resolve(); + } + // Chip properties with parent delegation + // chipFamily accessed before initialization as designed + get chipFamily() { + return this._parent ? this._parent.chipFamily : this.__chipFamily; + } + set chipFamily(value) { + if (this._parent) { + this._parent.chipFamily = value; + } + else { + this.__chipFamily = value; + } + } + get chipName() { + return this._parent ? this._parent.chipName : this.__chipName; + } + set chipName(value) { + if (this._parent) { + this._parent.chipName = value; + } + else { + this.__chipName = value; + } + } + get chipRevision() { + return this._parent ? this._parent.chipRevision : this.__chipRevision; + } + set chipRevision(value) { + if (this._parent) { + this._parent.chipRevision = value; + } + else { + this.__chipRevision = value; + } + } + get chipVariant() { + return this._parent ? this._parent.chipVariant : this.__chipVariant; + } + set chipVariant(value) { + if (this._parent) { + this._parent.chipVariant = value; + } + else { + this.__chipVariant = value; + } + } + // Console mode with parent delegation + get _consoleMode() { + return this._parent ? this._parent._consoleMode : this.__consoleMode; + } + set _consoleMode(value) { + if (this._parent) { + this._parent._consoleMode = value; + } + else { + this.__consoleMode = value; + } + } + // Public setter for console mode (used by script.js) + setConsoleMode(value) { + this._consoleMode = value; + } + get _inputBuffer() { + if (this._parent) { + return this._parent._inputBuffer; + } + if (this.__inputBuffer === undefined) { + throw new Error("_inputBuffer accessed before initialization"); + } + return this.__inputBuffer; + } + get _inputBufferReadIndex() { + return this._parent + ? this._parent._inputBufferReadIndex + : this.__inputBufferReadIndex || 0; + } + set _inputBufferReadIndex(value) { + if (this._parent) { + this._parent._inputBufferReadIndex = value; + } + else { + this.__inputBufferReadIndex = value; + } + } + // Get available bytes in buffer (from read index to end) + get _inputBufferAvailable() { + return this._inputBuffer.length - this._inputBufferReadIndex; + } + // Read one byte from buffer (ring-buffer style with index pointer) + _readByte() { + if (this._inputBufferReadIndex >= this._inputBuffer.length) { + return undefined; + } + return this._inputBuffer[this._inputBufferReadIndex++]; + } + // Clear input buffer and reset read index + _clearInputBuffer() { + this._inputBuffer.length = 0; + this._inputBufferReadIndex = 0; + } + // Compact buffer when read index gets too large (prevent memory growth) + _compactInputBuffer() { + if (this._inputBufferReadIndex > 1000 && + this._inputBufferReadIndex > this._inputBuffer.length / 2) { + // Remove already-read bytes and reset index + this._inputBuffer.splice(0, this._inputBufferReadIndex); + this._inputBufferReadIndex = 0; + } + } + get _totalBytesRead() { + return this._parent + ? this._parent._totalBytesRead + : this.__totalBytesRead || 0; + } + set _totalBytesRead(value) { + if (this._parent) { + this._parent._totalBytesRead = value; + } + else { + this.__totalBytesRead = value; + } + } + get _commandLock() { + return this._parent ? this._parent._commandLock : this.__commandLock; + } + set _commandLock(value) { + if (this._parent) { + this._parent._commandLock = value; + } + else { + this.__commandLock = value; + } + } + get _isReconfiguring() { + return this._parent + ? this._parent._isReconfiguring + : this.__isReconfiguring; + } + set _isReconfiguring(value) { + if (this._parent) { + this._parent._isReconfiguring = value; + } + else { + this.__isReconfiguring = value; + } + } + get _abandonCurrentOperation() { + return this._parent + ? this._parent._abandonCurrentOperation + : this.__abandonCurrentOperation; + } + set _abandonCurrentOperation(value) { + if (this._parent) { + this._parent._abandonCurrentOperation = value; + } + else { + this.__abandonCurrentOperation = value; + } + } + detectUSBSerialChip(vendorId, productId) { + // Common USB-Serial chip vendors and their products + const chips = { + 0x1a86: { + // QinHeng Electronics + 0x7522: { name: "CH340", maxBaudrate: 460800 }, + 0x7523: { name: "CH340", maxBaudrate: 460800 }, + 0x7584: { name: "CH340", maxBaudrate: 460800 }, + 0x5523: { name: "CH341", maxBaudrate: 2000000 }, + 0x55d3: { name: "CH343", maxBaudrate: 6000000 }, + 0x55d4: { name: "CH9102", maxBaudrate: 6000000 }, + 0x55d8: { name: "CH9101", maxBaudrate: 3000000 }, + }, + 0x10c4: { + // Silicon Labs + 0xea60: { name: "CP2102(n)", maxBaudrate: 3000000 }, + 0xea70: { name: "CP2105", maxBaudrate: 2000000 }, + 0xea71: { name: "CP2108", maxBaudrate: 2000000 }, + }, + 0x0403: { + // FTDI + 0x6001: { name: "FT232R", maxBaudrate: 3000000 }, + 0x6010: { name: "FT2232", maxBaudrate: 3000000 }, + 0x6011: { name: "FT4232", maxBaudrate: 3000000 }, + 0x6014: { name: "FT232H", maxBaudrate: 12000000 }, + 0x6015: { name: "FT230X", maxBaudrate: 3000000 }, + }, + 0x303a: { + // Espressif (native USB) + 0x2: { name: "ESP32-S2 Native USB", maxBaudrate: 2000000 }, + 0x12: { name: "ESP32-P4 Native USB", maxBaudrate: 2000000 }, + 0x1001: { name: "ESP32 Native USB", maxBaudrate: 2000000 }, + }, + }; + const vendor = chips[vendorId]; + if (vendor && vendor[productId]) { + return vendor[productId]; + } + return { + name: `Unknown (VID: 0x${vendorId.toString(16)}, PID: 0x${productId.toString(16)})`, + }; + } + async initialize() { + if (!this._parent) { + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + this.__totalBytesRead = 0; + // Detect and log USB-Serial chip info + const portInfo = this.port.getInfo(); + if (portInfo.usbVendorId && portInfo.usbProductId) { + const chipInfo = this.detectUSBSerialChip(portInfo.usbVendorId, portInfo.usbProductId); + this.logger.log(`USB-Serial: ${chipInfo.name} (VID: 0x${portInfo.usbVendorId.toString(16)}, PID: 0x${portInfo.usbProductId.toString(16)})`); + if (chipInfo.maxBaudrate) { + this._maxUSBSerialBaudrate = chipInfo.maxBaudrate; + this.logger.log(`Max baudrate: ${chipInfo.maxBaudrate}`); + } + // Detect ESP32-S2 Native USB + if (portInfo.usbVendorId === 0x303a && portInfo.usbProductId === 0x2) { + this._isESP32S2NativeUSB = true; + } + } + // Don't await this promise so it doesn't block rest of method. + this.readLoop(); + } + // Try to connect with different reset strategies + await this.connectWithResetStrategies(); + // Detect chip type + await this.detectChip(); + // Power on flash for ESP32-P4 Rev 3.1 (301) & Rev 3.2 (302) + // (MUST be done BEFORE loading stub) + if (this.chipFamily === CHIP_FAMILY_ESP32P4 && + (this.chipRevision === 301 || this.chipRevision === 302)) { + await this.powerOnFlash(); + } + // Detect if device is using USB-JTAG/Serial or USB-OTG (not external serial chip) + // This is needed to determine the correct reset strategy for console mode + try { + this._isUsbJtagOrOtg = await this.detectUsbConnectionType(); + this.logger.debug(`USB connection type: ${this._isUsbJtagOrOtg ? "USB-JTAG/OTG" : "External Serial Chip"}`); + } + catch (err) { + this.logger.debug(`Could not detect USB connection type: ${err}`); + } + try { + const usbMode = await this.getUsbMode(); + this.logger.debug(`USB mode (register): ${usbMode.mode} (uartNo=${usbMode.uartNo})`); + } + catch (err) { + this.logger.debug(`Could not detect USB mode: ${err}`); + } + // Read the OTP data for this chip and store into this.efuses array + const FlAddr = getSpiFlashAddresses(this.getChipFamily()); + const AddrMAC = FlAddr.macFuse; + for (let i = 0; i < 4; i++) { + this._efuses[i] = await this.readRegister(AddrMAC + 4 * i); + } + const revisionInfo = this.chipRevision !== null && this.chipRevision !== undefined + ? ` (revision ${this.chipRevision})` + : ""; + this.logger.log(`Connected to ${this.chipName}${revisionInfo}`); + this.logger.debug(`Bootloader flash offset: 0x${FlAddr.flashOffs.toString(16)}`); + // Mark initialization as successful + this._initializationSucceeded = true; + } + /** + * Detect chip type using GET_SECURITY_INFO (for newer chips) or magic value (for older chips) + */ + async detectChip() { + try { + // Try GET_SECURITY_INFO command first (ESP32-C3 and later) + const securityInfo = await this.getSecurityInfo(); + const chipId = securityInfo.chipId; + const chipInfo = CHIP_ID_TO_INFO[chipId]; + if (chipInfo) { + this.chipName = chipInfo.name; + this.chipFamily = chipInfo.family; + this.chipRevision = await this.getChipRevision(); + this.logger.debug(`${this.chipName} revision: ${this.chipRevision}`); + if (this.chipFamily === CHIP_FAMILY_ESP32P4 && + this.chipRevision >= 300) { + this.chipVariant = "rev300"; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32P4) { + this.chipVariant = "rev0"; + } + this.logger.debug(`Detected chip via IMAGE_CHIP_ID: ${chipId} (${this.chipName})`); + return; + } + this.logger.debug(`Unknown IMAGE_CHIP_ID: ${chipId}, falling back to magic value detection`); + } + catch (error) { + // GET_SECURITY_INFO not supported, fall back to magic value detection + this.logger.debug(`GET_SECURITY_INFO failed, using magic value detection: ${error}`); + // Drain input buffer for CP210x compatibility on Windows + // This ensures all error responses are cleared before continuing + await this.drainInputBuffer(200); + // Clear input buffer and re-sync to recover from failed command + this._clearInputBuffer(); + await sleep(SYNC_TIMEOUT); + // Re-sync with the chip to ensure clean communication + try { + await this.sync(); + } + catch (syncErr) { + this.logger.debug(`Re-sync after GET_SECURITY_INFO failure: ${syncErr}`); + } + } + // Fallback: Use magic value detection for ESP8266, ESP32, ESP32-S2 + const chipMagicValue = await this.readRegister(CHIP_DETECT_MAGIC_REG_ADDR); + const chip = CHIP_DETECT_MAGIC_VALUES[chipMagicValue >>> 0]; + if (chip === undefined) { + throw new Error(`Unknown Chip: Hex: ${toHex(chipMagicValue >>> 0, 8).toLowerCase()} Number: ${chipMagicValue}`); + } + this.chipName = chip.name; + this.chipFamily = chip.family; + this.chipRevision = await this.getChipRevision(); + this.logger.debug(`${this.chipName} revision: ${this.chipRevision}`); + if (this.chipFamily === CHIP_FAMILY_ESP32P4) { + this.chipVariant = this.chipRevision >= 300 ? "rev300" : "rev0"; + this.logger.debug(`ESP32-P4 variant: ${this.chipVariant}`); + } + this.logger.debug(`Detected chip via magic value: ${toHex(chipMagicValue >>> 0, 8)} (${this.chipName})`); + } + async getChipRevision() { + var _a; + let minor = 0; + let major = 0; + switch (this.chipFamily) { + case CHIP_FAMILY_ESP32: { + const efuse3 = await this.readRegister(ESP32_BASEFUSEADDR + 4 * 3); + const efuse5 = await this.readRegister(ESP32_BASEFUSEADDR + 4 * 5); + minor = (efuse5 >> 24) & 0x3; + const revBit0 = (efuse3 >> 15) & 0x1; + const revBit1 = (efuse5 >> 20) & 0x1; + const apb = await this.readRegister(ESP32_APB_CTL_DATE_ADDR); + const revBit2 = (apb >> 31) & 0x1; + const combined = (revBit2 << 2) | (revBit1 << 1) | revBit0; + major = + (_a = { 0: 0, 1: 1, 3: 2, 7: 3 }[combined]) !== null && _a !== void 0 ? _a : 0; + break; + } + case CHIP_FAMILY_ESP32S2: { + const w3 = await this.readRegister(ESP32S2_EFUSE_BLOCK1_ADDR + 4 * 3); + const w4 = await this.readRegister(ESP32S2_EFUSE_BLOCK1_ADDR + 4 * 4); + const hi = (w3 >> 20) & 0x01; + const lo = (w4 >> 4) & 0x07; + minor = (hi << 3) + lo; + major = (w3 >> 18) & 0x03; + break; + } + case CHIP_FAMILY_ESP32S3: { + const w3 = await this.readRegister(ESP32S3_EFUSE_BLOCK1_ADDR + 4 * 3); + const w5 = await this.readRegister(ESP32S3_EFUSE_BLOCK1_ADDR + 4 * 5); + const hi = (w5 >> 23) & 0x01; + const lo = (w3 >> 18) & 0x07; + minor = (hi << 3) + lo; + major = (w5 >> 24) & 0x03; + break; + } + case CHIP_FAMILY_ESP32C2: { + const w1 = await this.readRegister(ESP32C2_EFUSE_BLOCK2_ADDR + 4 * 1); + minor = (w1 >> 16) & 0x0f; + major = (w1 >> 20) & 0x03; + break; + } + case CHIP_FAMILY_ESP32C3: { + const w3 = await this.readRegister(ESP32C3_EFUSE_RD_MAC_SPI_SYS_3_REG); + const w5 = await this.readRegister(ESP32C3_EFUSE_RD_MAC_SPI_SYS_5_REG); + const hi = (w5 >> 23) & 0x01; + const lo = (w3 >> 18) & 0x07; + minor = (hi << 3) + lo; + major = (w5 >> 24) & 0x03; + break; + } + case CHIP_FAMILY_ESP32C5: { + const w2 = await this.readRegister(ESP32C5_EFUSE_BLOCK1_ADDR + 4 * 2); + minor = w2 & 0x0f; + major = (w2 >> 4) & 0x03; + break; + } + case CHIP_FAMILY_ESP32C6: { + const w3 = await this.readRegister(ESP32C6_EFUSE_BLOCK1_ADDR + 4 * 3); + minor = (w3 >> 18) & 0x0f; + major = (w3 >> 22) & 0x03; + break; + } + case CHIP_FAMILY_ESP32C61: { + const w2 = await this.readRegister(ESP32C61_EFUSE_BLOCK1_ADDR + 4 * 2); + minor = w2 & 0x0f; + major = (w2 >> 4) & 0x03; + break; + } + case CHIP_FAMILY_ESP32H2: { + const w3 = await this.readRegister(ESP32H2_EFUSE_BLOCK1_ADDR + 4 * 3); + minor = (w3 >> 18) & 0x07; + major = (w3 >> 21) & 0x03; + break; + } + case CHIP_FAMILY_ESP32H4: { + const w3 = await this.readRegister(ESP32H4_EFUSE_BLOCK1_ADDR + 4 * 3); + minor = (w3 >> 18) & 0x0f; + major = (w3 >> 22) & 0x03; + break; + } + case CHIP_FAMILY_ESP32H21: { + break; + } + case CHIP_FAMILY_ESP32P4: { + const w2 = await this.readRegister(ESP32P4_EFUSE_BLOCK1_ADDR + 4 * 2); + minor = w2 & 0x0f; + major = (((w2 >> 23) & 1) << 2) | ((w2 >> 4) & 0x03); + break; + } + case CHIP_FAMILY_ESP32S31: { + const w2 = await this.readRegister(ESP32S31_EFUSE_BLOCK1_ADDR + 4 * 2); + minor = w2 & 0x0f; + major = (w2 >> 4) & 0x03; + break; + } + } + return major * 100 + minor; + } + /** + * Power on the flash chip for ESP32-P4 Rev 3.1 (301) & Rev 3.2 (302). + * The flash chip is powered off by default on P4 Rev 3.1 (301) & Rev 3.2 (302) + * when the default flash voltage changed from 1.8V to 3.3V. + * This is to prevent damage to 1.8V flash chips. + */ + async powerOnFlash() { + if (this.chipFamily !== CHIP_FAMILY_ESP32P4) { + return; // Only needed for ESP32-P4 + } + const revision = this.chipRevision; + // Only Rev 3.1 (301) and Rev 3.2 (302) need the flash power handling below. + // All other revisions return immediately. + if (!revision || (revision !== 301 && revision !== 302)) { + return; + } + // Rev 3.2 (302) may already have flash XPD asserted by ROM in download mode. + // When that efuse bit is set, clear the PMU force-on state and skip the + // Rev 3.1-style full power-on sequence. + if (revision && revision === 302) { + const efuseValue = await this.readRegister(ESP32P4_EFUSE_RD_REPEAT_DATA1_REG); + if (efuseValue & ESP32P4_EFUSE_DOWNLOAD_MODE_XPD_ON_MASK) { + await this.writeRegister(ESP32P4_PMU_DATE_REG, 0); + return; + } + } + // Power up pad group + await this.writeRegister(ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG, 1); + await sleep(10); // 0.01 seconds + // Flash power up sequence + const pmuAnaReg = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG); + await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, pmuAnaReg | ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0); + const pmuReg = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG); + await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg | ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0); + const pmuDateReg = await this.readRegister(ESP32P4_PMU_DATE_REG); + await this.writeRegister(ESP32P4_PMU_DATE_REG, pmuDateReg | (3 << 0)); + await sleep(0.05); // 0.00005 seconds = 0.05 ms + const pmuAnaReg2 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG); + await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, pmuAnaReg2 & ~ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0); + const pmuReg2 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG); + await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg2 & -2139095041); + // Update eFuse voltage to PMU + const pmuReg3 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG); + await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg3 | 0x80); + const pmuReg4 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG); + await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg4 & ~ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0); + await sleep(2); // 0.0018 seconds = 1.8 ms, rounded to 2ms + this.logger.debug("Flash powered on successfully"); + } + /** + * Get security info including chip ID (ESP32-C3 and later) + */ + async getSecurityInfo() { + const [, responseData] = await this.checkCommand(ESP_GET_SECURITY_INFO, [], 0); + // Some chips/ROM versions return empty response or don't support this command + if (responseData.length === 0) { + throw new Error(`GET_SECURITY_INFO not supported or returned empty response`); + } + if (responseData.length < 12) { + throw new Error(`Invalid security info response length: ${responseData.length} (expected at least 12 bytes)`); + } + const flags = unpack("= 16 + ? unpack("= 20 + ? unpack(" b.toString(16).padStart(2, "0").toUpperCase()) + .join(":"); + } + /** + * @name readLoop + * Reads data from the input stream and places it in the inputBuffer + */ + async readLoop() { + if (this.debug) { + this.logger.debug("Starting read loop"); + } + this._reader = this.port.readable.getReader(); + try { + let keepReading = true; + while (keepReading) { + const { value, done } = await this._reader.read(); + if (done) { + this._reader.releaseLock(); + keepReading = false; + break; + } + if (!value || value.length === 0) { + continue; + } + // Always read from browser's serial buffer immediately + // to prevent browser buffer overflow. Don't apply back-pressure here. + const chunk = Array.from(value); + Array.prototype.push.apply(this._inputBuffer, chunk); + // Track total bytes read from serial port + this._totalBytesRead += value.length; + } + } + catch { + // this.logger.error("Read loop got disconnected"); + } + finally { + // Always reset reconfiguring flag when read loop ends + // This prevents "Cannot write during port reconfiguration" errors + // when the read loop dies unexpectedly + this._isReconfiguring = false; + // Release reader if still locked + if (this._reader) { + try { + this._reader.releaseLock(); + this.logger.debug("Reader released in readLoop cleanup"); + } + catch (err) { + this.logger.debug(`Reader release error in readLoop: ${err}`); + } + this._reader = undefined; + } + } + // Disconnected! + this.connected = false; + // Check if this is ESP32-S2 Native USB that needs port reselection + // Only trigger reconnect if initialization did NOT succeed (wrong port) + if (this._isESP32S2NativeUSB && !this._initializationSucceeded) { + this.logger.log("ESP32-S2 Native USB detected - requesting port reselection"); + this.dispatchEvent(new CustomEvent("esp32s2-usb-reconnect", { + detail: { message: "ESP32-S2 Native USB requires port reselection" }, + })); + } + // Only dispatch disconnect event if not suppressed + if (!this._suppressDisconnect) { + this.dispatchEvent(new Event("disconnect")); + } + this._suppressDisconnect = false; + this.logger.debug("Finished read loop"); + } + // ============================================================================ + // Web Serial (Desktop) - DTR/RTS Signal Handling & Reset Strategies + // ============================================================================ + async setRTS(state) { + await this.port.setSignals({ requestToSend: state }); + // Work-around for adapters on Windows using the usbser.sys driver: + // generate a dummy change to DTR so that the set-control-line-state + // request is sent with the updated RTS state and the same DTR state + // Referenced to esptool.py + await this.setDTR(this.state_DTR); + } + async setDTR(state) { + this.state_DTR = state; + await this.port.setSignals({ dataTerminalReady: state }); + } + async setDTRandRTS(dtr, rts) { + this.state_DTR = dtr; + this.state_RTS = rts; + await this.port.setSignals({ + dataTerminalReady: dtr, + requestToSend: rts, + }); + } + async runSignalSequence(steps) { + const webusb = this.port.isWebUSB === true; + for (const step of steps) { + if (step.dtr !== undefined && step.rts !== undefined) { + if (webusb) { + await this.setDTRandRTSWebUSB(step.dtr, step.rts); + } + else { + await this.setDTRandRTS(step.dtr, step.rts); + } + } + else { + if (step.dtr !== undefined) { + if (webusb) { + await this.setDTRWebUSB(step.dtr); + } + else { + await this.setDTR(step.dtr); + } + } + if (step.rts !== undefined) { + if (webusb) { + await this.setRTSWebUSB(step.rts); + } + else { + await this.setRTS(step.rts); + } + } + } + if (step.delayMs) + await sleep(step.delayMs); + } + } + /** + * @name hardResetUSBJTAGSerial + * USB-JTAG/Serial reset for Web Serial (Desktop) + */ + async hardResetUSBJTAGSerial() { + await this.runSignalSequence([ + { rts: false }, + { dtr: false, delayMs: 100 }, + { dtr: true, rts: false, delayMs: 100 }, + { rts: true }, + { dtr: false, rts: true, delayMs: 100 }, + { dtr: false, rts: false, delayMs: 200 }, + ]); + } + /** + * @name hardResetClassic + * Classic reset for Web Serial (Desktop) DTR = IO0, RTS = EN + */ + async hardResetClassic() { + await this.runSignalSequence([ + { dtr: false, rts: true, delayMs: 100 }, + { dtr: true, rts: false, delayMs: 50 }, + { dtr: false, delayMs: 200 }, + ]); + } + /** + * Reset to firmware mode (not bootloader) for Web Serial + * Keeps IO0=HIGH during reset so chip boots into firmware + */ + async hardResetToFirmware() { + await this.runSignalSequence([ + { dtr: false, rts: true, delayMs: 100 }, + { rts: false, delayMs: 50 }, + { delayMs: 200 }, + ]); + } + /** + * @name hardResetUnixTight + * Unix Tight reset for Web Serial (Desktop) - sets DTR and RTS simultaneously + */ + async hardResetUnixTight() { + await this.runSignalSequence([ + { dtr: true, rts: true }, + { dtr: false, rts: false }, + { dtr: false, rts: true, delayMs: 100 }, + { dtr: true, rts: false, delayMs: 50 }, + { dtr: false, rts: false }, + { dtr: false, delayMs: 200 }, + ]); + } + // ============================================================================ + // WebUSB (Android) - DTR/RTS Signal Handling & Reset Strategies + // ============================================================================ + async setRTSWebUSB(state) { + this.state_RTS = state; + // Always specify both signals to avoid flipping the other line + // The WebUSB setSignals() now preserves unspecified signals, but being explicit is safer + await this.port.setSignals({ + requestToSend: state, + dataTerminalReady: this.state_DTR, + }); + } + async setDTRWebUSB(state) { + this.state_DTR = state; + // Always specify both signals to avoid flipping the other line + await this.port.setSignals({ + dataTerminalReady: state, + requestToSend: this.state_RTS, // Explicitly preserve current RTS state + }); + } + async setDTRandRTSWebUSB(dtr, rts) { + this.state_DTR = dtr; + this.state_RTS = rts; + await this.port.setSignals({ + dataTerminalReady: dtr, + requestToSend: rts, + }); + } + /** + * @name hardResetUSBJTAGSerialInvertedDTRWebUSB + * USB-JTAG/Serial reset with inverted DTR for WebUSB (Android) + */ + async hardResetUSBJTAGSerialInvertedDTRWebUSB() { + await this.runSignalSequence([ + { rts: false, dtr: true, delayMs: 100 }, + { dtr: false, rts: false, delayMs: 100 }, + { rts: true, dtr: true, delayMs: 100 }, + { dtr: true, rts: false, delayMs: 200 }, + ]); + } + /** + * @name hardResetClassicLongDelayWebUSB + * Classic reset with longer delays for WebUSB (Android) + * Specifically for CP2102/CH340 which may need more time + */ + async hardResetClassicLongDelayWebUSB() { + await this.runSignalSequence([ + { dtr: false, rts: true, delayMs: 500 }, + { dtr: true, rts: false, delayMs: 200 }, + { dtr: false, delayMs: 500 }, + ]); + } + /** + * @name hardResetClassicShortDelayWebUSB + * Classic reset with shorter delays for WebUSB (Android) + */ + async hardResetClassicShortDelayWebUSB() { + await this.runSignalSequence([ + { dtr: false, rts: true, delayMs: 50 }, + { dtr: true, rts: false, delayMs: 25 }, + { dtr: false, delayMs: 100 }, + ]); + } + /** + * @name hardResetInvertedWebUSB + * Inverted reset sequence for WebUSB (Android) - both signals inverted + */ + async hardResetInvertedWebUSB() { + await this.runSignalSequence([ + { dtr: true, rts: false, delayMs: 100 }, + { dtr: false, rts: true, delayMs: 50 }, + { dtr: true, delayMs: 200 }, + ]); + } + /** + * @name hardResetInvertedDTRWebUSB + * Only DTR inverted for WebUSB (Android) + */ + async hardResetInvertedDTRWebUSB() { + await this.runSignalSequence([ + { dtr: true, rts: true, delayMs: 100 }, + { dtr: false, rts: false, delayMs: 50 }, + { dtr: true, delayMs: 200 }, + ]); + } + /** + * @name hardResetInvertedRTSWebUSB + * Only RTS inverted for WebUSB (Android) + */ + async hardResetInvertedRTSWebUSB() { + await this.runSignalSequence([ + { dtr: false, rts: false, delayMs: 100 }, + { dtr: true, rts: true, delayMs: 50 }, + { dtr: false, delayMs: 200 }, + ]); + } + /** + * Check if we're using WebUSB (Android) or Web Serial (Desktop) + */ + isWebUSB() { + // WebUSBSerial class has isWebUSB flag - this is the most reliable check + return this.port.isWebUSB === true; + } + /** + * @name connectWithResetStrategies + * Try different reset strategies to enter bootloader mode + * Similar to esptool.py's connect() method with multiple reset strategies + */ + async connectWithResetStrategies() { + const portInfo = this.port.getInfo(); + const isUSBJTAGSerial = portInfo.usbProductId === USB_JTAG_SERIAL_PID; + const isEspressifUSB = portInfo.usbVendorId === 0x303a; + // this.logger.log( + // `Detected USB: VID=0x${portInfo.usbVendorId?.toString(16) || "unknown"}, PID=0x${portInfo.usbProductId?.toString(16) || "unknown"}`, + // ); + // Define reset strategies to try in order + const resetStrategies = []; + // eslint-disable-next-line @typescript-eslint/no-this-alias + const self = this; + // Detect if this is a USB-Serial chip (needs different sync approach) + const isUSBSerialChip = !isUSBJTAGSerial && !isEspressifUSB; + // WebUSB (Android) uses different reset methods than Web Serial (Desktop) + if (this.isWebUSB()) { + // For USB-Serial chips (CP2102, CH340, etc.), try inverted strategies first + // Detect specific chip types once + const isCP2102 = portInfo.usbVendorId === 0x10c4; + const isCH34x = portInfo.usbVendorId === 0x1a86; + // Check for ESP32-S2 Native USB (VID: 0x303a, PID: 0x0002) + const isESP32S2NativeUSB = portInfo.usbVendorId === 0x303a && portInfo.usbProductId === 0x0002; + // WebUSB Strategy 1: USB-JTAG/Serial reset (for Native USB only) + if (isUSBJTAGSerial || isEspressifUSB) { + if (isESP32S2NativeUSB) { + // ESP32-S2 Native USB: Try multiple strategies + // The device might be in JTAG mode OR CDC mode + // Strategy 1: USB-JTAG/Serial (works in CDC mode on Desktop) + resetStrategies.push({ + name: "USB-JTAG/Serial (WebUSB) - ESP32-S2", + fn: async () => { + return await self.hardResetUSBJTAGSerial(); + }, + }); + // Strategy 2: USB-JTAG/Serial Inverted DTR (works in JTAG mode) + resetStrategies.push({ + name: "USB-JTAG/Serial Inverted DTR (WebUSB) - ESP32-S2", + fn: async () => { + return await self.hardResetUSBJTAGSerialInvertedDTRWebUSB(); + }, + }); + // Strategy 3: UnixTight (CDC fallback) + resetStrategies.push({ + name: "UnixTight (WebUSB) - ESP32-S2 CDC", + fn: async () => { + return await self.hardResetUnixTight(); + }, + }); + // Strategy 4: Classic reset (CDC fallback) + resetStrategies.push({ + name: "Classic (WebUSB) - ESP32-S2 CDC", + fn: async () => { + return await self.hardResetClassic(); + }, + }); + } + else { + // Other USB-JTAG chips: Try Inverted DTR first - works best for ESP32-H2 and other JTAG chips + resetStrategies.push({ + name: "USB-JTAG/Serial Inverted DTR (WebUSB)", + fn: async () => { + return await self.hardResetUSBJTAGSerialInvertedDTRWebUSB(); + }, + }); + resetStrategies.push({ + name: "USB-JTAG/Serial (WebUSB)", + fn: async () => { + return await self.hardResetUSBJTAGSerial(); + }, + }); + resetStrategies.push({ + name: "Inverted DTR Classic (WebUSB)", + fn: async () => { + return await self.hardResetInvertedDTRWebUSB(); + }, + }); + } + } + // For USB-Serial chips, try inverted strategies first + if (isUSBSerialChip) { + if (isCH34x) { + // CH340/CH343: UnixTight works best (like CP2102) + resetStrategies.push({ + name: "UnixTight (WebUSB) - CH34x", + fn: async () => { + return await self.hardResetUnixTight(); + }, + }); + resetStrategies.push({ + name: "Classic (WebUSB) - CH34x", + fn: async () => { + return await self.hardResetClassic(); + }, + }); + resetStrategies.push({ + name: "Inverted Both (WebUSB) - CH34x", + fn: async () => { + return await self.hardResetInvertedWebUSB(); + }, + }); + resetStrategies.push({ + name: "Inverted RTS (WebUSB) - CH34x", + fn: async () => { + return await self.hardResetInvertedRTSWebUSB(); + }, + }); + resetStrategies.push({ + name: "Inverted DTR (WebUSB) - CH34x", + fn: async () => { + return await self.hardResetInvertedDTRWebUSB(); + }, + }); + } + else if (isCP2102) { + // CP2102: UnixTight works best (tested and confirmed) + // Try it first, then fallback to other strategies + resetStrategies.push({ + name: "UnixTight (WebUSB) - CP2102", + fn: async () => { + return await self.hardResetUnixTight(); + }, + }); + resetStrategies.push({ + name: "Classic (WebUSB) - CP2102", + fn: async () => { + return await self.hardResetClassic(); + }, + }); + resetStrategies.push({ + name: "Inverted Both (WebUSB) - CP2102", + fn: async () => { + return await self.hardResetInvertedWebUSB(); + }, + }); + resetStrategies.push({ + name: "Inverted RTS (WebUSB) - CP2102", + fn: async () => { + return await self.hardResetInvertedRTSWebUSB(); + }, + }); + resetStrategies.push({ + name: "Inverted DTR (WebUSB) - CP2102", + fn: async () => { + return await self.hardResetInvertedDTRWebUSB(); + }, + }); + } + else { + // For other USB-Serial chips, try UnixTight first, then multiple strategies + resetStrategies.push({ + name: "UnixTight (WebUSB)", + fn: async () => { + return await self.hardResetUnixTight(); + }, + }); + resetStrategies.push({ + name: "Classic (WebUSB)", + fn: async function () { + return await self.hardResetClassic(); + }, + }); + resetStrategies.push({ + name: "Inverted Both (WebUSB)", + fn: async function () { + return await self.hardResetInvertedWebUSB(); + }, + }); + resetStrategies.push({ + name: "Inverted RTS (WebUSB)", + fn: async function () { + return await self.hardResetInvertedRTSWebUSB(); + }, + }); + resetStrategies.push({ + name: "Inverted DTR (WebUSB)", + fn: async function () { + return await self.hardResetInvertedDTRWebUSB(); + }, + }); + } + } + // Add general fallback strategies only for Native USB chips (not USB-Serial) + // and only for chips not already handled by specific blocks above + if (!isUSBSerialChip && + !isCP2102 && + !isESP32S2NativeUSB && + !isUSBJTAGSerial) { + // Classic reset (for chips not handled above) + if (portInfo.usbVendorId !== 0x1a86) { + resetStrategies.push({ + name: "Classic (WebUSB)", + fn: async function () { + return await self.hardResetClassic(); + }, + }); + } + // UnixTight reset (sets DTR/RTS simultaneously) + resetStrategies.push({ + name: "UnixTight (WebUSB)", + fn: async function () { + return await self.hardResetUnixTight(); + }, + }); + // WebUSB Strategy: Classic with long delays + resetStrategies.push({ + name: "Classic Long Delay (WebUSB)", + fn: async function () { + return await self.hardResetClassicLongDelayWebUSB(); + }, + }); + // WebUSB Strategy: Classic with short delays + resetStrategies.push({ + name: "Classic Short Delay (WebUSB)", + fn: async function () { + return await self.hardResetClassicShortDelayWebUSB(); + }, + }); + // WebUSB Strategy: USB-JTAG/Serial fallback + if (!isEspressifUSB) { + resetStrategies.push({ + name: "USB-JTAG/Serial fallback (WebUSB)", + fn: async function () { + return await self.hardResetUSBJTAGSerial(); + }, + }); + } + } + } + else { + // Strategy: USB-JTAG/Serial reset + if (isUSBJTAGSerial || isEspressifUSB) { + resetStrategies.push({ + name: "USB-JTAG/Serial", + fn: async function () { + return await self.hardResetUSBJTAGSerial(); + }, + }); + } + // Strategy: UnixTight reset + resetStrategies.push({ + name: "UnixTight", + fn: async function () { + return await self.hardResetUnixTight(); + }, + }); + // Strategy: USB-JTAG/Serial fallback + if (!isUSBJTAGSerial && !isEspressifUSB) { + resetStrategies.push({ + name: "USB-JTAG/Serial (fallback)", + fn: async function () { + return await self.hardResetUSBJTAGSerial(); + }, + }); + } + } + let lastError = null; + // Try each reset strategy with timeout + for (const strategy of resetStrategies) { + try { + // Check if port is still open, if not, skip this strategy + if (!this.connected || !this.port.writable) { + this.logger.debug(`Port disconnected, skipping ${strategy.name} reset`); + continue; + } + // Clear abandon flag before starting new strategy + this._abandonCurrentOperation = false; + await strategy.fn(); + // Try to sync after reset + // USB-Serial / native USB chips needs different sync approaches + if (isUSBSerialChip) { + // USB-Serial chips: Use timeout strategy (2 seconds) + // this.logger.log(`USB-Serial chip detected, using sync with timeout.`); + const syncSuccess = await this.syncWithTimeout(2000); + if (syncSuccess) { + // Sync succeeded + this.logger.log(`Connected USB Serial successfully with ${strategy.name} reset.`); + return; + } + else { + throw new Error("Sync timeout or abandoned"); + } + } + else { + // Native USB chips + // Note: We use Promise.race with sync() directly instead of syncWithTimeout() + // because syncWithTimeout causes CDC/JTAG devices to hang for unknown reasons. + // The abandon flag in readPacket() prevents overlapping I/O. + // this.logger.log(`Native USB chip detected, using CDC/JTAG sync.`); + const syncPromise = this.sync(); + const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Sync timeout")), 1000)); + try { + await Promise.race([syncPromise, timeoutPromise]); + // Sync succeeded + this.logger.debug(`Connected CDC/JTAG successfully with ${strategy.name} reset.`); + return; + } + catch (_error) { + throw new Error("Sync timeout or abandoned"); + } + } + } + catch (error) { + lastError = error; + // this.logger.debug( + // `${strategy.name} reset failed: ${(error as Error).message}`, + // ); + // Set abandon flag to stop any in-flight operations + this._abandonCurrentOperation = true; + // Wait a bit for in-flight operations to abort + await sleep(100); + // If port got disconnected, we can't try more strategies + if (!this.connected || !this.port.writable) { + this.logger.log(`Port disconnected during reset attempt`); + break; + } + // Clear buffers before trying next strategy + this._clearInputBuffer(); + await this.drainInputBuffer(200); + await this.flushSerialBuffers(); + } + } + // All strategies failed - reset abandon flag before throwing + this._abandonCurrentOperation = false; + throw new Error(`Couldn't sync to ESP. Try resetting manually. Last error: ${lastError === null || lastError === void 0 ? void 0 : lastError.message}`); + } + /** + * @name watchdogReset + * Watchdog reset for ESP32-S2/S3/C3 with USB-OTG or USB-JTAG/Serial + * Uses RTC watchdog timer to reset the chip - works when DTR/RTS signals are not available + * This is an alias for rtcWdtResetChipSpecific() for backwards compatibility + */ + async watchdogReset() { + await this.rtcWdtResetChipSpecific(); + } + /** + * RTC watchdog timer reset for ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, and ESP32-P4 + * Uses specific registers for each chip family + * Note: ESP32-H2 does NOT support WDT reset + */ + async rtcWdtResetChipSpecific() { + this.logger.debug("Hard resetting with watchdog timer..."); + let WDTWPROTECT_REG; + let WDTCONFIG0_REG; + let WDTCONFIG1_REG; + let WDT_WKEY; + if (this.chipFamily === CHIP_FAMILY_ESP32S2) { + WDTWPROTECT_REG = ESP32S2_RTC_CNTL_WDTWPROTECT_REG; + WDTCONFIG0_REG = ESP32S2_RTC_CNTL_WDTCONFIG0_REG; + WDTCONFIG1_REG = ESP32S2_RTC_CNTL_WDTCONFIG1_REG; + WDT_WKEY = ESP32S2_RTC_CNTL_WDT_WKEY; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32S3) { + WDTWPROTECT_REG = ESP32S3_RTC_CNTL_WDTWPROTECT_REG; + WDTCONFIG0_REG = ESP32S3_RTC_CNTL_WDTCONFIG0_REG; + WDTCONFIG1_REG = ESP32S3_RTC_CNTL_WDTCONFIG1_REG; + WDT_WKEY = ESP32S3_RTC_CNTL_WDT_WKEY; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32C3) { + WDTWPROTECT_REG = ESP32C3_RTC_CNTL_WDTWPROTECT_REG; + WDTCONFIG0_REG = ESP32C3_RTC_CNTL_WDTCONFIG0_REG; + WDTCONFIG1_REG = ESP32C3_RTC_CNTL_WDTCONFIG1_REG; + WDT_WKEY = ESP32C3_RTC_CNTL_WDT_WKEY; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32C5 || + this.chipFamily === CHIP_FAMILY_ESP32C6) { + // C5 and C6 use LP_WDT (Low Power Watchdog Timer) + WDTWPROTECT_REG = ESP32C5_C6_RTC_CNTL_WDTWPROTECT_REG; + WDTCONFIG0_REG = ESP32C5_C6_RTC_CNTL_WDTCONFIG0_REG; + WDTCONFIG1_REG = ESP32C5_C6_RTC_CNTL_WDTCONFIG1_REG; + WDT_WKEY = ESP32C5_C6_RTC_CNTL_WDT_WKEY; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32P4) { + // P4 uses LP_WDT (Low Power Watchdog Timer) + WDTWPROTECT_REG = ESP32P4_RTC_CNTL_WDTWPROTECT_REG; + WDTCONFIG0_REG = ESP32P4_RTC_CNTL_WDTCONFIG0_REG; + WDTCONFIG1_REG = ESP32P4_RTC_CNTL_WDTCONFIG1_REG; + WDT_WKEY = ESP32P4_RTC_CNTL_WDT_WKEY; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32S31) { + // S31 uses LP_WDT (Low Power Watchdog Timer) + WDTWPROTECT_REG = ESP32S31_RTC_CNTL_WDTWPROTECT_REG; + WDTCONFIG0_REG = ESP32S31_RTC_CNTL_WDTCONFIG0_REG; + WDTCONFIG1_REG = ESP32S31_RTC_CNTL_WDTCONFIG1_REG; + WDT_WKEY = ESP32S31_RTC_CNTL_WDT_WKEY; + } + else { + throw new Error(`rtcWdtResetChipSpecific() is not supported for ${this.chipFamily}`); + } + // Unlock watchdog registers + await this.writeRegister(WDTWPROTECT_REG, WDT_WKEY, undefined, 0); + // Set WDT timeout to 2000ms (matches Python esptool) + await this.writeRegister(WDTCONFIG1_REG, 2000, undefined, 0); + // Enable WDT: bit 31 = enable, bits 28-30 = stage, bit 8 = sys reset, bits 0-2 = prescaler + const wdtConfig = (1 << 31) | (5 << 28) | (1 << 8) | 2; + await this.writeRegister(WDTCONFIG0_REG, wdtConfig, undefined, 0); + // Lock watchdog registers + await this.writeRegister(WDTWPROTECT_REG, 0, undefined, 0); + // Wait for reset to take effect + await sleep(500); + } + /** + * Reset device from bootloader mode to firmware mode + * Automatically selects the correct reset strategy based on USB connection type + * @param clearForceDownloadFlag - If true, clears the force download boot flag (USB-OTG only) + * @returns true if port will change (USB-OTG), false otherwise + */ + async resetToFirmwareMode(clearForceDownloadFlag = true) { + this.logger.debug("Resetting from bootloader to firmware mode..."); + try { + // Detect USB connection type + const isUsbJtagOrOtg = await this.detectUsbConnectionType(); + if (isUsbJtagOrOtg) { + // USB-JTAG/OTG devices need special handling + this.logger.debug("USB-JTAG/OTG detected - checking WDT reset support"); + // Get detailed USB mode information + let usbMode; + try { + usbMode = await this.getUsbMode(); + this.logger.debug(`USB mode: ${usbMode.mode} (uartNo=${usbMode.uartNo})`); + } + catch (err) { + this.logger.debug(`Could not get USB mode: ${err}`); + // Fall back to generic USB-JTAG/OTG handling + usbMode = { mode: "usb-jtag-serial", uartNo: 0 }; + } + // Check if chip supports WDT reset + // WDT reset is not needed for ESP32-C3 + // WDT reset is supported by: ESP32-S2, ESP32-S3, ESP32-P4, ESP32-S31 + // WDT reset is NOT supported by: ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 + const supportsWdtReset = this.chipFamily === CHIP_FAMILY_ESP32S2 || + this.chipFamily === CHIP_FAMILY_ESP32S3 || + this.chipFamily === CHIP_FAMILY_ESP32P4 || + this.chipFamily === CHIP_FAMILY_ESP32S31; + if (!supportsWdtReset) { + this.logger.debug(`${this.chipName} does not support WDT reset - using classic reset instead`); + // Use classic reset for chips without WDT support + await this.hardResetToFirmware(); + this.logger.debug("Classic reset to firmware complete"); + return false; // Port stays open + } + // WDT reset is supported - proceed with WDT reset logic + this.logger.debug(`${this.chipName} supports WDT reset - using WDT reset strategy`); + // CRITICAL: WDT register writes require ROM (not stub) and baudrate 115200 + // If on stub, need to return to ROM first + if (this.IS_STUB) { + this.logger.debug("On stub - returning to ROM before WDT reset"); + // Change baudrate back to ROM baudrate if needed + if (this.currentBaudRate !== ESP_ROM_BAUD) { + this.logger.debug(`Changing baudrate from ${this.currentBaudRate} to ${ESP_ROM_BAUD}`); + await this.reconfigurePort(ESP_ROM_BAUD); + this.currentBaudRate = ESP_ROM_BAUD; + this.logger.debug("Baudrate changed to 115200"); + } + // CRITICAL: Temporarily clear console mode flag so hardReset(true) works + const wasInConsoleMode = this._consoleMode; + this._consoleMode = false; + // Reset to bootloader (ROM) + await this.hardReset(true); + await sleep(200); + // Restore console mode flag + this._consoleMode = wasInConsoleMode; + // Sync with ROM + await this.sync(); + this.IS_STUB = false; + this.logger.debug("Now on ROM"); + } + else { + // Even if not on stub, ensure baudrate is 115200 for WDT register writes + if (this.currentBaudRate !== ESP_ROM_BAUD) { + this.logger.debug(`Not on stub, but baudrate is ${this.currentBaudRate} - changing to ${ESP_ROM_BAUD} for WDT reset`); + await this.reconfigurePort(ESP_ROM_BAUD); + this.currentBaudRate = ESP_ROM_BAUD; + this.logger.debug("Baudrate changed to 115200"); + } + } + // Clear force download boot flag if requested (USB-OTG only) + if (clearForceDownloadFlag && usbMode.mode === "usb-otg") { + const flagCleared = await this._clearForceDownloadBootIfNeeded(); + if (flagCleared) { + this.logger.debug("Force download boot flag cleared"); + } + } + // Perform WDT reset to boot into firmware + await this.rtcWdtResetChipSpecific(); + this.logger.debug("WDT reset performed - device will boot to firmware"); + // Check if port will change after WDT reset + // USB-OTG (ESP32-S2/P4): Port always changes + // USB-JTAG/Serial (ESP32-S3/C3/C5/C6/C61/H2/P4): Port may change depending on platform + const portWillChange = usbMode.mode === "usb-otg" || usbMode.mode === "usb-jtag-serial"; + if (portWillChange) { + this.logger.debug(`Port will change after WDT reset (${usbMode.mode}) - port reselection needed`); + return true; + } + return false; + } + else { + // External serial chip - use classic reset to firmware + this.logger.debug("External serial chip detected - using classic reset"); + await this.hardResetToFirmware(); + this.logger.debug("Classic reset to firmware complete"); + return false; + } + } + catch (err) { + this.logger.error(`Failed to reset to firmware mode: ${err}`); + throw err; + } + } + async hardReset(bootloader = false) { + // In console mode, only allow simple hardware reset (no bootloader entry) + if (this._consoleMode) { + if (bootloader) { + this.logger.debug("Skipping bootloader reset - device is in console mode"); + return; + } + // Simple hardware reset to restart firmware (IO0=HIGH) + this.logger.debug("Performing hardware reset (console mode)..."); + await this.resetInConsoleMode(); + this.logger.debug("Hardware reset complete"); + return; + } + if (bootloader) { + // Enter bootloader/flash mode + if (this.port.getInfo().usbProductId === USB_JTAG_SERIAL_PID) { + await this.hardResetUSBJTAGSerial(); + this.logger.debug("USB-JTAG/Serial reset to bootloader."); + } + else { + await this.hardResetClassic(); + this.logger.debug("Classic reset to bootloader."); + } + } + else { + // Reset to firmware mode (exit bootloader) + // Use intelligent reset strategy based on USB connection type + this.logger.debug("Resetting to firmware mode..."); + // Detect USB connection type to choose correct reset method + const isUsbJtagOrOtg = await this.detectUsbConnectionType(); + if (isUsbJtagOrOtg) { + // USB-JTAG/OTG devices: Use WDT reset + this.logger.debug("USB-JTAG/OTG detected - using WDT reset"); + // Get USB mode details + let usbMode; + try { + usbMode = await this.getUsbMode(); + this.logger.debug(`USB mode: ${usbMode.mode} (uartNo=${usbMode.uartNo})`); + } + catch (err) { + this.logger.debug(`Could not get USB mode: ${err}`); + usbMode = { mode: "usb-jtag-serial", uartNo: 0 }; + } + // Clear force download flag for USB-OTG devices + if (usbMode.mode === "usb-otg") { + try { + const flagCleared = await this._clearForceDownloadBootIfNeeded(); + if (flagCleared) { + this.logger.debug("Force download boot flag cleared"); + } + } + catch (err) { + this.logger.debug(`Could not clear force download flag: ${err}`); + } + } + // Perform WDT reset + await this.rtcWdtResetChipSpecific(); + this.logger.debug(`${this.chipName}: WDT reset to firmware complete`); + return; + } + else { + // External serial chip: Use classic reset + this.logger.debug("External serial chip detected - using classic reset"); + if (this.isWebUSB()) { + // WebUSB: Use longer delays for better compatibility + await this.setRTSWebUSB(true); // EN->LOW + await sleep(200); + await this.setRTSWebUSB(false); + await sleep(200); + this.logger.debug("Hard reset to firmware (WebUSB)."); + } + else { + // Web Serial: Standard reset + await this.setRTS(true); // EN->LOW + await sleep(100); + await this.setRTS(false); + this.logger.debug("Hard reset to firmware."); + } + } + } + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + /** + * @name macAddr + * The MAC address burned into the OTP memory of the ESP chip + */ + macAddr() { + const macAddr = new Array(6).fill(0); + const mac0 = this._efuses[0]; + const mac1 = this._efuses[1]; + const mac2 = this._efuses[2]; + const mac3 = this._efuses[3]; + let oui; + if (this.chipFamily == CHIP_FAMILY_ESP8266) { + if (mac3 != 0) { + oui = [(mac3 >> 16) & 0xff, (mac3 >> 8) & 0xff, mac3 & 0xff]; + } + else if (((mac1 >> 16) & 0xff) == 0) { + oui = [0x18, 0xfe, 0x34]; + } + else if (((mac1 >> 16) & 0xff) == 1) { + oui = [0xac, 0xd0, 0x74]; + } + else { + throw new Error("Couldnt determine OUI"); + } + macAddr[0] = oui[0]; + macAddr[1] = oui[1]; + macAddr[2] = oui[2]; + macAddr[3] = (mac1 >> 8) & 0xff; + macAddr[4] = mac1 & 0xff; + macAddr[5] = (mac0 >> 24) & 0xff; + } + else if (this.chipFamily == CHIP_FAMILY_ESP32) { + macAddr[0] = (mac2 >> 8) & 0xff; + macAddr[1] = mac2 & 0xff; + macAddr[2] = (mac1 >> 24) & 0xff; + macAddr[3] = (mac1 >> 16) & 0xff; + macAddr[4] = (mac1 >> 8) & 0xff; + macAddr[5] = mac1 & 0xff; + } + else if (this.chipFamily == CHIP_FAMILY_ESP32S2 || + this.chipFamily == CHIP_FAMILY_ESP32S3 || + this.chipFamily == CHIP_FAMILY_ESP32C2 || + this.chipFamily == CHIP_FAMILY_ESP32C3 || + this.chipFamily == CHIP_FAMILY_ESP32C5 || + this.chipFamily == CHIP_FAMILY_ESP32C6 || + this.chipFamily == CHIP_FAMILY_ESP32C61 || + this.chipFamily == CHIP_FAMILY_ESP32H2 || + this.chipFamily == CHIP_FAMILY_ESP32H4 || + this.chipFamily == CHIP_FAMILY_ESP32H21 || + this.chipFamily == CHIP_FAMILY_ESP32P4 || + this.chipFamily == CHIP_FAMILY_ESP32S31) { + macAddr[0] = (mac1 >> 8) & 0xff; + macAddr[1] = mac1 & 0xff; + macAddr[2] = (mac0 >> 24) & 0xff; + macAddr[3] = (mac0 >> 16) & 0xff; + macAddr[4] = (mac0 >> 8) & 0xff; + macAddr[5] = mac0 & 0xff; + } + else { + throw new Error("Unknown chip family"); + } + return macAddr; + } + async readRegister(reg) { + if (this.debug) { + this.logger.debug("Reading from Register " + toHex(reg, 8)); + } + const packet = pack(" { + timeout = Math.min(timeout, MAX_TIMEOUT); + await this.sendCommand(opcode, buffer, checksum); + const [value, responseData] = await this.getResponse(opcode, timeout); + if (responseData === null) { + throw new Error("Didn't get enough status bytes"); + } + let data = responseData; + let statusLen = 0; + if (this.IS_STUB || this.chipFamily == CHIP_FAMILY_ESP8266) { + statusLen = 2; + } + else if ([ + CHIP_FAMILY_ESP32, + CHIP_FAMILY_ESP32S2, + CHIP_FAMILY_ESP32S3, + CHIP_FAMILY_ESP32C2, + CHIP_FAMILY_ESP32C3, + CHIP_FAMILY_ESP32C5, + CHIP_FAMILY_ESP32C6, + CHIP_FAMILY_ESP32C61, + CHIP_FAMILY_ESP32H2, + CHIP_FAMILY_ESP32H4, + CHIP_FAMILY_ESP32H21, + CHIP_FAMILY_ESP32P4, + CHIP_FAMILY_ESP32S31, + ].includes(this.chipFamily)) { + statusLen = 4; + } + else { + // When chipFamily is not yet set (e.g., during GET_SECURITY_INFO in detectChip), + // assume modern chips use 4-byte status + if (opcode === ESP_GET_SECURITY_INFO) { + statusLen = 4; + } + else if ([2, 4].includes(data.length)) { + statusLen = data.length; + } + else { + // Default to 2-byte status if we can't determine + // This prevents silent data corruption when statusLen would be 0 + statusLen = 2; + this.logger.debug(`Unknown chip family, defaulting to 2-byte status (opcode: ${toHex(opcode)}, data.length: ${data.length})`); + } + } + if (data.length < statusLen) { + throw new Error("Didn't get enough status bytes"); + } + const status = data.slice(-statusLen, data.length); + data = data.slice(0, -statusLen); + if (this.debug) { + this.logger.debug("status", status); + this.logger.debug("value", value); + this.logger.debug("data", data); + } + if (status[0] == 1) { + if (status[1] == ROM_INVALID_RECV_MSG) { + // Unsupported command can result in more than one error response + // Use drainInputBuffer for CP210x compatibility on Windows + await this.drainInputBuffer(200); + throw new Error("Invalid (unsupported) command " + toHex(opcode)); + } + else { + throw new Error("Command failure error code " + toHex(status[1])); + } + } + return [value, data]; + }; + // Chain command execution through the lock + // Use both .then() handlers to ensure lock continues even on error + this._commandLock = this._commandLock.then(executeCommand, executeCommand); + return this._commandLock; + } + /** + * @name sendCommand + * Send a slip-encoded, checksummed command over the UART, + * does not check response + */ + async sendCommand(opcode, buffer, checksum = 0) { + const packet = slipEncode([ + ...pack(" 0) { + readBytes.push(this._readByte()); + break; + } + else { + // Reduced sleep time for faster response during high-speed transfers + await sleep(1); + } + } + if (readBytes.length == 0) { + const waitingFor = partialPacket === null ? "header" : "content"; + throw new SlipReadError("Timed out waiting for packet " + waitingFor); + } + if (this.debug) + this.logger.debug("Read " + readBytes.length + " bytes: " + hexFormatter(readBytes)); + for (const byte of readBytes) { + if (partialPacket === null) { + // waiting for packet header + if (byte == this.SLIP_END) { + partialPacket = []; + } + else { + if (this.debug) { + this.logger.debug("Read invalid data: " + toHex(byte)); + this.logger.debug("Remaining data in serial buffer: " + + hexFormatter(this._inputBuffer)); + } + throw new SlipReadError("Invalid head of packet (" + toHex(byte) + ")"); + } + } + else if (inEscape) { + // part-way through escape sequence + inEscape = false; + if (byte == this.SLIP_ESC_END) { + partialPacket.push(this.SLIP_END); + } + else if (byte == this.SLIP_ESC_ESC) { + partialPacket.push(this.SLIP_ESC); + } + else { + if (this.debug) { + this.logger.debug("Read invalid data: " + toHex(byte)); + this.logger.debug("Remaining data in serial buffer: " + + hexFormatter(this._inputBuffer)); + } + throw new SlipReadError("Invalid SLIP escape (0xdb, " + toHex(byte) + ")"); + } + } + else if (byte == this.SLIP_ESC) { + // start of escape sequence + inEscape = true; + } + else if (byte == this.SLIP_END) { + // end of packet + if (this.debug) + this.logger.debug("Received full packet: " + hexFormatter(partialPacket)); + // Compact buffer periodically to prevent memory growth + this._compactInputBuffer(); + return partialPacket; + } + else { + // normal byte in packet + partialPacket.push(byte); + } + } + } + } + /** + * @name getResponse + * Read response data and decodes the slip packet, then parses + * out the value/data and returns as a tuple of (value, data) where + * each is a list of bytes + */ + async getResponse(opcode, timeout = DEFAULT_TIMEOUT) { + for (let i = 0; i < 100; i++) { + const packet = await this.readPacket(timeout); + if (packet.length < 8) { + continue; + } + const [resp, opRet, , val] = unpack(">> ESP32C5_PCR_SYSCLK_XTAL_FREQ_S); + } + async getC5CrystalFreqDetected() { + const UART_CLKDIV_MASK = 0xfffff; + const uartDiv = (await this.readRegister(ESP32C5_UART_CLKDIV_REG)) & UART_CLKDIV_MASK; + const estXtal = (ESP_ROM_BAUD * uartDiv) / 1e6; + if (estXtal > 45) + return 48; + if (estXtal > 33) + return 40; + return 26; + } + async setBaudrate(baud) { + const chipFamily = this._parent ? this._parent.chipFamily : this.chipFamily; + if (!this.IS_STUB && chipFamily === CHIP_FAMILY_ESP32C5) { + await this.setBaudrateC5Rom(baud); + } + else { + try { + const buffer = pack(" maxBaud) { + this.logger.log(`⚠️ WARNING: Baudrate ${baud} exceeds USB-Serial chip limit (${maxBaud})!`); + this.logger.log(`⚠️ This may cause data corruption or connection failures!`); + } + this.logger.debug(`Changed baud rate to ${baud}`); + } + async setBaudrateC5Rom(baud) { + const crystalFreqRomExpect = await this.getC5CrystalFreqRomExpect(); + const crystalFreqDetect = await this.getC5CrystalFreqDetected(); + this.logger.log(`ROM expects crystal freq: ${crystalFreqRomExpect} MHz, detected ${crystalFreqDetect} MHz.`); + let baudRate = baud; + if (crystalFreqDetect === 48 && crystalFreqRomExpect === 40) { + baudRate = Math.trunc((baud * 40) / 48); + } + else if (crystalFreqDetect === 40 && crystalFreqRomExpect === 48) { + baudRate = Math.trunc((baud * 48) / 40); + } + this.logger.log(`Changing baud rate to ${baudRate}...`); + try { + const buffer = pack(" timeoutMs) { + return false; + } + // Check abandon flag + if (this._abandonCurrentOperation) { + return false; + } + this._clearInputBuffer(); + try { + const response = await this._sync(); + if (response) { + await sleep(SYNC_TIMEOUT); + return true; + } + // eslint-disable-next-line @typescript-eslint/no-unused-vars + } + catch (e) { + // Check abandon flag after error + if (this._abandonCurrentOperation) { + return false; + } + } + await sleep(SYNC_TIMEOUT); + } + return false; + } + /** + * @name sync + * Put into ROM bootload mode & attempt to synchronize with the + * ESP ROM bootloader, we will retry a few times + */ + async sync() { + for (let i = 0; i < 5; i++) { + this._clearInputBuffer(); + const response = await this._sync(); + if (response) { + await sleep(SYNC_TIMEOUT); + return true; + } + await sleep(SYNC_TIMEOUT); + } + throw new Error("Couldn't sync to ESP. Try resetting."); + } + /** + * @name _sync + * Perform a soft-sync using AT sync packets, does not perform + * any hardware resetting + */ + async _sync() { + await this.sendCommand(ESP_SYNC, SYNC_PACKET); + for (let i = 0; i < 8; i++) { + try { + const [, data] = await this.getResponse(ESP_SYNC, SYNC_TIMEOUT); + if (data.length > 1 && data[0] == 0 && data[1] == 0) { + return true; + } + } + catch (e) { + if (this.debug) { + this.logger.debug(`Sync attempt ${i + 1} failed: ${e}`); + } + } + } + return false; + } + /** + * @name getFlashWriteSize + * Get the Flash write size based on the chip + */ + getFlashWriteSize() { + if (this.IS_STUB) { + return STUB_FLASH_WRITE_SIZE; + } + return FLASH_WRITE_SIZE; + } + /** + * @name flashData + * Program a full, uncompressed binary file into SPI Flash at + * a given offset. If an ESP32 and md5 string is passed in, will also + * verify memory. ESP8266 does not have checksum memory verification in + * ROM + */ + async flashData(binaryData, updateProgress, offset = 0, compress = false) { + if (binaryData.byteLength >= 8) { + // unpack the (potential) image header + const header = Array.from(new Uint8Array(binaryData, 0, 4)); + const headerMagic = header[0]; + const headerFlashMode = header[2]; + const headerFlashSizeFreq = header[3]; + this.logger.log(`Image header, Magic=${toHex(headerMagic)}, FlashMode=${toHex(headerFlashMode)}, FlashSizeFreq=${toHex(headerFlashSizeFreq)}`); + } + const paddedData = padTo(new Uint8Array(binaryData), 4); + binaryData = paddedData.buffer; + const uncompressedFilesize = binaryData.byteLength; + let compressedFilesize = 0; + let dataToFlash; + let timeout = DEFAULT_TIMEOUT; + if (compress) { + dataToFlash = deflate_1(new Uint8Array(binaryData), { + level: 9, + }).buffer; + compressedFilesize = dataToFlash.byteLength; + this.logger.log(`Writing data with filesize: ${uncompressedFilesize}. Compressed Size: ${compressedFilesize}`); + timeout = await this.flashDeflBegin(uncompressedFilesize, compressedFilesize, offset); + } + else { + this.logger.log(`Writing data with filesize: ${uncompressedFilesize}`); + dataToFlash = binaryData; + await this.flashBegin(uncompressedFilesize, offset); + } + let block = []; + let seq = 0; + let written = 0; + let position = 0; + const stamp = Date.now(); + const flashWriteSize = this.getFlashWriteSize(); + const filesize = compress ? compressedFilesize : uncompressedFilesize; + while (filesize - position > 0) { + if (this.debug) { + this.logger.log(`Writing at ${toHex(offset + seq * flashWriteSize, 8)} `); + } + if (filesize - position >= flashWriteSize) { + block = Array.from(new Uint8Array(dataToFlash, position, flashWriteSize)); + } + else { + // Pad the last block only if we are sending uncompressed data. + block = Array.from(new Uint8Array(dataToFlash, position, filesize - position)); + if (!compress) { + block = block.concat(new Array(flashWriteSize - block.length).fill(0xff)); + } + } + if (compress) { + await this.flashDeflBlock(block, seq, timeout); + } + else { + await this.flashBlock(block, seq); + } + seq += 1; + // If using compression we update the progress with the proportional size of the block taking into account the compression ratio. + // This way we report progress on the uncompressed size + written += compress + ? Math.round((block.length * uncompressedFilesize) / compressedFilesize) + : block.length; + position += flashWriteSize; + updateProgress(Math.min(written, uncompressedFilesize), uncompressedFilesize); + } + this.logger.log("Took " + (Date.now() - stamp) + "ms to write " + filesize + " bytes"); + // Only send flashF finish if running the stub because ir causes the ROM to exit and run user code + if (this.IS_STUB) { + await this.flashBegin(0, 0); + if (compress) { + await this.flashDeflFinish(); + } + else { + await this.flashFinish(); + } + } + } + /** + * @name flashBlock + * Send one block of data to program into SPI Flash memory + */ + async flashBlock(data, seq, timeout = DEFAULT_TIMEOUT) { + await this.checkCommand(ESP_FLASH_DATA, pack(" 0) { + // add a dummy write to a date register as an excuse to have a delay + buffer = buffer.concat(pack(" 0) { + await this.writeRegister(SPI_MOSI_DLEN_REG, mosiBits - 1); + } + if (misoBits > 0) { + await this.writeRegister(SPI_MISO_DLEN_REG, misoBits - 1); + } + } + else { + const SPI_DATA_LEN_REG = spiAddresses.regBase + spiAddresses.usr1Offs; + const SPI_MOSI_BITLEN_S = 17; + const SPI_MISO_BITLEN_S = 8; + const mosiMask = mosiBits == 0 ? 0 : mosiBits - 1; + const misoMask = misoBits == 0 ? 0 : misoBits - 1; + const value = (misoMask << SPI_MISO_BITLEN_S) | (mosiMask << SPI_MOSI_BITLEN_S); + await this.writeRegister(SPI_DATA_LEN_REG, value); + } + } + async waitDone(spiCmdReg, spiCmdUsr) { + for (let i = 0; i < 10; i++) { + const cmdValue = await this.readRegister(spiCmdReg); + if ((cmdValue & spiCmdUsr) == 0) { + return; + } + } + throw Error("SPI command did not complete in time"); + } + async runSpiFlashCommand(spiflashCommand, data, readBits = 0) { + // Run an arbitrary SPI flash command. + // This function uses the "USR_COMMAND" functionality in the ESP + // SPI hardware, rather than the precanned commands supported by + // hardware. So the value of spiflash_command is an actual command + // byte, sent over the wire. + // After writing command byte, writes 'data' to MOSI and then + // reads back 'read_bits' of reply on MISO. Result is a number. + // SPI_USR register flags + const SPI_USR_COMMAND = 1 << 31; + const SPI_USR_MISO = 1 << 28; + const SPI_USR_MOSI = 1 << 27; + // SPI registers, base address differs + const spiAddresses = getSpiFlashAddresses(this.getChipFamily()); + const base = spiAddresses.regBase; + const SPI_CMD_REG = base; + const SPI_USR_REG = base + spiAddresses.usrOffs; + const SPI_USR2_REG = base + spiAddresses.usr2Offs; + const SPI_W0_REG = base + spiAddresses.w0Offs; + // SPI peripheral "command" bitmasks for SPI_CMD_REG + const SPI_CMD_USR = 1 << 18; + // shift values + const SPI_USR2_COMMAND_LEN_SHIFT = 28; + if (readBits > 32) { + throw new Error("Reading more than 32 bits back from a SPI flash operation is unsupported"); + } + if (data.length > 64) { + throw new Error("Writing more than 64 bytes of data with one SPI command is unsupported"); + } + const dataBits = data.length * 8; + const oldSpiUsr = await this.readRegister(SPI_USR_REG); + const oldSpiUsr2 = await this.readRegister(SPI_USR2_REG); + let flags = SPI_USR_COMMAND; + if (readBits > 0) { + flags |= SPI_USR_MISO; + } + if (dataBits > 0) { + flags |= SPI_USR_MOSI; + } + await this.setDataLengths(spiAddresses, dataBits, readBits); + await this.writeRegister(SPI_USR_REG, flags); + await this.writeRegister(SPI_USR2_REG, (7 << SPI_USR2_COMMAND_LEN_SHIFT) | spiflashCommand); + if (dataBits == 0) { + await this.writeRegister(SPI_W0_REG, 0); // clear data register before we read it + } + else { + const padLen = (4 - (data.length % 4)) % 4; + data = data.concat(new Array(padLen).fill(0x00)); // pad to 32-bit multiple + const words = unpack("I".repeat(Math.floor(data.length / 4)), data); + let nextReg = SPI_W0_REG; + this.logger.debug(`Words Length: ${words.length}`); + for (const word of words) { + this.logger.debug(`Writing word ${toHex(word)} to register offset ${toHex(nextReg)}`); + await this.writeRegister(nextReg, word); + nextReg += 4; + } + } + await this.writeRegister(SPI_CMD_REG, SPI_CMD_USR); + await this.waitDone(SPI_CMD_REG, SPI_CMD_USR); + const status = await this.readRegister(SPI_W0_REG); + // restore some SPI controller registers + await this.writeRegister(SPI_USR_REG, oldSpiUsr); + await this.writeRegister(SPI_USR2_REG, oldSpiUsr2); + return status; + } + async detectFlashSize() { + this.logger.debug("Detecting Flash Size"); + const flashId = await this.flashId(); + const manufacturer = flashId & 0xff; + const flashIdLowbyte = (flashId >> 16) & 0xff; + const deviceTypeByte = (flashId >> 8) & 0xff; + const deviceId = (deviceTypeByte << 8) | flashIdLowbyte; + const jedecId = (manufacturer << 16) | deviceId; + const mfrName = FLASH_MANUFACTURERS[manufacturer]; + const deviceName = FLASH_DEVICES[jedecId]; + this.logger.log(`Flash Manufacturer: ${mfrName || "Unknown"} (0x${manufacturer.toString(16)})`); + this.logger.log(`Flash Device: ${deviceName || `Unknown (0x${deviceId.toString(16)})`}`); + this.flashSize = DETECTED_FLASH_SIZES[flashIdLowbyte]; + this.logger.log(`Auto-detected Flash size: ${this.flashSize}`); + } + /** + * @name getEraseSize + * Calculate an erase size given a specific size in bytes. + * Provides a workaround for the bootloader erase bug on ESP8266. + */ + getEraseSize(offset, size) { + const sectorsPerBlock = 16; + const sectorSize = FLASH_SECTOR_SIZE; + const numSectors = Math.floor((size + sectorSize - 1) / sectorSize); + const startSector = Math.floor(offset / sectorSize); + let headSectors = sectorsPerBlock - (startSector % sectorsPerBlock); + if (numSectors < headSectors) { + headSectors = numSectors; + } + if (numSectors < 2 * headSectors) { + return Math.floor(((numSectors + 1) / 2) * sectorSize); + } + return (numSectors - headSectors) * sectorSize; + } + /** + * @name memBegin (592) + * Start downloading an application image to RAM + */ + async memBegin(size, blocks, blocksize, offset) { + return await this.checkCommand(ESP_MEM_BEGIN, pack(" length) { + toOffs = length; + } + await this.memBlock(fieldData.slice(fromOffs, toOffs), seq); + } + } + await this.memFinish(stub.entry); + const p = await this.readPacket(2500); + const pChar = String.fromCharCode(...p); + if (pChar != "OHAI") { + throw new Error("Failed to start stub. Unexpected response: " + pChar); + } + this.logger.debug("Stub is now running..."); + this._commandLock = Promise.resolve([0, []]); + const espStubLoader = new EspStubLoader(this.port, this.logger, this); + // Try to autodetect the flash size. + if (!skipFlashDetection) { + await espStubLoader.detectFlashSize(); + } + return espStubLoader; + } + get _writer() { + return this._parent ? this._parent._writer : this.__writer; + } + set _writer(value) { + if (this._parent) { + this._parent._writer = value; + } + else { + this.__writer = value; + } + } + get _writeChain() { + return this._parent ? this._parent._writeChain : this.__writeChain; + } + set _writeChain(value) { + if (this._parent) { + this._parent._writeChain = value; + } + else { + this.__writeChain = value; + } + } + async writeToStream(data) { + if (!this.port.writable) { + this.logger.debug("Port writable stream not available, skipping write"); + return; + } + if (this._isReconfiguring) { + throw new Error("Cannot write during port reconfiguration"); + } + // Queue writes to prevent lock contention (critical for CP2102 on Windows) + this._writeChain = this._writeChain + .then(async () => { + // Check if port is still writable before attempting write + if (!this.port.writable) { + throw new Error("Port became unavailable during write"); + } + // Get or create persistent writer + if (!this._writer) { + try { + this._writer = this.port.writable.getWriter(); + } + catch (err) { + this.logger.error(`Failed to get writer: ${err}`); + throw err; + } + } + // Perform the write + await this._writer.write(new Uint8Array(data)); + }, async () => { + // Previous write failed, but still attempt this write + this.logger.debug("Previous write failed, attempting recovery for current write"); + if (!this.port.writable) { + throw new Error("Port became unavailable during write"); + } + // Writer was likely cleaned up by previous error, create new one + if (!this._writer) { + try { + this._writer = this.port.writable.getWriter(); + } + catch (err) { + this.logger.debug(`Failed to get writer in recovery: ${err}`); + throw new Error("Cannot acquire writer lock"); + } + } + await this._writer.write(new Uint8Array(data)); + }) + .catch((err) => { + this.logger.error(`Write error: ${err}`); + // Ensure writer is cleaned up on any error + if (this._writer) { + try { + this._writer.releaseLock(); + } + catch { + // Ignore release errors + } + this._writer = undefined; + } + // Re-throw to propagate error + throw err; + }); + // Always await the write chain to ensure errors are caught + await this._writeChain; + } + async disconnect() { + if (this._parent) { + await this._parent.disconnect(); + return; + } + if (!this.port.writable) { + // this.logger.debug("Port already closed, skipping disconnect"); + return; + } + // Wait for pending writes to complete + try { + await this._writeChain; + } + catch (_err) { + // this.logger.debug(`Pending write error during disconnect: ${err}`); + } + // Release persistent writer before closing + if (this._writer) { + try { + await this._writer.close(); + this._writer.releaseLock(); + } + catch (_err) { + // this.logger.debug(`Writer close/release error: ${err}`); + } + this._writer = undefined; + } + else { + // No persistent writer exists, close stream directly + // This path is taken when no writes have been queued + try { + const writer = this.port.writable.getWriter(); + await writer.close(); + writer.releaseLock(); + } + catch (_err) { + // this.logger.debug(`Direct writer close error: ${err}`); + } + } + await new Promise((resolve) => { + if (!this._reader) { + resolve(undefined); + return; + } + // Set a timeout to prevent hanging (important for node-usb) + const timeout = setTimeout(() => { + this.logger.debug("Disconnect timeout - forcing resolution"); + resolve(undefined); + }, 1000); + this.addEventListener("disconnect", () => { + clearTimeout(timeout); + resolve(undefined); + }, { once: true }); + // Only cancel if reader is still active + try { + this._reader.cancel(); + } + catch (_err) { + // Reader already released, resolve immediately + clearTimeout(timeout); + resolve(undefined); + } + }); + this.connected = false; + // Close the port (important for node-usb adapter) + try { + await this.port.close(); + this.logger.debug("Port closed successfully"); + } + catch (err) { + this.logger.debug(`Port close error: ${err}`); + } + } + /** + * @name releaseReaderWriter + * Release reader and writer locks without closing the port + * Used when switching to console mode + */ + async releaseReaderWriter() { + if (this._parent) { + await this._parent.releaseReaderWriter(); + return; + } + // Wait for pending writes to complete + try { + await this._writeChain; + } + catch (_err) { + // this.logger.debug(`Pending write error during release: ${err}`); + } + // Release writer + if (this._writer) { + try { + this._writer.releaseLock(); + this.logger.debug("Writer released"); + } + catch (err) { + this.logger.debug(`Writer release error: ${err}`); + } + this._writer = undefined; + } + // Cancel reader - let readLoop's finally block handle releaseLock() + if (this._reader) { + try { + // Suppress disconnect event during console mode switching + this._suppressDisconnect = true; + // Cancel will cause readLoop to exit and call releaseLock() in its finally block + await this._reader.cancel(); + this.logger.debug("Reader cancelled - waiting for readLoop to finish"); + // CRITICAL: Wait a bit for readLoop's finally block to complete + // The finally block needs time to call releaseLock() and set _reader = undefined + // This is much faster than waiting for browser to unlock (just waiting for JS execution) + await sleep(50); + this.logger.debug("ReadLoop cleanup should be complete"); + } + catch (err) { + this.logger.debug(`Reader cancel error: ${err}`); + } + // Don't call releaseLock() or set _reader to undefined here + // Let readLoop's finally block handle it to avoid race conditions + } + } + /** + * @name resetToFirmware + * Public method to reset device from bootloader to firmware for console mode + * Automatically detects USB-JTAG/Serial and USB-OTG devices and performs appropriate reset + * @returns true if reset was performed, false if not needed + */ + async resetToFirmware() { + return await this._resetToFirmwareIfNeeded(); + } + /** + * @name detectUsbConnectionType + * Detect if device is using USB-JTAG/Serial or USB-OTG (not external serial chip) + * Uses USB PID (Product ID) for reliable detection - does NOT require chipFamily + * @returns true if USB-JTAG or USB-OTG, false if external serial chip + */ + async detectUsbConnectionType() { + // Use PID-based detection + const portInfo = this.port.getInfo(); + const pid = portInfo.usbProductId; + const vid = portInfo.usbVendorId; + // Check if this is an Espressif device + const isEspressif = vid === 0x303a; + if (!isEspressif) { + this.logger.debug("Not Espressif VID - external serial chip"); + return false; + } + // ESP32-S2/S3/C3/C5/C6/C61/H2/P4 USB-JTAG/OTG PIDs + // According to official Espressif documentation: + // https://docs.espressif.com/projects/esp-iot-solution/en/latest/usb/usb_overview/usb_device_const_COM.html + // 0x0002 = ESP32-S2 USB-OTG, 0x0012 = ESP32-P4 USB-Serial-JTAG + // 0x1001 = ESP32-S3, C3, C5, C6, C61, H2 USB-Serial-JTAG + const usbJtagPids = [0x0002, 0x0012, 0x1001]; + const isUsbJtag = usbJtagPids.includes(pid || 0); + this.logger.debug(`USB-JTAG/OTG detection: ${isUsbJtag ? "YES" : "NO"} (PID=0x${pid === null || pid === void 0 ? void 0 : pid.toString(16)})`); + return isUsbJtag; + } + async getUsbMode() { + var _a, _b; + const family = this._parent ? this._parent.chipFamily : this.chipFamily; + const revision = this._parent + ? ((_a = this._parent.chipRevision) !== null && _a !== void 0 ? _a : 0) + : ((_b = this.chipRevision) !== null && _b !== void 0 ? _b : 0); + let bufNoAddr = null; + let jtagSerialVal = null; + let otgVal = null; + switch (family) { + case CHIP_FAMILY_ESP32S2: + bufNoAddr = ESP32S2_UARTDEV_BUF_NO; + otgVal = ESP32S2_UARTDEV_BUF_NO_USB_OTG; + break; + case CHIP_FAMILY_ESP32S3: + bufNoAddr = ESP32S3_UARTDEV_BUF_NO; + jtagSerialVal = ESP32S3_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + otgVal = ESP32S3_UARTDEV_BUF_NO_USB_OTG; + break; + case CHIP_FAMILY_ESP32C3: { + const bssAddr = revision < 101 ? 0x3fcdf064 : 0x3fcdf060; + bufNoAddr = bssAddr + ESP32C3_BUF_UART_NO_OFFSET; + jtagSerialVal = ESP32C3_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + break; + } + case CHIP_FAMILY_ESP32C5: + bufNoAddr = ESP32C5_UARTDEV_BUF_NO; + jtagSerialVal = ESP32C5_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + break; + case CHIP_FAMILY_ESP32C6: + bufNoAddr = ESP32C6_UARTDEV_BUF_NO; + jtagSerialVal = ESP32C6_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + break; + case CHIP_FAMILY_ESP32C61: + bufNoAddr = + revision <= 200 + ? ESP32C61_UARTDEV_BUF_NO_REV_LE2 + : ESP32C61_UARTDEV_BUF_NO_REV_GT2; + jtagSerialVal = + revision <= 200 + ? ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_LE2 + : ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_GT2; + break; + case CHIP_FAMILY_ESP32H2: + bufNoAddr = ESP32H2_UARTDEV_BUF_NO; + jtagSerialVal = ESP32H2_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + break; + case CHIP_FAMILY_ESP32H4: + bufNoAddr = ESP32H4_UARTDEV_BUF_NO; + jtagSerialVal = ESP32H4_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + break; + case CHIP_FAMILY_ESP32P4: + bufNoAddr = + revision < 300 + ? ESP32P4_UARTDEV_BUF_NO_REV0 + : ESP32P4_UARTDEV_BUF_NO_REV300; + jtagSerialVal = ESP32P4_UARTDEV_BUF_NO_USB_JTAG_SERIAL; + otgVal = ESP32P4_UARTDEV_BUF_NO_USB_OTG; + break; + } + if (bufNoAddr === null) { + return { mode: "uart", uartNo: 0 }; + } + const uartNo = (await this.readRegister(bufNoAddr)) & 0xff; + if (otgVal !== null && uartNo === otgVal) { + this.logger.debug(`USB mode: USB-OTG (uartNo=${uartNo})`); + return { mode: "usb-otg", uartNo }; + } + if (jtagSerialVal !== null && uartNo === jtagSerialVal) { + this.logger.debug(`USB mode: USB-JTAG/Serial (uartNo=${uartNo})`); + return { mode: "usb-jtag-serial", uartNo }; + } + this.logger.debug(`USB mode: UART (uartNo=${uartNo})`); + return { mode: "uart", uartNo }; + } + /** + * Check if the current chip supports USB-JTAG or USB-OTG + * @returns true if chip has native USB support (JTAG or OTG) + */ + supportsNativeUsb() { + const family = this._parent ? this._parent.chipFamily : this.chipFamily; + // Chips with USB-JTAG/Serial or USB-OTG support + const usbChips = [ + CHIP_FAMILY_ESP32S2, // USB-OTG + CHIP_FAMILY_ESP32S3, // USB-OTG + USB-JTAG/Serial + CHIP_FAMILY_ESP32C3, // USB-JTAG/Serial + CHIP_FAMILY_ESP32C5, // USB-JTAG/Serial + CHIP_FAMILY_ESP32C6, // USB-JTAG/Serial + CHIP_FAMILY_ESP32C61, // USB-JTAG/Serial + CHIP_FAMILY_ESP32H2, // USB-JTAG/Serial + CHIP_FAMILY_ESP32H4, // USB-JTAG/Serial + CHIP_FAMILY_ESP32P4, // USB-OTG + USB-JTAG/Serial + ]; + return usbChips.includes(family); + } + /** + * @name _ensureStreamsReady + * After a hardware reset, ensure port streams are available. + * On WebUSB, recreates streams since they break after reset. + * On Web Serial, waits for streams to become available. + */ + async _ensureStreamsReady() { + if (this.isWebUSB()) { + try { + await this.port.recreateStreams(); + this.logger.debug("WebUSB streams recreated"); + let retries = 30; + while (retries > 0 && !this.port.readable) { + await sleep(100); + retries--; + } + if (!this.port.readable) { + throw new Error("Readable stream not available after recreating streams"); + } + this.logger.debug("WebUSB streams are ready"); + } + catch (err) { + this.logger.error(`Failed to recreate WebUSB streams: ${err}`); + this._consoleMode = false; + throw err; + } + } + else { + let retries = 20; + while (retries > 0 && !this.port.readable) { + await sleep(100); + retries--; + } + if (!this.port.readable) { + this._consoleMode = false; + throw new Error("Readable stream not available after reset"); + } + this.logger.debug("Port streams are ready"); + } + } + /** + * @name enterConsoleMode + * Prepare device for console mode by resetting to firmware + * Handles both USB-JTAG/OTG devices (closes port) and external serial chips (keeps port open) + * @returns true if port was closed (USB-JTAG), false if port stays open (serial chip) + */ + async enterConsoleMode() { + // Check if port is open - if not, we need a new port selection + if (!this.port.writable || !this.port.readable) { + this.logger.debug("Port is not open - port selection needed"); + // Return true to signal that port selection is needed + // The caller should handle port selection and try again + return true; + } + // Re-detect USB connection type to ensure we have a definitive value + let isUsbJtag; + try { + isUsbJtag = await this.detectUsbConnectionType(); + this.logger.debug(`USB connection type detected: ${isUsbJtag ? "USB-JTAG/OTG" : "External Serial Chip"}`); + // CRITICAL: Set the cached value so _resetToFirmwareIfNeeded() can use it + this._isUsbJtagOrOtg = isUsbJtag; + } + catch (err) { + // If detection fails, fall back to cached value or fail-fast + if (this.isUsbJtagOrOtg === undefined) { + throw new Error(`Cannot enter console mode: USB connection type unknown and detection failed: ${err}`); + } + this.logger.debug(`USB detection failed, using cached value: ${this.isUsbJtagOrOtg}`); + isUsbJtag = this.isUsbJtagOrOtg; + } + // Set console mode flag BEFORE any operations + this._consoleMode = true; + if (isUsbJtag) { + // USB-JTAG/OTG devices: Use reset which may close port + const wasReset = await this._resetToFirmwareIfNeeded(); + if (wasReset) { + return true; // port closed, caller must reopen + } + // Port stayed open (e.g. C3/C5/C6/H2 classic reset) + await this._ensureStreamsReady(); + return false; + } + else { + // External serial chip devices: Release locks and do simple reset + try { + await this.releaseReaderWriter(); + await sleep(100); + } + catch (err) { + this.logger.debug(`Failed to release locks: ${err}`); + } + try { + await this.hardResetToFirmware(); + this.logger.debug("Device reset to firmware mode"); + } + catch (err) { + this.logger.debug(`Could not reset device: ${err}`); + } + await this._ensureStreamsReady(); + return false; + } + } + /** + * @name _clearForceDownloadBootIfNeeded + * Read and clear the force download boot flag if it is set + * This should ONLY be called when on ROM (not stub) and before WDT reset + * Clearing it on every connect causes issues with flash operations + * Returns true if the flag was cleared, false if it was already clear + */ + async _clearForceDownloadBootIfNeeded() { + try { + let regAddr; + let mask; + let chipName; + // Get register address and mask for this chip + if (this.chipFamily === CHIP_FAMILY_ESP32S2) { + regAddr = ESP32S2_RTC_CNTL_OPTION1_REG; + mask = ESP32S2_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK; + chipName = "ESP32-S2"; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32S3) { + regAddr = ESP32S3_RTC_CNTL_OPTION1_REG; + mask = ESP32S3_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK; + chipName = "ESP32-S3"; + } + else if (this.chipFamily === CHIP_FAMILY_ESP32P4) { + regAddr = ESP32P4_RTC_CNTL_OPTION1_REG; + mask = ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK; + chipName = "ESP32-P4"; + } + else { + // Not a chip that needs this + return false; + } + // Read current register value + const currentValue = await this.readRegister(regAddr); + this.logger.debug(`${chipName} force download boot register: 0x${currentValue.toString(16)} (mask: 0x${mask.toString(16)})`); + // Check if the flag is set + const isFlagSet = (currentValue & mask) !== 0; + if (isFlagSet) { + this.logger.debug(`${chipName} force download boot flag is SET - clearing it`); + // Clear the flag by writing 0 to the masked bits + await this.writeRegister(regAddr, 0, mask, 0); + this.logger.debug(`${chipName} force download boot flag cleared`); + return true; + } + else { + this.logger.debug(`${chipName} force download boot flag is already CLEAR - no action needed`); + return false; + } + } + catch (err) { + this.logger.debug(`Error checking/clearing force download flag: ${err}`); + return false; + } + } + /** + * @name _resetToFirmwareIfNeeded + * Reset device from bootloader to firmware when switching to console mode + * Detects USB-JTAG/Serial and USB-OTG devices and performs appropriate reset + * @returns true if reconnect was performed, false otherwise + */ + async _resetToFirmwareIfNeeded() { + // Detect if we need WDT reset (USB-JTAG/OTG) or classic reset + const isUsbJtagOrOtg = await this.detectUsbConnectionType(); + try { + // Check if port is open - if not, assume device is already in firmware mode + if (!this.port.writable || !this.port.readable) { + this.logger.debug("Port is not open - assuming device is already in firmware mode"); + return false; + } + if (isUsbJtagOrOtg) { + // USB-JTAG/OTG: DON'T release reader/writer before WDT reset + // The WDT reset needs active communication to send register write commands + // The port will close automatically after the WDT reset anyway + this.logger.debug("USB-JTAG/OTG: Keeping reader/writer active for WDT reset"); + } + else { + // External serial chip: Release reader/writer before classic reset + await this.releaseReaderWriter(); + this.logger.debug("External serial: Reader/writer released before reset"); + } + // Use the new resetToFirmwareMode method which handles all the logic + const portWillChange = await this.resetToFirmwareMode(true); + if (portWillChange) { + this.logger.debug(`${this.chipName}: Port will change after WDT reset - user must reselect port`); + // Dispatch event to signal port change + this.dispatchEvent(new CustomEvent("usb-otg-port-change", { + detail: { + chipName: this.chipName, + message: `${this.chipName} USB port changed after reset. Please select the new port.`, + reason: "wdt-reset-to-firmware", + }, + })); + return true; + } + else { + // Port stays the same - release reader/writer now if not already done + if (isUsbJtagOrOtg) { + await this.releaseReaderWriter(); + this.logger.debug("Reader/writer released after reset"); + } + return false; + } + } + catch (err) { + this.logger.error(`Reset to firmware mode failed: ${err}`); + // For USB-JTAG/OTG, the port is likely dead after a failed reset + // For external serial, the port is usually still fine + if (isUsbJtagOrOtg) { + this.logger.debug("Forcing port reselection due to USB-JTAG/OTG reset failure"); + return true; + } + this.logger.debug("External serial reset failed, but port should still be usable"); + return false; + } + } + /** + * @name reconnectAndResume + * Reconnect the serial port to flush browser buffers and reload stub + */ + async reconnect() { + if (this._parent) { + await this._parent.reconnect(); + return; + } + try { + this.logger.log("Reconnecting serial port..."); + const savedBaudRate = this.currentBaudRate; + this.connected = false; + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + // Wait for pending writes to complete + try { + await this._writeChain; + } + catch (err) { + this.logger.debug(`Pending write error during reconnect: ${err}`); + } + // Block new writes during port close/open + this._isReconfiguring = true; + // Release persistent writer + if (this._writer) { + try { + this._writer.releaseLock(); + } + catch (err) { + this.logger.debug(`Writer release error during reconnect: ${err}`); + } + this._writer = undefined; + } + // Cancel reader + if (this._reader) { + try { + await this._reader.cancel(); + } + catch (err) { + this.logger.debug(`Reader cancel error: ${err}`); + } + this._reader = undefined; + } + // Close port + try { + await this.port.close(); + this.logger.debug("Port closed"); + } + catch (err) { + this.logger.debug(`Port close error: ${err}`); + } + // Open the port + this.logger.debug("Opening port..."); + try { + await this.port.open({ baudRate: ESP_ROM_BAUD }); + this.connected = true; + this.currentBaudRate = ESP_ROM_BAUD; + } + catch (err) { + throw new Error(`Failed to open port: ${err}`); + } + // Verify port streams are available + if (!this.port.readable || !this.port.writable) { + throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`); + } + // Port is now open and ready - allow writes for initialization + this._isReconfiguring = false; + // Save chip info and flash size (no need to detect again) + const savedChipFamily = this.chipFamily; + const savedChipName = this.chipName; + const savedChipRevision = this.chipRevision; + const savedChipVariant = this.chipVariant; + const savedFlashSize = this.flashSize; + // Reinitialize + await this.hardReset(true); + if (!this._parent) { + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + this.__totalBytesRead = 0; + this.readLoop(); + } + await this.flushSerialBuffers(); + await this.sync(); + // Restore chip info + this.chipFamily = savedChipFamily; + this.chipName = savedChipName; + this.chipRevision = savedChipRevision; + this.chipVariant = savedChipVariant; + this.flashSize = savedFlashSize; + this.logger.debug(`Reconnect complete (chip: ${this.chipName})`); + // Verify port is ready + if (!this.port.writable || !this.port.readable) { + throw new Error("Port not ready after reconnect"); + } + // Power on flash for ESP32-P4 Rev 3.1 (301) & Rev 3.2 (302) + // (MUST be done BEFORE loading stub) + if (this.chipFamily === CHIP_FAMILY_ESP32P4 && + (this.chipRevision === 301 || this.chipRevision === 302)) { + await this.powerOnFlash(); + } + // Load stub + const stubLoader = await this.runStub(true); + this.logger.debug("Stub loaded"); + // Restore baudrate if it was changed + if (savedBaudRate !== ESP_ROM_BAUD) { + await stubLoader.setBaudrate(savedBaudRate); + // Verify port is still ready after baudrate change + if (!this.port.writable || !this.port.readable) { + throw new Error(`Port not ready after baudrate change (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`); + } + } + // The stub is now running on the chip + // stubLoader has this instance as _parent, so all operations go through this + // We just need to mark this instance as running stub code + this.IS_STUB = true; + this.logger.debug("Reconnection successful"); + } + catch (err) { + // Ensure flag is reset on error + this._isReconfiguring = false; + throw err; + } + } + /** + * @name reconnectToBootloader + * Close and reopen the port, then reset ESP to bootloader mode + * This is needed after Improv or other operations that leave ESP in firmware mode + */ + async reconnectToBootloader() { + if (this._parent) { + await this._parent.reconnectToBootloader(); + return; + } + try { + this.logger.log("Reconnecting to bootloader mode..."); + // Clear console mode flag when reconnecting to bootloader + this._consoleMode = false; + this.connected = false; + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + // Wait for pending writes to complete + try { + await this._writeChain; + } + catch (err) { + this.logger.debug(`Pending write error during reconnect: ${err}`); + } + // Block new writes during port close/open + this._isReconfiguring = true; + // Release persistent writer + if (this._writer) { + try { + this._writer.releaseLock(); + } + catch (err) { + this.logger.debug(`Writer release error during reconnect: ${err}`); + } + this._writer = undefined; + } + // Cancel reader + if (this._reader) { + try { + await this._reader.cancel(); + } + catch (err) { + this.logger.debug(`Reader cancel error: ${err}`); + } + this._reader = undefined; + } + // Close port + try { + await this.port.close(); + this.logger.debug("Port closed"); + } + catch (err) { + this.logger.debug(`Port close error: ${err}`); + } + // Open the port + this.logger.debug("Opening port..."); + try { + await this.port.open({ baudRate: ESP_ROM_BAUD }); + this.connected = true; + this.currentBaudRate = ESP_ROM_BAUD; + } + catch (err) { + throw new Error(`Failed to open port: ${err}`); + } + // Verify port streams are available + if (!this.port.readable || !this.port.writable) { + throw new Error(`Port streams not available after open (readable: ${!!this.port.readable}, writable: ${!!this.port.writable})`); + } + // Port is now open and ready - allow writes for initialization + this._isReconfiguring = false; + // Reset chip info and stub state + this.__chipFamily = undefined; + this.chipName = "Unknown Chip"; + this.chipRevision = null; + this.chipVariant = null; + this.IS_STUB = false; + // Start read loop + if (!this._parent) { + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + this.__totalBytesRead = 0; + this.readLoop(); + } + // Wait for readLoop to start + await sleep(100); + // Reset to bootloader mode using multiple strategies + await this.connectWithResetStrategies(); + // Detect chip type + await this.detectChip(); + this.logger.debug(`Reconnected to bootloader: ${this.chipName}`); + } + catch (err) { + // Ensure flag is reset on error + this._isReconfiguring = false; + throw err; + } + } + /** + * @name exitConsoleMode + * Exit console mode and return to bootloader + * For ESP32-S2, uses reconnectToBootloader which will trigger port change + * @returns true if manual reconnection is needed (ESP32-S2), false otherwise + */ + async exitConsoleMode() { + if (this._parent) { + return await this._parent.exitConsoleMode(); + } + // Clear console mode flag + this._consoleMode = false; + // Check if this is a USB-OTG device (ESP32-S2 or ESP32-P4) + const isUsbOtgChip = this.chipFamily === CHIP_FAMILY_ESP32S2 || + this.chipFamily === CHIP_FAMILY_ESP32P4; + // For USB-OTG chips: if _isUsbJtagOrOtg is undefined, try to detect it + // If detection fails or is undefined, assume USB-JTAG/OTG (conservative/safe path) + let isUsbJtagOrOtg = this._isUsbJtagOrOtg; + if (isUsbOtgChip && isUsbJtagOrOtg === undefined) { + try { + isUsbJtagOrOtg = await this.detectUsbConnectionType(); + } + catch (err) { + this.logger.debug(`USB detection failed, assuming USB-JTAG/OTG for ${this.chipName}: ${err}`); + isUsbJtagOrOtg = true; // Conservative fallback + } + } + if (isUsbOtgChip && isUsbJtagOrOtg) { + // USB-OTG devices: Need to reset to bootloader, which will cause port change + this.logger.debug(`${this.chipName} USB: Resetting to bootloader mode`); + // Perform hardware reset to bootloader (GPIO0=LOW) + // This will cause the port to change from CDC (firmware) to JTAG (bootloader) + try { + await this.hardResetClassic(); + this.logger.debug("Reset to bootloader initiated"); + } + catch (err) { + this.logger.debug(`Reset error: ${err}`); + } + // Wait for reset to complete and port to change + await sleep(500); + this.logger.debug(`${this.chipName}: Port changed. Please select the bootloader port.`); + // Dispatch event to signal port change + this.dispatchEvent(new CustomEvent("usb-otg-port-change", { + detail: { + chipName: this.chipName, + message: `${this.chipName}: Port changed. Please select the bootloader port.`, + reason: "exit-console-to-bootloader", + }, + })); + // Port will change, so return true to indicate manual reconnection needed + return true; + } + // For other devices, use standard reconnectToBootloader + await this.reconnectToBootloader(); + return false; // No manual reconnection needed + } + /** + * @name isConsoleResetSupported + * Check if console reset is supported for this device + * ESP32-S2 USB-JTAG/CDC does not support reset in console mode + * because any reset causes USB port to be lost (hardware limitation) + */ + isConsoleResetSupported() { + if (this._parent) { + return this._parent.isConsoleResetSupported(); + } + // For ESP32-S2: if _isUsbJtagOrOtg is undefined, assume USB-JTAG/OTG (conservative) + // This means console reset is NOT supported (safer default) + const isS2UsbJtag = this.chipFamily === CHIP_FAMILY_ESP32S2 && + (this._isUsbJtagOrOtg === true || this._isUsbJtagOrOtg === undefined); + return !isS2UsbJtag; // Not supported for ESP32-S2 USB-JTAG/CDC + } + /** + * @name resetInConsoleMode + * Reset device while in console mode (firmware mode) + * + * NOTE: For ESP32-S2 USB-JTAG/CDC, ANY reset (hardware or software) causes + * the USB port to be lost because the device switches USB modes during reset. + * This is a hardware limitation - use isConsoleResetSupported() to check first. + */ + async resetInConsoleMode() { + if (this._parent) { + return await this._parent.resetInConsoleMode(); + } + if (!this.isConsoleResetSupported()) { + this.logger.debug("Simple Console reset not supported for ESP32-S2 USB-JTAG/CDC - using exitConsoleMode to enter bootloader"); + await this.exitConsoleMode(); + this.logger.debug("S2 now in bootloader mode - caller must do syncAndWdtReset on new port, then reconnect console"); + return; + } + // For other devices: Use standard firmware reset + try { + this.logger.debug("Resetting device in console mode"); + await this.hardResetToFirmware(); + this.logger.debug("Device reset complete"); + } + catch (err) { + this.logger.error(`Reset failed: ${err}`); + throw err; + } + } + /** + * @name syncAndWdtReset + * Open a new bootloader port, sync with ROM (no stub, no reset strategies), and fire WDT reset. + * This is used for ESP32-S2 USB-OTG devices which require WDT reset to switch modes. + * After WDT reset the port will re-enumerate again. + * The user must select the new port after this method is called. + * @param newPort - The bootloader port selected by the user + */ + async syncAndWdtReset(newPort) { + if (this._parent) { + await this._parent.syncAndWdtReset(newPort); + return; + } + this.port = newPort; + this.connected = false; + this.IS_STUB = false; + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + this.__totalBytesRead = 0; + this.logger.debug("Opening bootloader port at 115200..."); + await this.port.open({ baudRate: ESP_ROM_BAUD }); + this.connected = true; + this.currentBaudRate = ESP_ROM_BAUD; + // Start read loop + this.readLoop(); + await sleep(100); + // Sync with ROM only - no reset strategies, device is already in bootloader + this.logger.debug("Syncing with bootloader ROM..."); + await this.sync(); + this.logger.debug("Bootloader sync OK, no stub"); + // Fire WDT reset → device boots into firmware + this.logger.debug("Firing WDT reset..."); + await this.rtcWdtResetChipSpecific(); + this.logger.debug("WDT reset fired - device will boot to firmware"); + } + /** + * @name drainInputBuffer + * Actively drain the input buffer by reading data for a specified time. + * Simple approach for some drivers (especially CP210x on Windows) that have + * issues with buffer flushing. + * + * Based on esptool.py fix: https://github.com/espressif/esptool/commit/5338ea054e5099ac7be235c54034802ac8a43162 + * + * @param bufferingTime - Time in milliseconds to wait for the buffer to fill + */ + async drainInputBuffer(bufferingTime = 200) { + // Wait for the buffer to fill + await sleep(bufferingTime); + // Unsupported command response is sent 8 times and has + // 14 bytes length including delimiter SLIP_END (0xC0) bytes. + // At least part of it is read as a command response, + // but to be safe, read it all. + const bytesToDrain = 14 * 8; + let drained = 0; + // Drain the buffer by reading available data + const drainStart = Date.now(); + const drainTimeout = 100; // Short timeout for draining + while (drained < bytesToDrain && Date.now() - drainStart < drainTimeout) { + if (this._inputBufferAvailable > 0) { + const byte = this._readByte(); + if (byte !== undefined) { + drained++; + } + } + else { + // Small sleep to avoid busy waiting + await sleep(1); + } + } + if (drained > 0) { + this.logger.debug(`Drained ${drained} bytes from input buffer`); + } + // Final clear of application buffer + if (!this._parent) { + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + } + } + /** + * @name flushSerialBuffers + * Flush any pending data in the TX and RX serial port buffers + * This clears both the application RX buffer and waits for hardware buffers to drain + */ + async flushSerialBuffers() { + // Clear application buffer + if (!this._parent) { + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + } + // Wait for any pending data + await sleep(SYNC_TIMEOUT); + // Final clear + if (!this._parent) { + this.__inputBuffer = []; + this.__inputBufferReadIndex = 0; + } + this.logger.debug("Serial buffers flushed"); + } + /** + * @name readFlash + * Read flash memory from the chip (only works with stub loader) + * @param addr - Address to read from + * @param size - Number of bytes to read + * @param onPacketReceived - Optional callback function called when packet is received + * @param options - Optional parameters for advanced control + * - chunkSize: Amount of data to request from ESP in one command (bytes) + * - blockSize: Size of each packet sent by the stub (bytes) + * - maxInFlight: Maximum number of unacknowledged packets + * @returns Uint8Array containing the flash data + */ + async readFlash(addr, size, onPacketReceived, options) { + if (!this.IS_STUB) { + throw new Error("Reading flash is only supported in stub mode. Please run runStub() first."); + } + // Flush serial buffers before flash read operation + await this.flushSerialBuffers(); + const readStartTime = Date.now(); + this.logger.log(`Reading ${size} bytes from flash at address 0x${addr.toString(16)}...`); + // Chunk size: Amount of data to request from ESP in one command + // For WebUSB (Android), use smaller chunks to avoid timeouts and buffer issues + // For Web Serial (Desktop), use larger chunks for better performance + let CHUNK_SIZE; + if ((options === null || options === void 0 ? void 0 : options.chunkSize) !== undefined) { + // Use user-provided chunkSize if in advanced mode + CHUNK_SIZE = options.chunkSize; + this.logger.log(`Using custom chunk size: 0x${CHUNK_SIZE.toString(16)} bytes`); + } + else if (this.isWebUSB()) { + // WebUSB: Use smaller chunks to avoid SLIP timeout issues + CHUNK_SIZE = 0x4 * 0x1000; // 4KB = 16384 bytes + } + else { + // Web Serial: Use larger chunks for better performance + CHUNK_SIZE = 0x40 * 0x1000; + } + let allData = new Uint8Array(0); + let currentAddr = addr; + let remainingSize = size; + while (remainingSize > 0) { + const chunkSize = Math.min(CHUNK_SIZE, remainingSize); + let chunkSuccess = false; + let retryCount = 0; + const MAX_RETRIES = 5; + let deepRecoveryAttempted = false; + // Retry loop for this chunk + while (!chunkSuccess && retryCount <= MAX_RETRIES) { + let resp = new Uint8Array(0); + try { + // Only log on first attempt or retries + if (retryCount === 0) { + this.logger.debug(`Reading chunk at 0x${currentAddr.toString(16)}, size: 0x${chunkSize.toString(16)}`); + } + let packetSize; + let maxInFlightPackets; + if ((options === null || options === void 0 ? void 0 : options.blockSize) !== undefined && + (options === null || options === void 0 ? void 0 : options.maxInFlight) !== undefined) { + // READ_FLASH expects packet size and max in-flight packet count. + packetSize = options.blockSize; + maxInFlightPackets = options.maxInFlight; + if (retryCount === 0) { + this.logger.debug(`Using custom parameters: packetSize=${packetSize}, maxInFlightPackets=${maxInFlightPackets}`); + } + } + else if (this.isWebUSB()) { + // WebUSB (Android): Use a smaller packet size, matching the + // protocol semantics used by esptool: packet size plus max + // in-flight packet count. + const maxTransferSize = this.port.maxTransferSize || 64; + packetSize = Math.floor((maxTransferSize - 2) / 2); // 31 bytes + maxInFlightPackets = 8; + } + else { + // Web Serial (Desktop): Match esptool's default READ_FLASH protocol. + packetSize = FLASH_SECTOR_SIZE; + maxInFlightPackets = 64; + } + const pkt = pack("= chunkSize) { + break; + } + } + throw err; + } + if (packet && packet.length > 0) { + const packetData = new Uint8Array(packet); + // Append to response + const newResp = new Uint8Array(resp.length + packetData.length); + newResp.set(resp); + newResp.set(packetData, resp.length); + resp = newResp; + // READ_FLASH ACKs are sent after each received SLIP data packet and + // contain the total number of bytes received so far. + const ackData = pack(" start) { + throw new Error("Software loader is resident at " + + toHex(start, 8) + + "-" + + toHex(end, 8) + + ". " + + "Can't load binary at overlapping address range " + + toHex(load_start, 8) + + "-" + + toHex(load_end, 8) + + ". " + + "Try changing the binary loading address."); + } + } + return [0, []]; + } + /** + * @name eraseFlash + * Erase entire flash chip + */ + async eraseFlash() { + await this.checkCommand(ESP_ERASE_FLASH, [], 0, CHIP_ERASE_TIMEOUT); + } + /** + * @name eraseRegion + * Erase a specific region of flash + */ + async eraseRegion(offset, size) { + // Validate inputs + if (offset < 0) { + throw new Error(`Invalid offset: ${offset} (must be non-negative)`); + } + if (size < 0) { + throw new Error(`Invalid size: ${size} (must be non-negative)`); + } + // No-op for zero size + if (size === 0) { + this.logger.log("eraseRegion: size is 0, skipping erase"); + return; + } + // Check for sector alignment + if (offset % FLASH_SECTOR_SIZE !== 0) { + throw new Error(`Offset ${offset} (0x${offset.toString(16)}) is not aligned to flash sector size ${FLASH_SECTOR_SIZE} (0x${FLASH_SECTOR_SIZE.toString(16)})`); + } + if (size % FLASH_SECTOR_SIZE !== 0) { + throw new Error(`Size ${size} (0x${size.toString(16)}) is not aligned to flash sector size ${FLASH_SECTOR_SIZE} (0x${FLASH_SECTOR_SIZE.toString(16)})`); + } + // Check for reasonable bounds (prevent wrapping in pack) + const maxValue = 0xffffffff; // 32-bit unsigned max + if (offset > maxValue) { + throw new Error(`Offset ${offset} exceeds maximum value ${maxValue}`); + } + if (size > maxValue) { + throw new Error(`Size ${size} exceeds maximum value ${maxValue}`); + } + // Check for wrap-around + if (offset + size > maxValue) { + throw new Error(`Region end (offset + size = ${offset + size}) exceeds maximum addressable range ${maxValue}`); + } + const timeout = timeoutPerMb(ERASE_REGION_TIMEOUT_PER_MB, size); + const buffer = pack(" data.length) + break; + const page = data.slice(pageOffset, pageOffset + pageSize); + const objId = page[0] | (page[1] << 8); + // Look for SPIFFS filename pattern: 0x01 followed by '/' and printable chars + for (let i = 0; i < page.length - 10; i++) { + if (page[i] === 0x01 && page[i + 1] === 0x2f) { // 0x01 followed by '/' + let validChars = 0; + for (let j = i + 1; j < Math.min(i + 20, page.length); j++) { + if (page[j] >= 0x20 && page[j] < 0x7f) { + validChars++; + } + else if (page[j] === 0x00) { + break; + } + } + if (validChars >= 4) { // At least "/xxx" + spiffsScore += 5; + break; + } + } + } + // Check for typical SPIFFS object ID patterns + if ((objId & 0x8000) !== 0) { + const idLow = objId & 0x7fff; + if (idLow > 0 && idLow < 0x1000) { + spiffsScore += 2; + } + } + } + return spiffsScore >= 10; +} +/** + * Scan ESP8266 flash for filesystem by detecting filesystem signatures + * Reads actual block_count from LittleFS superblock for accurate size detection + * + * @param flashData - Flash data starting at scanOffset + * @param scanOffset - The offset in flash where this data starts + * @param flashSize - Total flash size in bytes + * @returns Detected filesystem layout or null + */ +function scanESP8266Filesystem(flashData, scanOffset, flashSize) { + // Check for LittleFS signature + // LittleFS superblock has "littlefs" magic at offset 8 within block 0 + const blockSizes = ESP8266_LITTLEFS_BLOCK_SIZE_CANDIDATES; // ESP8266 typically uses 8192 + for (const blockSize of blockSizes) { + // Check block 0 and block 1 (mirrored superblock) + for (let blockIndex = 0; blockIndex < 2; blockIndex++) { + const superblockOffset = blockIndex * blockSize; + const magicOffset = superblockOffset + 8; + if (magicOffset + 8 > flashData.length) { + continue; + } + const magicStr = String.fromCharCode(flashData[magicOffset], flashData[magicOffset + 1], flashData[magicOffset + 2], flashData[magicOffset + 3], flashData[magicOffset + 4], flashData[magicOffset + 5], flashData[magicOffset + 6], flashData[magicOffset + 7]); + if (magicStr === "littlefs") { + // Validate version (at offset 16 in superblock) + const versionOffset = superblockOffset + 16; + const version = flashData[versionOffset] | + (flashData[versionOffset + 1] << 8) | + (flashData[versionOffset + 2] << 16) | + (flashData[versionOffset + 3] << 24); + if (version !== 0 && (version >>> 0) !== 0xffffffff) { + // Found valid LittleFS! + // Try to read block_count from superblock (offset 24, 4 bytes little-endian) + const blockCountOffset = superblockOffset + 24; + if (blockCountOffset + 4 <= flashData.length) { + const blockCount = flashData[blockCountOffset] | + (flashData[blockCountOffset + 1] << 8) | + (flashData[blockCountOffset + 2] << 16) | + (flashData[blockCountOffset + 3] << 24); + // Validate block_count (should be reasonable: > 0 and < 100000) + if (blockCount > 0 && blockCount < 100000) { + const detectedSize = blockCount * blockSize; + // Verify size is reasonable (not larger than remaining flash) + if (detectedSize > 0 && scanOffset + detectedSize <= flashSize) { + return { + start: scanOffset, + end: scanOffset + detectedSize, + size: detectedSize, + page: ESP8266_LITTLEFS_PAGE_SIZE, + block: blockSize, + }; + } + } + } + // Fallback to known layout patterns if block_count read failed + return getLayoutForDetectedFilesystem(scanOffset, flashSize, blockSize); + } + } + } + } + // Check for SPIFFS filesystem using pattern detection + if (detectSPIFFSPatterns(flashData)) { + // SPIFFS does not store size in the image itself + // Size must come from linker script or partition table + return getLayoutForDetectedFilesystem(scanOffset, flashSize, ESP8266_SPIFFS_BLOCK_SIZE); + } + // Also check for SPIFFS magic 0x20140529 (some implementations have it) + if (flashData.length >= 4) { + const spiffsMagic = flashData[0] | + (flashData[1] << 8) | + (flashData[2] << 16) | + (flashData[3] << 24); + if (spiffsMagic === 0x20140529) { + // Found SPIFFS magic! + // Additional validation: Check if header looks valid + let validHeader = true; + // Check if next bytes are not all 0xFF + if (flashData.length >= 16) { + let allFF = true; + for (let i = 4; i < 16; i++) { + if (flashData[i] !== 0xff) { + allFF = false; + break; + } + } + if (allFF) { + validHeader = false; + } + } + if (validHeader) { + return getLayoutForDetectedFilesystem(scanOffset, flashSize, ESP8266_SPIFFS_BLOCK_SIZE); + } + } + } + // Check for FAT filesystem + // FAT can start at offset 0 or 0x1000 (4096 bytes) in ESP8266 + const fatOffsets = [0, 0x1000]; + for (const fatOffset of fatOffsets) { + if (flashData.length < fatOffset + 512) { + continue; + } + const bootSig = flashData[fatOffset + 510] | (flashData[fatOffset + 511] << 8); + if (bootSig === 0xaa55) { + // Read bytes per sector + const bytesPerSector = flashData[fatOffset + 0x0b] | (flashData[fatOffset + 0x0c] << 8); + // Validate bytes per sector (must be 512, 1024, 2048, or 4096) + if (![512, 1024, 2048, 4096].includes(bytesPerSector)) { + continue; + } + // Read total sectors (try 16-bit first, then 32-bit) + let totalSectors = flashData[fatOffset + 0x13] | (flashData[fatOffset + 0x14] << 8); + if (totalSectors === 0) { + // Use 32-bit total sectors + totalSectors = + flashData[fatOffset + 0x20] | + (flashData[fatOffset + 0x21] << 8) | + (flashData[fatOffset + 0x22] << 16) | + (flashData[fatOffset + 0x23] << 24); + } + // Validate values + if (bytesPerSector > 0 && totalSectors > 0 && totalSectors < 100000000) { + const detectedSize = totalSectors * bytesPerSector; + // Verify size is reasonable (not larger than remaining flash) + // Account for the FAT offset in the actual flash position + const actualStart = scanOffset + fatOffset; + if (detectedSize > 0 && actualStart + detectedSize <= flashSize) { + return { + start: actualStart, + end: actualStart + detectedSize, + size: detectedSize, + page: bytesPerSector, + block: bytesPerSector, // FAT uses sector size as block size + }; + } + } + } + } + return null; +} +/** + * Get filesystem layout based on detected offset and flash size + * Uses known ESP8266 linker script patterns from Arduino/PlatformIO + */ +function getLayoutForDetectedFilesystem(offset, flashSize, blockSize) { + const flashSizeMB = flashSize / (1024 * 1024); + // 16MB Flash layouts + if (flashSizeMB >= 16) { + if (offset === 0x100000) { + return { start: 0x100000, end: 0xffa000, size: 0xefa000, page: 256, block: blockSize }; // 15MB + } + else if (offset === 0x200000) { + return { start: 0x200000, end: 0xffa000, size: 0xdfa000, page: 256, block: blockSize }; // 14MB + } + } + // 8MB Flash layouts + if (flashSizeMB >= 8) { + if (offset === 0x100000) { + return { start: 0x100000, end: 0x7fa000, size: 0x6fa000, page: 256, block: blockSize }; // 7MB + } + else if (offset === 0x200000) { + return { start: 0x200000, end: 0x7fa000, size: 0x5fa000, page: 256, block: blockSize }; // 6MB + } + } + // 4MB Flash layouts + if (flashSizeMB >= 4) { + if (offset === 0x100000) { + return { start: 0x100000, end: 0x3fa000, size: 0x2fa000, page: 256, block: blockSize }; // 3MB + } + else if (offset === 0x200000) { + return { start: 0x200000, end: 0x3fa000, size: 0x1fa000, page: 256, block: blockSize }; // 2MB + } + else if (offset === 0x300000) { + return { start: 0x300000, end: 0x3fa000, size: 0x0fa000, page: 256, block: blockSize }; // 1MB + } + } + // 2MB Flash layouts + if (flashSizeMB >= 2) { + if (offset === 0x100000) { + return { start: 0x100000, end: 0x1fa000, size: 0x0fa000, page: 256, block: blockSize }; // 1MB + } + else if (offset === 0x180000) { + return { start: 0x180000, end: 0x1fa000, size: 0x07a000, page: 256, block: blockSize }; // 512KB + } + else if (offset === 0x1c0000) { + return { start: 0x1c0000, end: 0x1fb000, size: 0x03b000, page: 256, block: blockSize }; // 256KB + } + else if (offset === 0x1e0000) { + return { start: 0x1e0000, end: 0x1fb000, size: 0x01b000, page: 256, block: blockSize }; // 128KB + } + else if (offset === 0x1f0000) { + return { start: 0x1f0000, end: 0x1fb000, size: 0x00b000, page: 256, block: blockSize }; // 64KB + } + } + // 1MB Flash layouts + if (flashSizeMB >= 1) { + if (offset === 0x07b000) { + return { start: 0x07b000, end: 0x0fb000, size: 0x080000, page: 256, block: blockSize }; // 512KB + } + else if (offset === 0x0bb000) { + return { start: 0x0bb000, end: 0x0fb000, size: 0x040000, page: 256, block: blockSize }; // 256KB + } + else if (offset === 0x0cb000) { + return { start: 0x0cb000, end: 0x0fb000, size: 0x030000, page: 256, block: blockSize }; // 192KB + } + else if (offset === 0x0d3000) { + return { start: 0x0d3000, end: 0x0fb000, size: 0x028000, page: 256, block: blockSize }; // 160KB + } + else if (offset === 0x0d7000) { + return { start: 0x0d7000, end: 0x0fb000, size: 0x024000, page: 256, block: blockSize }; // 144KB + } + else if (offset === 0x0db000) { + return { start: 0x0db000, end: 0x0fb000, size: 0x020000, page: 256, block: blockSize }; // 128KB + } + else if (offset === 0x0eb000) { + return { start: 0x0eb000, end: 0x0fb000, size: 0x010000, page: 256, block: blockSize }; // 64KB + } + } + // 512KB Flash layouts + if (flashSizeMB >= 0.5) { + if (offset === 0x05b000) { + return { start: 0x05b000, end: 0x07b000, size: 0x020000, page: 256, block: blockSize }; // 128KB + } + else if (offset === 0x06b000) { + return { start: 0x06b000, end: 0x07b000, size: 0x010000, page: 256, block: blockSize }; // 64KB + } + else if (offset === 0x073000) { + return { start: 0x073000, end: 0x07b000, size: 0x008000, page: 256, block: blockSize }; // 32KB + } + } + // Fallback: use remaining flash space + const size = flashSize - offset; + return { + start: offset, + end: flashSize, + size: size, + page: 256, + block: blockSize, + }; +} +/** + * Get common ESP8266 filesystem layouts as fallback + * Used when we can't scan the actual flash + * + * @param flashSizeMB - Flash size in megabytes + * @returns Array of possible filesystem layouts (most common first) + */ +function getESP8266FilesystemLayout(flashSizeMB) { + // Based on common ESP8266 linker script configurations + if (flashSizeMB >= 16) { + // 16MB flash + return [ + { start: 0x100000, end: 0xffa000, size: 0xefa000, page: 256, block: 8192 }, // 15MB + { start: 0x200000, end: 0xffa000, size: 0xdfa000, page: 256, block: 8192 }, // 14MB + ]; + } + else if (flashSizeMB >= 8) { + // 8MB flash + return [ + { start: 0x100000, end: 0x7fa000, size: 0x6fa000, page: 256, block: 8192 }, // 7MB + { start: 0x200000, end: 0x7fa000, size: 0x5fa000, page: 256, block: 8192 }, // 6MB + ]; + } + else if (flashSizeMB >= 4) { + // 4MB flash: Multiple possible configurations + return [ + { start: 0x200000, end: 0x3fa000, size: 0x1fa000, page: 256, block: 8192 }, // 2MB (most common) + { start: 0x100000, end: 0x3fa000, size: 0x2fa000, page: 256, block: 8192 }, // 3MB + { start: 0x300000, end: 0x3fa000, size: 0x0fa000, page: 256, block: 8192 }, // 1MB + ]; + } + else if (flashSizeMB >= 2) { + // 2MB flash + return [ + { start: 0x100000, end: 0x1fa000, size: 0x0fa000, page: 256, block: 8192 }, // 1MB + { start: 0x180000, end: 0x1fa000, size: 0x07a000, page: 256, block: 8192 }, // 512KB + { start: 0x1c0000, end: 0x1fb000, size: 0x03b000, page: 256, block: 8192 }, // 256KB + { start: 0x1e0000, end: 0x1fb000, size: 0x01b000, page: 256, block: 8192 }, // 128KB + { start: 0x1f0000, end: 0x1fb000, size: 0x00b000, page: 256, block: 8192 }, // 64KB + ]; + } + else if (flashSizeMB >= 1) { + // 1MB flash + return [ + { start: 0x0db000, end: 0x0fb000, size: 0x020000, page: 256, block: 8192 }, // 128KB (most common) + { start: 0x07b000, end: 0x0fb000, size: 0x080000, page: 256, block: 8192 }, // 512KB + { start: 0x0bb000, end: 0x0fb000, size: 0x040000, page: 256, block: 8192 }, // 256KB + { start: 0x0cb000, end: 0x0fb000, size: 0x030000, page: 256, block: 8192 }, // 192KB + { start: 0x0d3000, end: 0x0fb000, size: 0x028000, page: 256, block: 8192 }, // 160KB + { start: 0x0d7000, end: 0x0fb000, size: 0x024000, page: 256, block: 8192 }, // 144KB + { start: 0x0eb000, end: 0x0fb000, size: 0x010000, page: 256, block: 8192 }, // 64KB + ]; + } + else if (flashSizeMB >= 0.5) { + // 512KB flash + return [ + { start: 0x05b000, end: 0x07b000, size: 0x020000, page: 256, block: 8192 }, // 128KB + { start: 0x06b000, end: 0x07b000, size: 0x010000, page: 256, block: 8192 }, // 64KB + { start: 0x073000, end: 0x07b000, size: 0x008000, page: 256, block: 8192 }, // 32KB + ]; + } + return []; +} +/** + * Filesystem types based on partition subtype + */ +var FilesystemType; +(function (FilesystemType) { + FilesystemType["UNKNOWN"] = "unknown"; + FilesystemType["LITTLEFS"] = "littlefs"; + FilesystemType["FATFS"] = "fatfs"; + FilesystemType["SPIFFS"] = "spiffs"; +})(FilesystemType || (FilesystemType = {})); +/** + * Detect filesystem type from partition information + * Note: This only provides a hint. LittleFS is often stored in SPIFFS partitions (0x82). + * Use detectFilesystemFromImage() for accurate detection. + */ +function detectFilesystemType(partition) { + if (partition.type !== 0x01) { + return FilesystemType.UNKNOWN; + } + switch (partition.subtype) { + case 0x81: + return FilesystemType.FATFS; + case 0x82: + return FilesystemType.UNKNOWN; + default: + return FilesystemType.UNKNOWN; + } +} +/** + * Detect filesystem type from image data + * Properly validates LittleFS superblock structure at correct offsets + * + * @param imageData - Binary filesystem image data + * @param chipName - Optional chip name for ESP8266-specific detection (e.g. "ESP8266") + */ +function detectFilesystemFromImage(imageData, chipName) { + if (imageData.length < 512) { + return FilesystemType.UNKNOWN; + } + // Check for LittleFS superblock at proper offsets + // LittleFS superblock structure: + // - Offset 0-3: version (4 bytes, little-endian) + // - Offset 4-7: CRC/flags (4 bytes) + // - Offset 8-15: "littlefs" magic string (8 bytes ASCII) + // - Offset 16+: additional metadata + // The superblock is at block 0 and mirrored at block 1 + // Block size is determined by the distance between mirrored superblocks + // Use chip-specific block sizes + const isESP8266 = chipName === null || chipName === void 0 ? void 0 : chipName.toUpperCase().includes("ESP8266"); + const blockSizes = isESP8266 + ? ESP8266_LITTLEFS_BLOCK_SIZE_CANDIDATES + : LITTLEFS_BLOCK_SIZE_CANDIDATES; + for (const blockSize of blockSizes) { + // Check first two blocks (superblock is mirrored) + for (let blockIndex = 0; blockIndex < 2; blockIndex++) { + const superblockOffset = blockIndex * blockSize; + if (superblockOffset + 20 > imageData.length) { + continue; + } + // Check for "littlefs" magic at offset 8 of superblock + const magicOffset = superblockOffset + 8; + if (magicOffset + 8 <= imageData.length) { + const magicStr = String.fromCharCode(imageData[magicOffset], imageData[magicOffset + 1], imageData[magicOffset + 2], imageData[magicOffset + 3], imageData[magicOffset + 4], imageData[magicOffset + 5], imageData[magicOffset + 6], imageData[magicOffset + 7]); + if (magicStr === "littlefs") { + // Found valid LittleFS superblock with magic string + // Validate version field to avoid false positives (at offset 16) + const versionOffset = superblockOffset + 16; + const version = imageData[versionOffset] | + (imageData[versionOffset + 1] << 8) | + (imageData[versionOffset + 2] << 16) | + (imageData[versionOffset + 3] << 24); + // Version must be non-zero and not erased flash (0xFFFFFFFF) + // Use unsigned comparison + if (version !== 0 && (version >>> 0) !== 0xFFFFFFFF) { + return FilesystemType.LITTLEFS; + } + } + } + } + } + // Check for FAT filesystem signatures + // FAT can start at offset 0 or 0x1000 (4096 bytes) in ESP8266 + const fatOffsets = [0, 0x1000]; + for (const fatOffset of fatOffsets) { + if (imageData.length < fatOffset + 512) { + continue; + } + const bootSig = imageData[fatOffset + 510] | (imageData[fatOffset + 511] << 8); + if (bootSig === 0xaa55) { + const fat16Sig = imageData.length >= fatOffset + 62 + ? String.fromCharCode(imageData[fatOffset + 54], imageData[fatOffset + 55], imageData[fatOffset + 56], imageData[fatOffset + 57], imageData[fatOffset + 58]) + : ""; + const fat32Sig = imageData.length >= fatOffset + 90 + ? String.fromCharCode(imageData[fatOffset + 82], imageData[fatOffset + 83], imageData[fatOffset + 84], imageData[fatOffset + 85], imageData[fatOffset + 86]) + : ""; + if (fat16Sig.startsWith("FAT") || fat32Sig.startsWith("FAT")) { + return FilesystemType.FATFS; + } + } + } + // Check for SPIFFS magic (0x20140529) + if (imageData.length >= 4) { + const spiffsMagic = imageData[0] | + (imageData[1] << 8) | + (imageData[2] << 16) | + (imageData[3] << 24); + if (spiffsMagic === 0x20140529) { + return FilesystemType.SPIFFS; + } + } + // Check for SPIFFS filesystem using pattern detection + if (detectSPIFFSPatterns(imageData)) { + return FilesystemType.SPIFFS; + } + return FilesystemType.UNKNOWN; +} +/** + * Get appropriate block size for filesystem type and chip + */ +function getDefaultBlockSize(fsType, chipName) { + const isESP8266 = chipName === null || chipName === void 0 ? void 0 : chipName.toUpperCase().includes("ESP8266"); + switch (fsType) { + case FilesystemType.FATFS: + return FATFS_DEFAULT_BLOCK_SIZE; + case FilesystemType.LITTLEFS: + return isESP8266 + ? ESP8266_LITTLEFS_BLOCK_SIZE + : LITTLEFS_DEFAULT_BLOCK_SIZE; + default: + return isESP8266 ? ESP8266_LITTLEFS_BLOCK_SIZE : 4096; + } +} +/** + * Get block size candidates for filesystem type and chip + */ +function getBlockSizeCandidates(fsType, chipName) { + const isESP8266 = chipName === null || chipName === void 0 ? void 0 : chipName.toUpperCase().includes("ESP8266"); + switch (fsType) { + case FilesystemType.FATFS: + return FATFS_BLOCK_SIZE_CANDIDATES; + case FilesystemType.LITTLEFS: + return isESP8266 + ? ESP8266_LITTLEFS_BLOCK_SIZE_CANDIDATES + : LITTLEFS_BLOCK_SIZE_CANDIDATES; + default: + return isESP8266 + ? ESP8266_LITTLEFS_BLOCK_SIZE_CANDIDATES + : [4096, 2048, 1024, 512]; + } +} + +/** + * ESP32 Partition Table Parser + * Based on ESP-IDF partition table format + */ +// Partition types +const PARTITION_TYPES = { + 0x00: "app", + 0x01: "data", +}; +// App subtypes +const APP_SUBTYPES = { + 0x00: "factory", + 0x10: "ota_0", + 0x11: "ota_1", + 0x12: "ota_2", + 0x13: "ota_3", + 0x14: "ota_4", + 0x15: "ota_5", + 0x16: "ota_6", + 0x17: "ota_7", + 0x18: "ota_8", + 0x19: "ota_9", + 0x1a: "ota_10", + 0x1b: "ota_11", + 0x1c: "ota_12", + 0x1d: "ota_13", + 0x1e: "ota_14", + 0x1f: "ota_15", + 0x20: "test", +}; +// Data subtypes +const DATA_SUBTYPES = { + 0x00: "ota", + 0x01: "phy", + 0x02: "nvs", + 0x03: "coredump", + 0x04: "nvs_keys", + 0x05: "efuse", + 0x80: "esphttpd", + 0x81: "fat", + 0x82: "spiffs", + 0x83: "littlefs", +}; +const PARTITION_ENTRY_SIZE = 32; +const PARTITION_MAGIC = 0x50aa; +/** + * Parse a single partition entry from binary data + */ +function parsePartitionEntry(data) { + if (data.length < PARTITION_ENTRY_SIZE) { + return null; + } + // Check magic bytes + const magic = (data[0] | (data[1] << 8)) & 0xffff; + if (magic !== PARTITION_MAGIC) { + return null; + } + const type = data[2]; + const subtype = data[3]; + const offset = data[4] | (data[5] << 8) | (data[6] << 16) | (data[7] << 24); + const size = data[8] | (data[9] << 8) | (data[10] << 16) | (data[11] << 24); + // Name is at offset 12, max 16 bytes, null-terminated + let name = ""; + for (let i = 12; i < 28; i++) { + if (data[i] === 0) + break; + name += String.fromCharCode(data[i]); + } + const flags = data[28] | (data[29] << 8) | (data[30] << 16) | (data[31] << 24); + // Get type and subtype names + const typeName = PARTITION_TYPES[type] || `unknown(0x${type.toString(16)})`; + let subtypeName = ""; + if (type === 0x00) { + subtypeName = APP_SUBTYPES[subtype] || `unknown(0x${subtype.toString(16)})`; + } + else if (type === 0x01) { + subtypeName = + DATA_SUBTYPES[subtype] || `unknown(0x${subtype.toString(16)})`; + } + else { + subtypeName = `0x${subtype.toString(16)}`; + } + return { + name, + type, + subtype, + offset, + size, + flags, + typeName, + subtypeName, + }; +} +/** + * Parse the entire partition table + */ +function parsePartitionTable(data) { + const partitions = []; + for (let i = 0; i < data.length; i += PARTITION_ENTRY_SIZE) { + const entryData = data.slice(i, i + PARTITION_ENTRY_SIZE); + const partition = parsePartitionEntry(entryData); + if (partition === null) { + // End of partition table or invalid entry + break; + } + partitions.push(partition); + } + return partitions; +} +/** + * Format size in human-readable format + */ +function formatSize(bytes) { + if (bytes < 1024) { + return `${bytes} B`; + } + else if (bytes < 1024 * 1024) { + return `${(bytes / 1024).toFixed(2)} KB`; + } + else { + return `${(bytes / (1024 * 1024)).toFixed(2)} MB`; + } +} + +/** + * SPIFFS Build Configuration + * Based on ESP-IDF spiffsgen.py + */ +const SPIFFS_PH_FLAG_USED_FINAL_INDEX = 0xf8; +const SPIFFS_PH_FLAG_USED_FINAL = 0xfc; +const SPIFFS_PH_FLAG_LEN = 1; +const SPIFFS_PH_IX_SIZE_LEN = 4; +const SPIFFS_PH_IX_OBJ_TYPE_LEN = 1; +const SPIFFS_TYPE_FILE = 1; +// Based on typedefs under spiffs_config.h +const SPIFFS_OBJ_ID_LEN = 2; // spiffs_obj_id +const SPIFFS_SPAN_IX_LEN = 2; // spiffs_span_ix +const SPIFFS_PAGE_IX_LEN = 2; // spiffs_page_ix +const SPIFFS_BLOCK_IX_LEN = 2; // spiffs_block_ix +class SpiffsBuildConfig { + constructor(options) { + var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m; + if (options.blockSize % options.pageSize !== 0) { + throw new Error("block size should be a multiple of page size"); + } + this.pageSize = options.pageSize; + this.blockSize = options.blockSize; + this.objIdLen = (_a = options.objIdLen) !== null && _a !== void 0 ? _a : SPIFFS_OBJ_ID_LEN; + this.spanIxLen = (_b = options.spanIxLen) !== null && _b !== void 0 ? _b : SPIFFS_SPAN_IX_LEN; + this.packed = (_c = options.packed) !== null && _c !== void 0 ? _c : true; + this.aligned = (_d = options.aligned) !== null && _d !== void 0 ? _d : true; + this.objNameLen = (_e = options.objNameLen) !== null && _e !== void 0 ? _e : 32; + this.metaLen = (_f = options.metaLen) !== null && _f !== void 0 ? _f : 4; + this.pageIxLen = (_g = options.pageIxLen) !== null && _g !== void 0 ? _g : SPIFFS_PAGE_IX_LEN; + this.blockIxLen = (_h = options.blockIxLen) !== null && _h !== void 0 ? _h : SPIFFS_BLOCK_IX_LEN; + this.endianness = (_j = options.endianness) !== null && _j !== void 0 ? _j : "little"; + this.useMagic = (_k = options.useMagic) !== null && _k !== void 0 ? _k : true; + this.useMagicLen = (_l = options.useMagicLen) !== null && _l !== void 0 ? _l : true; + this.alignedObjIxTables = (_m = options.alignedObjIxTables) !== null && _m !== void 0 ? _m : false; + this.PAGES_PER_BLOCK = Math.floor(this.blockSize / this.pageSize); + this.OBJ_LU_PAGES_PER_BLOCK = Math.ceil(((this.blockSize / this.pageSize) * this.objIdLen) / this.pageSize); + this.OBJ_USABLE_PAGES_PER_BLOCK = + this.PAGES_PER_BLOCK - this.OBJ_LU_PAGES_PER_BLOCK; + this.OBJ_LU_PAGES_OBJ_IDS_LIM = Math.floor(this.pageSize / this.objIdLen); + this.OBJ_DATA_PAGE_HEADER_LEN = + this.objIdLen + this.spanIxLen + SPIFFS_PH_FLAG_LEN; + const pad = 4 - + (this.OBJ_DATA_PAGE_HEADER_LEN % 4 === 0 + ? 4 + : this.OBJ_DATA_PAGE_HEADER_LEN % 4); + this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED = this.OBJ_DATA_PAGE_HEADER_LEN + pad; + this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD = pad; + this.OBJ_DATA_PAGE_CONTENT_LEN = + this.pageSize - this.OBJ_DATA_PAGE_HEADER_LEN; + this.OBJ_INDEX_PAGES_HEADER_LEN = + this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED + + SPIFFS_PH_IX_SIZE_LEN + + SPIFFS_PH_IX_OBJ_TYPE_LEN + + this.objNameLen + + this.metaLen; + if (this.alignedObjIxTables) { + this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED = + (this.OBJ_INDEX_PAGES_HEADER_LEN + SPIFFS_PAGE_IX_LEN - 1) & + -2; + this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD = + this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED - + this.OBJ_INDEX_PAGES_HEADER_LEN; + } + else { + this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED = this.OBJ_INDEX_PAGES_HEADER_LEN; + this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD = 0; + } + this.OBJ_INDEX_PAGES_OBJ_IDS_HEAD_LIM = Math.floor((this.pageSize - this.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED) / + this.blockIxLen); + this.OBJ_INDEX_PAGES_OBJ_IDS_LIM = Math.floor((this.pageSize - this.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED) / this.blockIxLen); + } +} +class SpiffsFullError extends Error { + constructor(message = "SPIFFS is full") { + super(message); + this.name = "SpiffsFullError"; + } +} + +/** + * SPIFFS Page Classes + * Based on ESP-IDF spiffsgen.py + */ +class SpiffsPage { + constructor(bix, buildConfig) { + this.buildConfig = buildConfig; + this.bix = bix; + } + pack(format, ...values) { + const buffer = new ArrayBuffer(this.calcSize(format)); + const view = new DataView(buffer); + let offset = 0; + for (let i = 0; i < format.length; i++) { + const type = format[i]; + const value = values[i]; + switch (type) { + case "B": // unsigned char (1 byte) + view.setUint8(offset, value); + offset += 1; + break; + case "H": // unsigned short (2 bytes) + if (this.buildConfig.endianness === "little") { + view.setUint16(offset, value, true); + } + else { + view.setUint16(offset, value, false); + } + offset += 2; + break; + case "I": // unsigned int (4 bytes) + if (this.buildConfig.endianness === "little") { + view.setUint32(offset, value, true); + } + else { + view.setUint32(offset, value, false); + } + offset += 4; + break; + } + } + return new Uint8Array(buffer); + } + unpack(format, data, offset = 0) { + const view = new DataView(data.buffer, data.byteOffset + offset); + const results = []; + let pos = 0; + for (const type of format) { + switch (type) { + case "B": + results.push(view.getUint8(pos)); + pos += 1; + break; + case "H": + results.push(this.buildConfig.endianness === "little" + ? view.getUint16(pos, true) + : view.getUint16(pos, false)); + pos += 2; + break; + case "I": + results.push(this.buildConfig.endianness === "little" + ? view.getUint32(pos, true) + : view.getUint32(pos, false)); + pos += 4; + break; + } + } + return results; + } + calcSize(format) { + let size = 0; + for (const type of format) { + switch (type) { + case "B": + size += 1; + break; + case "H": + size += 2; + break; + case "I": + size += 4; + break; + } + } + return size; + } +} +class SpiffsObjPageWithIdx extends SpiffsPage { + constructor(objId, buildConfig) { + super(0, buildConfig); + this.objId = objId; + } + getObjId() { + return this.objId; + } +} +class SpiffsObjLuPage extends SpiffsPage { + constructor(bix, buildConfig) { + super(bix, buildConfig); + this.objIdsLimit = this.buildConfig.OBJ_LU_PAGES_OBJ_IDS_LIM; + this.objIds = []; + } + calcMagic(blocksLim) { + let magic = 0x20140529 ^ this.buildConfig.pageSize; + if (this.buildConfig.useMagicLen) { + magic = magic ^ (blocksLim - this.bix); + } + const mask = (1 << (8 * this.buildConfig.objIdLen)) - 1; + return magic & mask; + } + registerPage(page) { + if (this.objIdsLimit <= 0) { + throw new SpiffsFullError(); + } + const pageType = page instanceof SpiffsObjIndexPage ? "index" : "data"; + this.objIds.push([page.getObjId(), pageType]); + this.objIdsLimit--; + } + toBinary() { + const img = new Uint8Array(this.buildConfig.pageSize); + img.fill(0xff); + let offset = 0; + for (const [objId, pageType] of this.objIds) { + let id = objId; + if (pageType === "index") { + id ^= 1 << (this.buildConfig.objIdLen * 8 - 1); + } + const packed = this.pack(this.buildConfig.objIdLen === 1 + ? "B" + : this.buildConfig.objIdLen === 2 + ? "H" + : "I", id); + img.set(packed, offset); + offset += packed.length; + } + return img; + } + magicfy(blocksLim) { + const remaining = this.objIdsLimit; + const emptyObjId = (1 << (this.buildConfig.objIdLen * 8)) - 1; + if (remaining >= 2) { + for (let i = 0; i < remaining; i++) { + if (i === remaining - 2) { + this.objIds.push([this.calcMagic(blocksLim), "data"]); + break; + } + else { + this.objIds.push([emptyObjId, "data"]); + } + this.objIdsLimit--; + } + } + } +} +class SpiffsObjIndexPage extends SpiffsObjPageWithIdx { + constructor(objId, spanIx, size, name, buildConfig) { + super(objId, buildConfig); + this.spanIx = spanIx; + this.name = name; + this.size = size; + if (this.spanIx === 0) { + this.pagesLim = this.buildConfig.OBJ_INDEX_PAGES_OBJ_IDS_HEAD_LIM; + } + else { + this.pagesLim = this.buildConfig.OBJ_INDEX_PAGES_OBJ_IDS_LIM; + } + this.pages = []; + } + registerPage(page) { + if (this.pagesLim <= 0) { + throw new SpiffsFullError(); + } + this.pages.push(page.offset); + this.pagesLim--; + } + toBinary() { + const img = new Uint8Array(this.buildConfig.pageSize); + img.fill(0xff); + const objId = this.objId ^ (1 << (this.buildConfig.objIdLen * 8 - 1)); + const format = (this.buildConfig.objIdLen === 1 + ? "B" + : this.buildConfig.objIdLen === 2 + ? "H" + : "I") + + (this.buildConfig.spanIxLen === 1 + ? "B" + : this.buildConfig.spanIxLen === 2 + ? "H" + : "I") + + "B"; + let offset = 0; + const header = this.pack(format, objId, this.spanIx, SPIFFS_PH_FLAG_USED_FINAL_INDEX); + img.set(header, offset); + offset += header.length; + // Add padding + offset += this.buildConfig.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD; + // If first index page, add filename, type and size + if (this.spanIx === 0) { + const sizeType = this.pack("IB", this.size, SPIFFS_TYPE_FILE); + img.set(sizeType, offset); + offset += sizeType.length; + // Write filename with proper null-termination + const nameBytes = new TextEncoder().encode(this.name); + // Ensure we don't exceed objNameLen + const bytesToWrite = Math.min(nameBytes.length, this.buildConfig.objNameLen); + img.set(nameBytes.slice(0, bytesToWrite), offset); + // The rest is already 0xFF from img.fill(0xff), but SPIFFS expects 0x00 for unused name bytes + // Fill remaining name bytes with 0x00 + for (let i = bytesToWrite; i < this.buildConfig.objNameLen; i++) { + img[offset + i] = 0x00; + } + offset += + this.buildConfig.objNameLen + + this.buildConfig.metaLen + + this.buildConfig.OBJ_INDEX_PAGES_HEADER_LEN_ALIGNED_PAD; + } + // Add page indices + for (const page of this.pages) { + // Calculate page index by dividing page offset by page size + // pageSize is always a power of 2, so integer division is safe + const pageIx = Math.floor(page / this.buildConfig.pageSize); + const pageIxPacked = this.pack(this.buildConfig.pageIxLen === 1 + ? "B" + : this.buildConfig.pageIxLen === 2 + ? "H" + : "I", pageIx); + img.set(pageIxPacked, offset); + offset += pageIxPacked.length; + } + return img; + } +} +class SpiffsObjDataPage extends SpiffsObjPageWithIdx { + constructor(offset, objId, spanIx, contents, buildConfig) { + super(objId, buildConfig); + this.offset = offset; + this.spanIx = spanIx; + this.contents = contents; + } + toBinary() { + const img = new Uint8Array(this.buildConfig.pageSize); + img.fill(0xff); + const format = (this.buildConfig.objIdLen === 1 + ? "B" + : this.buildConfig.objIdLen === 2 + ? "H" + : "I") + + (this.buildConfig.spanIxLen === 1 + ? "B" + : this.buildConfig.spanIxLen === 2 + ? "H" + : "I") + + "B"; + const header = this.pack(format, this.objId, this.spanIx, SPIFFS_PH_FLAG_USED_FINAL); + img.set(header, 0); + img.set(this.contents, header.length); + return img; + } +} + +/** + * SPIFFS Block Class + * Based on ESP-IDF spiffsgen.py + */ +class SpiffsBlock { + constructor(bix, buildConfig) { + this.buildConfig = buildConfig; + this.offset = bix * this.buildConfig.blockSize; + this.remainingPages = this.buildConfig.OBJ_USABLE_PAGES_PER_BLOCK; + this.pages = []; + this.bix = bix; + this.luPages = []; + for (let i = 0; i < this.buildConfig.OBJ_LU_PAGES_PER_BLOCK; i++) { + const page = new SpiffsObjLuPage(this.bix, this.buildConfig); + this.luPages.push(page); + } + this.pages.push(...this.luPages); + this.luPageIter = this.luPages[Symbol.iterator](); + this.luPage = this.luPageIter.next().value || null; + this.curObjIndexSpanIx = 0; + this.curObjDataSpanIx = 0; + this.curObjId = 0; + this.curObjIdxPage = null; + } + reset() { + this.curObjIndexSpanIx = 0; + this.curObjDataSpanIx = 0; + this.curObjId = 0; + this.curObjIdxPage = null; + } + registerPage(page) { + if (page instanceof SpiffsObjDataPage) { + if (!this.curObjIdxPage) { + throw new Error("No current object index page"); + } + this.curObjIdxPage.registerPage(page); + } + try { + if (!this.luPage) { + throw new SpiffsFullError(); + } + this.luPage.registerPage(page); + } + catch (e) { + if (e instanceof SpiffsFullError) { + const next = this.luPageIter.next(); + if (next.done) { + throw new Error("Invalid attempt to add page to a block when there is no more space in lookup"); + } + this.luPage = next.value; + this.luPage.registerPage(page); + } + else { + throw e; + } + } + this.pages.push(page); + } + beginObj(objId, size, name, objIndexSpanIx = 0, objDataSpanIx = 0) { + if (this.remainingPages <= 0) { + throw new SpiffsFullError(); + } + this.reset(); + this.curObjId = objId; + this.curObjIndexSpanIx = objIndexSpanIx; + this.curObjDataSpanIx = objDataSpanIx; + const page = new SpiffsObjIndexPage(objId, this.curObjIndexSpanIx, size, name, this.buildConfig); + this.registerPage(page); + this.curObjIdxPage = page; + this.remainingPages--; + this.curObjIndexSpanIx++; + } + updateObj(contents) { + if (this.remainingPages <= 0) { + throw new SpiffsFullError(); + } + const page = new SpiffsObjDataPage(this.offset + this.pages.length * this.buildConfig.pageSize, this.curObjId, this.curObjDataSpanIx, contents, this.buildConfig); + this.registerPage(page); + this.curObjDataSpanIx++; + this.remainingPages--; + } + endObj() { + this.reset(); + } + isFull() { + return this.remainingPages <= 0; + } + toBinary(blocksLim) { + const img = new Uint8Array(this.buildConfig.blockSize); + img.fill(0xff); + let offset = 0; + if (this.buildConfig.useMagic) { + for (let idx = 0; idx < this.pages.length; idx++) { + const page = this.pages[idx]; + if (idx === this.buildConfig.OBJ_LU_PAGES_PER_BLOCK - 1) { + if (page instanceof SpiffsObjLuPage) { + page.magicfy(blocksLim); + } + } + const pageBinary = page.toBinary(); + img.set(pageBinary, offset); + offset += pageBinary.length; + } + } + else { + for (const page of this.pages) { + const pageBinary = page.toBinary(); + img.set(pageBinary, offset); + offset += pageBinary.length; + } + } + return img; + } + get currentObjIndexSpanIx() { + return this.curObjIndexSpanIx; + } + get currentObjDataSpanIx() { + return this.curObjDataSpanIx; + } + get currentObjId() { + return this.curObjId; + } + get currentObjIdxPage() { + return this.curObjIdxPage; + } + set currentObjId(value) { + this.curObjId = value; + } + set currentObjIdxPage(value) { + this.curObjIdxPage = value; + } + set currentObjDataSpanIx(value) { + this.curObjDataSpanIx = value; + } + set currentObjIndexSpanIx(value) { + this.curObjIndexSpanIx = value; + } +} + +/** + * SPIFFS Filesystem Implementation + * Based on ESP-IDF spiffsgen.py + */ +class SpiffsFS { + constructor(imgSize, buildConfig) { + if (imgSize % buildConfig.blockSize !== 0) { + throw new Error("image size should be a multiple of block size"); + } + this.imgSize = imgSize; + this.buildConfig = buildConfig; + this.blocks = []; + this.blocksLim = Math.floor(this.imgSize / this.buildConfig.blockSize); + this.remainingBlocks = this.blocksLim; + this.curObjId = 1; // starting object id + } + createBlock() { + if (this.isFull()) { + throw new SpiffsFullError("the image size has been exceeded"); + } + const block = new SpiffsBlock(this.blocks.length, this.buildConfig); + this.blocks.push(block); + this.remainingBlocks--; + return block; + } + isFull() { + return this.remainingBlocks <= 0; + } + createFile(imgPath, contents) { + if (imgPath.length > this.buildConfig.objNameLen) { + throw new Error(`object name '${imgPath}' too long`); + } + const name = imgPath; + let offset = 0; + try { + const block = this.blocks[this.blocks.length - 1]; + block.beginObj(this.curObjId, contents.length, name); + } + catch { + const block = this.createBlock(); + block.beginObj(this.curObjId, contents.length, name); + } + while (offset < contents.length) { + const chunkSize = Math.min(this.buildConfig.OBJ_DATA_PAGE_CONTENT_LEN, contents.length - offset); + const contentsChunk = contents.slice(offset, offset + chunkSize); + try { + const block = this.blocks[this.blocks.length - 1]; + try { + block.updateObj(contentsChunk); + } + catch (e) { + if (e instanceof SpiffsFullError) { + if (block.isFull()) { + throw e; + } + // Object index exhausted, write another object index page + block.beginObj(this.curObjId, contents.length, name, block.currentObjIndexSpanIx, block.currentObjDataSpanIx); + continue; + } + throw e; + } + } + catch (e) { + if (e instanceof SpiffsFullError) { + // All pages in block exhausted, create new block + const prevBlock = this.blocks[this.blocks.length - 1]; + const block = this.createBlock(); + block.currentObjId = prevBlock.currentObjId; + block.currentObjIdxPage = prevBlock.currentObjIdxPage; + block.currentObjDataSpanIx = prevBlock.currentObjDataSpanIx; + block.currentObjIndexSpanIx = prevBlock.currentObjIndexSpanIx; + continue; + } + throw e; + } + offset += chunkSize; + } + const block = this.blocks[this.blocks.length - 1]; + block.endObj(); + this.curObjId++; + } + toBinary() { + const allBlocks = []; + for (const block of this.blocks) { + allBlocks.push(block.toBinary(this.blocksLim)); + } + let bix = this.blocks.length; + let remaining = this.remainingBlocks; + if (this.buildConfig.useMagic) { + // Create empty blocks with magic numbers + while (remaining > 0) { + const block = new SpiffsBlock(bix, this.buildConfig); + allBlocks.push(block.toBinary(this.blocksLim)); + remaining--; + bix++; + } + } + else { + // Fill remaining space with 0xFF + const remainingSize = this.imgSize - allBlocks.length * this.buildConfig.blockSize; + if (remainingSize > 0) { + const padding = new Uint8Array(remainingSize); + padding.fill(0xff); + allBlocks.push(padding); + } + } + // Concatenate all blocks + const totalSize = allBlocks.reduce((sum, block) => sum + block.length, 0); + const img = new Uint8Array(totalSize); + let offset = 0; + for (const block of allBlocks) { + img.set(block, offset); + offset += block.length; + } + return img; + } + listFiles() { + // This would require parsing the blocks - implement in fromBinary + throw new Error("listFiles requires fromBinary to be called first"); + } + readFile() { + // This would require parsing the blocks - implement in fromBinary + throw new Error("readFile requires fromBinary to be called first"); + } + deleteFile() { + // SPIFFS doesn't support in-place deletion + // Need to recreate filesystem without the file + throw new Error("deleteFile not yet implemented - requires filesystem recreation"); + } +} + +/** + * SPIFFS Reader - Parse and extract files from SPIFFS images + * Based on ESP-IDF spiffsgen.py extract_files() method + */ +class SpiffsReader { + constructor(imageData, buildConfig) { + this.imageData = imageData; + this.buildConfig = buildConfig; + this.filesMap = new Map(); + } + unpack(format, data, offset = 0) { + const view = new DataView(data.buffer, data.byteOffset + offset); + const results = []; + let pos = 0; + for (const type of format) { + switch (type) { + case "B": + results.push(view.getUint8(pos)); + pos += 1; + break; + case "H": + results.push(this.buildConfig.endianness === "little" + ? view.getUint16(pos, true) + : view.getUint16(pos, false)); + pos += 2; + break; + case "I": + results.push(this.buildConfig.endianness === "little" + ? view.getUint32(pos, true) + : view.getUint32(pos, false)); + pos += 4; + break; + } + } + return results; + } + parse() { + const blocksCount = Math.floor(this.imageData.length / this.buildConfig.blockSize); + for (let bix = 0; bix < blocksCount; bix++) { + const blockOffset = bix * this.buildConfig.blockSize; + const blockData = this.imageData.slice(blockOffset, blockOffset + this.buildConfig.blockSize); + this.parseBlock(blockData); + } + } + parseBlock(blockData) { + // Parse lookup pages to find valid objects + for (let pageIdx = 0; pageIdx < this.buildConfig.OBJ_LU_PAGES_PER_BLOCK; pageIdx++) { + const luPageOffset = pageIdx * this.buildConfig.pageSize; + const luPageData = blockData.slice(luPageOffset, luPageOffset + this.buildConfig.pageSize); + // Parse object IDs from lookup page + for (let i = 0; i < luPageData.length; i += this.buildConfig.objIdLen) { + if (i + this.buildConfig.objIdLen > luPageData.length) + break; + const objIdBytes = luPageData.slice(i, i + this.buildConfig.objIdLen); + const [objId] = this.unpack(this.buildConfig.objIdLen === 1 + ? "B" + : this.buildConfig.objIdLen === 2 + ? "H" + : "I", objIdBytes); + // Check if it's a valid object (not erased/empty) + const emptyValue = (1 << (this.buildConfig.objIdLen * 8)) - 1; + if (objId === emptyValue) + continue; + // Check if it's an index page (MSB set) + const isIndex = (objId & (1 << (this.buildConfig.objIdLen * 8 - 1))) !== 0; + const realObjId = objId & ~(1 << (this.buildConfig.objIdLen * 8 - 1)); + if (isIndex && !this.filesMap.has(realObjId)) { + this.filesMap.set(realObjId, { + name: null, + size: 0, + dataPages: [], + }); + } + } + } + // Parse actual pages to get file metadata and content + for (let pageIdx = this.buildConfig.OBJ_LU_PAGES_PER_BLOCK; pageIdx < this.buildConfig.PAGES_PER_BLOCK; pageIdx++) { + const pageOffset = pageIdx * this.buildConfig.pageSize; + const pageData = blockData.slice(pageOffset, pageOffset + this.buildConfig.pageSize); + this.parsePage(pageData); + } + } + parsePage(pageData) { + // Parse page header + const headerFormat = (this.buildConfig.objIdLen === 1 + ? "B" + : this.buildConfig.objIdLen === 2 + ? "H" + : "I") + + (this.buildConfig.spanIxLen === 1 + ? "B" + : this.buildConfig.spanIxLen === 2 + ? "H" + : "I") + + "B"; + const headerSize = this.buildConfig.objIdLen + + this.buildConfig.spanIxLen + + SPIFFS_PH_FLAG_LEN; + if (pageData.length < headerSize) + return; + const [objId, spanIx, flags] = this.unpack(headerFormat, pageData); + // Check for valid page + const emptyId = (1 << (this.buildConfig.objIdLen * 8)) - 1; + if (objId === emptyId) + return; + const isIndex = (objId & (1 << (this.buildConfig.objIdLen * 8 - 1))) !== 0; + const realObjId = objId & ~(1 << (this.buildConfig.objIdLen * 8 - 1)); + if (isIndex && flags === SPIFFS_PH_FLAG_USED_FINAL_INDEX) { + // Index page - contains file metadata + if (!this.filesMap.has(realObjId)) { + this.filesMap.set(realObjId, { + name: null, + size: 0, + dataPages: [], + }); + } + // Only first index page (span_ix == 0) has filename and size + if (spanIx === 0) { + this.parseIndexPage(pageData, headerSize, realObjId); + } + } + else if (!isIndex && flags === SPIFFS_PH_FLAG_USED_FINAL) { + // Data page - contains file content + if (this.filesMap.has(realObjId)) { + const contentStart = headerSize; + const content = pageData.slice(contentStart, contentStart + this.buildConfig.OBJ_DATA_PAGE_CONTENT_LEN); + this.filesMap.get(realObjId).dataPages.push([spanIx, content]); + } + } + } + parseIndexPage(pageData, headerSize, objId) { + // Skip to size and type fields + let offset = headerSize + this.buildConfig.OBJ_DATA_PAGE_HEADER_LEN_ALIGNED_PAD; + const sizeTypeFormat = "IB"; + const sizeTypeSize = SPIFFS_PH_IX_SIZE_LEN + SPIFFS_PH_IX_OBJ_TYPE_LEN; + if (offset + sizeTypeSize <= pageData.length) { + const [fileSize] = this.unpack(sizeTypeFormat, pageData, offset); + offset += sizeTypeSize; + // Read filename + const nameEnd = offset + this.buildConfig.objNameLen; + if (nameEnd <= pageData.length) { + const nameBytes = pageData.slice(offset, nameEnd); + // Find null terminator + const nullPos = nameBytes.indexOf(0); + const actualNameBytes = nullPos !== -1 ? nameBytes.slice(0, nullPos) : nameBytes; + const filename = new TextDecoder().decode(actualNameBytes); + const fileInfo = this.filesMap.get(objId); + fileInfo.name = filename; + fileInfo.size = fileSize; + } + } + } + listFiles() { + const files = []; + for (const [, fileInfo] of this.filesMap) { + if (fileInfo.name === null) + continue; + // Sort data pages by span index + fileInfo.dataPages.sort((a, b) => a[0] - b[0]); + // Reconstruct file content + const chunks = []; + let totalWritten = 0; + for (const [, content] of fileInfo.dataPages) { + const remaining = fileInfo.size - totalWritten; + if (remaining <= 0) + break; + const toWrite = Math.min(content.length, remaining); + chunks.push(content.slice(0, toWrite)); + totalWritten += toWrite; + } + // Concatenate chunks + const data = new Uint8Array(totalWritten); + let offset = 0; + for (const chunk of chunks) { + data.set(chunk, offset); + offset += chunk.length; + } + files.push({ + name: fileInfo.name, + size: fileInfo.size, + data, + }); + } + return files; + } + readFile(path) { + const files = this.listFiles(); + const file = files.find((f) => f.name === path || f.name === "/" + path); + return file ? file.data : null; + } +} + +/** + * SPIFFS Module Entry Point + */ +// Default ESP32 SPIFFS configuration +const DEFAULT_SPIFFS_CONFIG = { + pageSize: 256, + blockSize: 4096, + objNameLen: 32, + metaLen: 4, + useMagic: true, + useMagicLen: true, + alignedObjIxTables: false, +}; + +/// +const connect = async (logger) => { + // - Request a port and open a connection. + // Try to use requestSerialPort if available (supports WebUSB for Android) + let port; + const customRequestPort = globalThis.requestSerialPort; + if (typeof customRequestPort === "function") { + port = await customRequestPort(); + } + else { + // Check if Web Serial API is available + if (!navigator.serial) { + throw new Error("Web Serial API is not supported in this browser. " + + "Please use Chrome, Edge, or Opera on desktop, or Chrome on Android. " + + "Note: The page must be served over HTTPS or localhost."); + } + port = await navigator.serial.requestPort(); + } + // Only open if not already open (requestSerialPort may return an opened port) + if (!port.readable || !port.writable) { + await port.open({ baudRate: ESP_ROM_BAUD }); + } + return new ESPLoader(port, logger); +}; +const connectWithPort = async (port, logger) => { + // Connect using an already opened port (useful for WebUSB wrapper) + if (!port) { + throw new Error("Port is required"); + } + // Check if port is already open, if not open it + if (!port.readable || !port.writable) { + await port.open({ baudRate: ESP_ROM_BAUD }); + } + return new ESPLoader(port, logger); +}; + +export { CHIP_ERASE_TIMEOUT, CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32C2, CHIP_FAMILY_ESP32C3, CHIP_FAMILY_ESP32C5, CHIP_FAMILY_ESP32C6, CHIP_FAMILY_ESP32C61, CHIP_FAMILY_ESP32H2, CHIP_FAMILY_ESP32H21, CHIP_FAMILY_ESP32H4, CHIP_FAMILY_ESP32P4, CHIP_FAMILY_ESP32S2, CHIP_FAMILY_ESP32S3, CHIP_FAMILY_ESP32S31, CHIP_FAMILY_ESP8266, DEFAULT_SPIFFS_CONFIG, DEFAULT_TIMEOUT, ERASE_REGION_TIMEOUT_PER_MB, ESP8266_LITTLEFS_BLOCK_SIZE, ESP8266_LITTLEFS_BLOCK_SIZE_CANDIDATES, ESP8266_LITTLEFS_PAGE_SIZE, ESP8266_SPIFFS_BLOCK_SIZE, ESP8266_SPIFFS_PAGE_SIZE, ESPLoader, ESP_CHANGE_BAUDRATE, ESP_CHECKSUM_MAGIC, ESP_ERASE_FLASH, ESP_ERASE_REGION, ESP_FLASH_BEGIN, ESP_FLASH_DATA, ESP_FLASH_DEFL_BEGIN, ESP_FLASH_DEFL_DATA, ESP_FLASH_DEFL_END, ESP_FLASH_END, ESP_GET_SECURITY_INFO, ESP_MEM_BEGIN, ESP_MEM_DATA, ESP_MEM_END, ESP_RAM_BLOCK, ESP_READ_FLASH, ESP_READ_REG, ESP_SPI_ATTACH, ESP_SPI_FLASH_MD5, ESP_SPI_SET_PARAMS, ESP_SYNC, ESP_WRITE_REG, FATFS_BLOCK_SIZE_CANDIDATES, FATFS_DEFAULT_BLOCK_SIZE, FLASH_READ_TIMEOUT, FilesystemType, LITTLEFS_BLOCK_SIZE_CANDIDATES, LITTLEFS_DEFAULT_BLOCK_SIZE, MAX_TIMEOUT, MEM_END_ROM_TIMEOUT, ROM_INVALID_RECV_MSG, SYNC_TIMEOUT, SpiffsBuildConfig, SpiffsFS, SpiffsReader, USB_RAM_BLOCK, connect, connectWithPort, detectFilesystemFromImage, detectFilesystemType, formatMacAddr, formatSize, getBlockSizeCandidates, getDefaultBlockSize, getESP8266FilesystemLayout, hexFormatter, parsePartitionTable, scanESP8266Filesystem, sleep, toHex }; diff --git a/src/const.ts b/src/const.ts index 9b522411..ce87167a 100644 --- a/src/const.ts +++ b/src/const.ts @@ -404,6 +404,8 @@ export const ESP32P4_GPIO_STRAP_REG = 0x500e0038; export const ESP32P4_GPIO_STRAP_SPI_BOOT_MASK = 0x8; // Not download mode export const ESP32P4_RTC_CNTL_OPTION1_REG = 0x50110008; export const ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 0x4; // Is download mode forced over USB? +export const ESP32P4_EFUSE_RD_REPEAT_DATA1_REG = ESP32P4_BASEFUSEADDR + 0x034; +export const ESP32P4_EFUSE_DOWNLOAD_MODE_XPD_ON_MASK = 0x1 << 16; // Flash power-on related registers and bits needed for ECO6 (Rev 301) export const ESP32P4_DR_REG_LPAON_BASE = 0x50110000; diff --git a/src/esp_loader.ts b/src/esp_loader.ts index 4f24343c..423c5dd1 100644 --- a/src/esp_loader.ts +++ b/src/esp_loader.ts @@ -67,6 +67,7 @@ import { ESP32C6_EFUSE_BLOCK1_ADDR, ESP32C61_EFUSE_BLOCK1_ADDR, ESP32H2_EFUSE_BLOCK1_ADDR, + ESP32H4_EFUSE_BLOCK1_ADDR, ESP32P4_EFUSE_BLOCK1_ADDR, ESP32S31_EFUSE_BLOCK1_ADDR, ESP32S31_RTC_CNTL_WDTWPROTECT_REG, @@ -106,6 +107,8 @@ import { ESP32P4_RTC_CNTL_WDT_WKEY, ESP32P4_RTC_CNTL_OPTION1_REG, ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, + ESP32P4_EFUSE_RD_REPEAT_DATA1_REG, + ESP32P4_EFUSE_DOWNLOAD_MODE_XPD_ON_MASK, ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG, ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0, @@ -193,13 +196,6 @@ export class ESPLoader extends EventTarget { return this._parent ? this._parent._isUsbJtagOrOtg : this._isUsbJtagOrOtg; } - // Adaptive speed adjustment for flash read operations - private __adaptiveBlockMultiplier: number = 1; - private __adaptiveMaxInFlightMultiplier: number = 1; - private __consecutiveSuccessfulChunks: number = 0; - private __lastAdaptiveAdjustment: number = 0; - private __isCDCDevice: boolean = false; - constructor( public port: SerialPort, public logger: Logger, @@ -385,74 +381,6 @@ export class ESPLoader extends EventTarget { } } - private get _adaptiveBlockMultiplier(): number { - return this._parent - ? this._parent._adaptiveBlockMultiplier - : this.__adaptiveBlockMultiplier; - } - - private set _adaptiveBlockMultiplier(value: number) { - if (this._parent) { - this._parent._adaptiveBlockMultiplier = value; - } else { - this.__adaptiveBlockMultiplier = value; - } - } - - private get _adaptiveMaxInFlightMultiplier(): number { - return this._parent - ? this._parent._adaptiveMaxInFlightMultiplier - : this.__adaptiveMaxInFlightMultiplier; - } - - private set _adaptiveMaxInFlightMultiplier(value: number) { - if (this._parent) { - this._parent._adaptiveMaxInFlightMultiplier = value; - } else { - this.__adaptiveMaxInFlightMultiplier = value; - } - } - - private get _consecutiveSuccessfulChunks(): number { - return this._parent - ? this._parent._consecutiveSuccessfulChunks - : this.__consecutiveSuccessfulChunks; - } - - private set _consecutiveSuccessfulChunks(value: number) { - if (this._parent) { - this._parent._consecutiveSuccessfulChunks = value; - } else { - this.__consecutiveSuccessfulChunks = value; - } - } - - private get _lastAdaptiveAdjustment(): number { - return this._parent - ? this._parent._lastAdaptiveAdjustment - : this.__lastAdaptiveAdjustment; - } - - private set _lastAdaptiveAdjustment(value: number) { - if (this._parent) { - this._parent._lastAdaptiveAdjustment = value; - } else { - this.__lastAdaptiveAdjustment = value; - } - } - - private get _isCDCDevice(): boolean { - return this._parent ? this._parent._isCDCDevice : this.__isCDCDevice; - } - - private set _isCDCDevice(value: boolean) { - if (this._parent) { - this._parent._isCDCDevice = value; - } else { - this.__isCDCDevice = value; - } - } - private detectUSBSerialChip( vendorId: number, productId: number, @@ -528,15 +456,6 @@ export class ESPLoader extends EventTarget { if (portInfo.usbVendorId === 0x303a && portInfo.usbProductId === 0x2) { this._isESP32S2NativeUSB = true; } - - // Detect CDC devices for adaptive speed adjustment - // Espressif Native USB (VID: 0x303a) or CH343 (VID: 0x1a86, PID: 0x55d3) - if ( - portInfo.usbVendorId === 0x303a || - (portInfo.usbVendorId === 0x1a86 && portInfo.usbProductId === 0x55d3) - ) { - this._isCDCDevice = true; - } } // Don't await this promise so it doesn't block rest of method. @@ -549,8 +468,12 @@ export class ESPLoader extends EventTarget { // Detect chip type await this.detectChip(); - // Power on flash for ESP32-P4 Rev 301 (must be done before loading stub) - if (this.chipFamily === CHIP_FAMILY_ESP32P4 && this.chipRevision === 301) { + // Power on flash for ESP32-P4 Rev 3.1 (301) & Rev 3.2 (302) + // (MUST be done BEFORE loading stub) + if ( + this.chipFamily === CHIP_FAMILY_ESP32P4 && + (this.chipRevision === 301 || this.chipRevision === 302) + ) { await this.powerOnFlash(); } @@ -755,6 +678,9 @@ export class ESPLoader extends EventTarget { break; } case CHIP_FAMILY_ESP32H4: { + const w3 = await this.readRegister(ESP32H4_EFUSE_BLOCK1_ADDR + 4 * 3); + minor = (w3 >> 18) & 0x0f; + major = (w3 >> 22) & 0x03; break; } case CHIP_FAMILY_ESP32H21: { @@ -778,20 +704,36 @@ export class ESPLoader extends EventTarget { } /** - * Power on the flash chip for ESP32-P4 Rev 301 (ECO6) - * The flash chip is powered off by default on ECO6, when the default flash - * voltage changed from 1.8V to 3.3V. This is to prevent damage to 1.8V flash chips. + * Power on the flash chip for ESP32-P4 Rev 3.1 (301) & Rev 3.2 (302). + * The flash chip is powered off by default on P4 Rev 3.1 (301) & Rev 3.2 (302) + * when the default flash voltage changed from 1.8V to 3.3V. + * This is to prevent damage to 1.8V flash chips. */ async powerOnFlash(): Promise { if (this.chipFamily !== CHIP_FAMILY_ESP32P4) { return; // Only needed for ESP32-P4 } - if (this.chipRevision !== 301) { - return; // Only needed for Rev 301 (ECO6) + const revision = this.chipRevision; + // Only Rev 3.1 (301) and Rev 3.2 (302) need the flash power handling below. + // All other revisions return immediately. + if (!revision || (revision !== 301 && revision !== 302)) { + return; } - this.logger.debug("Powering on flash for ESP32-P4 Rev 301 (ECO6)"); + // Rev 3.2 (302) may already have flash XPD asserted by ROM in download mode. + // When that efuse bit is set, clear the PMU force-on state and skip the + // Rev 3.1-style full power-on sequence. + if (revision && revision === 302) { + const efuseValue = await this.readRegister( + ESP32P4_EFUSE_RD_REPEAT_DATA1_REG, + ); + + if (efuseValue & ESP32P4_EFUSE_DOWNLOAD_MODE_XPD_ON_MASK) { + await this.writeRegister(ESP32P4_PMU_DATE_REG, 0); + return; + } + } // Power up pad group await this.writeRegister(ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG, 1); @@ -2102,188 +2044,87 @@ export class ESPLoader extends EventTarget { * @name readPacket * Generator to read SLIP packets from a serial port. * Yields one full SLIP packet at a time, raises exception on timeout or invalid data. - * - * Two implementations: - * - Burst: CDC devices (Native USB) and CH343 - very fast processing - * - Byte-by-byte: CH340, CP2102, and other USB-Serial adapters - stable fast processing */ async readPacket(timeout: number): Promise { let partialPacket: number[] | null = null; let inEscape = false; + let readBytes: number[] = []; + while (true) { + // Check abandon flag (for reset strategy timeout) + if (this._abandonCurrentOperation) { + throw new SlipReadError("Operation abandoned (reset strategy timeout)"); + } - // CDC devices use burst processing, non-CDC use byte-by-byte - if (this._isCDCDevice) { - // Burst version: Process all available bytes in one pass for ultra-high-speed transfers - // Used for: CDC devices (all platforms) and CH343 - const startTime = Date.now(); - - while (true) { - // Check abandon flag (for reset strategy timeout) - if (this._abandonCurrentOperation) { - throw new SlipReadError( - "Operation abandoned (reset strategy timeout)", - ); - } - - // Check timeout - if (Date.now() - startTime > timeout) { - const waitingFor = partialPacket === null ? "header" : "content"; - throw new SlipReadError("Timed out waiting for packet " + waitingFor); - } - - // If no data available, wait a bit - if (this._inputBufferAvailable === 0) { + const stamp = Date.now(); + readBytes = []; + while (Date.now() - stamp < timeout) { + if (this._inputBufferAvailable > 0) { + readBytes.push(this._readByte()!); + break; + } else { + // Reduced sleep time for faster response during high-speed transfers await sleep(1); - continue; - } - - // Process all available bytes without going back to outer loop - // This is critical for handling high-speed burst transfers - while (this._inputBufferAvailable > 0) { - // Periodic timeout check to prevent hang on slow data - if (Date.now() - startTime > timeout) { - const waitingFor = partialPacket === null ? "header" : "content"; - throw new SlipReadError( - "Timed out waiting for packet " + waitingFor, - ); - } - const byte = this._readByte()!; - - if (partialPacket === null) { - // waiting for packet header - if (byte == this.SLIP_END) { - partialPacket = []; - } else { - if (this.debug) { - this.logger.debug("Read invalid data: " + toHex(byte)); - this.logger.debug( - "Remaining data in serial buffer: " + - hexFormatter(this._inputBuffer), - ); - } - throw new SlipReadError( - "Invalid head of packet (" + toHex(byte) + ")", - ); - } - } else if (inEscape) { - // part-way through escape sequence - inEscape = false; - if (byte == this.SLIP_ESC_END) { - partialPacket.push(this.SLIP_END); - } else if (byte == this.SLIP_ESC_ESC) { - partialPacket.push(this.SLIP_ESC); - } else { - if (this.debug) { - this.logger.debug("Read invalid data: " + toHex(byte)); - this.logger.debug( - "Remaining data in serial buffer: " + - hexFormatter(this._inputBuffer), - ); - } - throw new SlipReadError( - "Invalid SLIP escape (0xdb, " + toHex(byte) + ")", - ); - } - } else if (byte == this.SLIP_ESC) { - // start of escape sequence - inEscape = true; - } else if (byte == this.SLIP_END) { - // end of packet - if (this.debug) - this.logger.debug( - "Received full packet: " + hexFormatter(partialPacket), - ); - // Compact buffer periodically to prevent memory growth - this._compactInputBuffer(); - return partialPacket; - } else { - // normal byte in packet - partialPacket.push(byte); - } } } - } else { - // Byte-by-byte version: Stable for non CDC USB-Serial adapters (CH340, CP2102, etc.) - let readBytes: number[] = []; - while (true) { - // Check abandon flag (for reset strategy timeout) - if (this._abandonCurrentOperation) { - throw new SlipReadError( - "Operation abandoned (reset strategy timeout)", - ); - } - - const stamp = Date.now(); - readBytes = []; - while (Date.now() - stamp < timeout) { - if (this._inputBufferAvailable > 0) { - readBytes.push(this._readByte()!); - break; + if (readBytes.length == 0) { + const waitingFor = partialPacket === null ? "header" : "content"; + throw new SlipReadError("Timed out waiting for packet " + waitingFor); + } + if (this.debug) + this.logger.debug( + "Read " + readBytes.length + " bytes: " + hexFormatter(readBytes), + ); + for (const byte of readBytes) { + if (partialPacket === null) { + // waiting for packet header + if (byte == this.SLIP_END) { + partialPacket = []; } else { - // Reduced sleep time for faster response during high-speed transfers - await sleep(1); - } - } - if (readBytes.length == 0) { - const waitingFor = partialPacket === null ? "header" : "content"; - throw new SlipReadError("Timed out waiting for packet " + waitingFor); - } - if (this.debug) - this.logger.debug( - "Read " + readBytes.length + " bytes: " + hexFormatter(readBytes), - ); - for (const byte of readBytes) { - if (partialPacket === null) { - // waiting for packet header - if (byte == this.SLIP_END) { - partialPacket = []; - } else { - if (this.debug) { - this.logger.debug("Read invalid data: " + toHex(byte)); - this.logger.debug( - "Remaining data in serial buffer: " + - hexFormatter(this._inputBuffer), - ); - } - throw new SlipReadError( - "Invalid head of packet (" + toHex(byte) + ")", - ); - } - } else if (inEscape) { - // part-way through escape sequence - inEscape = false; - if (byte == this.SLIP_ESC_END) { - partialPacket.push(this.SLIP_END); - } else if (byte == this.SLIP_ESC_ESC) { - partialPacket.push(this.SLIP_ESC); - } else { - if (this.debug) { - this.logger.debug("Read invalid data: " + toHex(byte)); - this.logger.debug( - "Remaining data in serial buffer: " + - hexFormatter(this._inputBuffer), - ); - } - throw new SlipReadError( - "Invalid SLIP escape (0xdb, " + toHex(byte) + ")", + if (this.debug) { + this.logger.debug("Read invalid data: " + toHex(byte)); + this.logger.debug( + "Remaining data in serial buffer: " + + hexFormatter(this._inputBuffer), ); } - } else if (byte == this.SLIP_ESC) { - // start of escape sequence - inEscape = true; - } else if (byte == this.SLIP_END) { - // end of packet - if (this.debug) + throw new SlipReadError( + "Invalid head of packet (" + toHex(byte) + ")", + ); + } + } else if (inEscape) { + // part-way through escape sequence + inEscape = false; + if (byte == this.SLIP_ESC_END) { + partialPacket.push(this.SLIP_END); + } else if (byte == this.SLIP_ESC_ESC) { + partialPacket.push(this.SLIP_ESC); + } else { + if (this.debug) { + this.logger.debug("Read invalid data: " + toHex(byte)); this.logger.debug( - "Received full packet: " + hexFormatter(partialPacket), + "Remaining data in serial buffer: " + + hexFormatter(this._inputBuffer), ); - // Compact buffer periodically to prevent memory growth - this._compactInputBuffer(); - return partialPacket; - } else { - // normal byte in packet - partialPacket.push(byte); + } + throw new SlipReadError( + "Invalid SLIP escape (0xdb, " + toHex(byte) + ")", + ); } + } else if (byte == this.SLIP_ESC) { + // start of escape sequence + inEscape = true; + } else if (byte == this.SLIP_END) { + // end of packet + if (this.debug) + this.logger.debug( + "Received full packet: " + hexFormatter(partialPacket), + ); + // Compact buffer periodically to prevent memory growth + this._compactInputBuffer(); + return partialPacket; + } else { + // normal byte in packet + partialPacket.push(byte); } } } @@ -2774,26 +2615,18 @@ export class ESPLoader extends EventTarget { eraseSize = size; } - const timeout = this.IS_STUB - ? DEFAULT_TIMEOUT - : timeoutPerMb(ERASE_REGION_TIMEOUT_PER_MB, size); + const timeout = timeoutPerMb(ERASE_REGION_TIMEOUT_PER_MB, size); const stamp = Date.now(); let buffer = pack(" { @@ -3156,13 +2999,14 @@ export class ESPLoader extends EventTarget { } await this.memFinish(stub.entry); - const p = await this.readPacket(500); + const p = await this.readPacket(2500); const pChar = String.fromCharCode(...p); if (pChar != "OHAI") { throw new Error("Failed to start stub. Unexpected response: " + pChar); } this.logger.debug("Stub is now running..."); + this._commandLock = Promise.resolve([0, []]); const espStubLoader = new EspStubLoader(this.port, this.logger, this); // Try to autodetect the flash size. @@ -3923,10 +3767,11 @@ export class ESPLoader extends EventTarget { throw new Error("Port not ready after reconnect"); } - // Power on flash for ESP32-P4 Rev 301 (must be done before loading stub) + // Power on flash for ESP32-P4 Rev 3.1 (301) & Rev 3.2 (302) + // (MUST be done BEFORE loading stub) if ( this.chipFamily === CHIP_FAMILY_ESP32P4 && - this.chipRevision === 301 + (this.chipRevision === 301 || this.chipRevision === 302) ) { await this.powerOnFlash(); } @@ -4319,8 +4164,8 @@ export class ESPLoader extends EventTarget { * @param onPacketReceived - Optional callback function called when packet is received * @param options - Optional parameters for advanced control * - chunkSize: Amount of data to request from ESP in one command (bytes) - * - blockSize: Size of each data block sent by ESP (bytes) - * - maxInFlight: Maximum unacknowledged bytes (bytes) + * - blockSize: Size of each packet sent by the stub (bytes) + * - maxInFlight: Maximum number of unacknowledged packets * @returns Uint8Array containing the flash data */ async readFlash( @@ -4352,27 +4197,6 @@ export class ESPLoader extends EventTarget { `Reading ${size} bytes from flash at address 0x${addr.toString(16)}...`, ); - // Initialize adaptive speed multipliers for WebUSB devices - if (this.isWebUSB()) { - if (this._isCDCDevice) { - // CDC devices (CH343): Start with maximum, adaptive adjustment enabled - this._adaptiveBlockMultiplier = 8; // blockSize = 248 bytes - this._adaptiveMaxInFlightMultiplier = 8; // maxInFlight = 248 bytes - this._consecutiveSuccessfulChunks = 0; - this.logger.debug( - `CDC device - Initialized: blockMultiplier=${this._adaptiveBlockMultiplier}, maxInFlightMultiplier=${this._adaptiveMaxInFlightMultiplier}`, - ); - } else { - // Non-CDC devices (CH340, CP2102): Fixed values, no adaptive adjustment - this._adaptiveBlockMultiplier = 1; // blockSize = 31 bytes (fixed) - this._adaptiveMaxInFlightMultiplier = 1; // maxInFlight = 31 bytes (fixed) - this._consecutiveSuccessfulChunks = 0; - this.logger.debug( - `Non-CDC device - Fixed values: blockSize=31, maxInFlight=31`, - ); - } - } - // Chunk size: Amount of data to request from ESP in one command // For WebUSB (Android), use smaller chunks to avoid timeouts and buffer issues // For Web Serial (Desktop), use larger chunks for better performance @@ -4414,51 +4238,41 @@ export class ESPLoader extends EventTarget { ); } - let blockSize: number; - let maxInFlight: number; + let packetSize: number; + let maxInFlightPackets: number; if ( options?.blockSize !== undefined && options?.maxInFlight !== undefined ) { - // Use user-provided values if in advanced mode - blockSize = options.blockSize; - maxInFlight = options.maxInFlight; + // READ_FLASH expects packet size and max in-flight packet count. + packetSize = options.blockSize; + maxInFlightPackets = options.maxInFlight; if (retryCount === 0) { this.logger.debug( - `Using custom parameters: blockSize=${blockSize}, maxInFlight=${maxInFlight}`, + `Using custom parameters: packetSize=${packetSize}, maxInFlightPackets=${maxInFlightPackets}`, ); } } else if (this.isWebUSB()) { - // WebUSB (Android): All devices use adaptive speed - // All have maxTransferSize=64, baseBlockSize=31 + // WebUSB (Android): Use a smaller packet size, matching the + // protocol semantics used by esptool: packet size plus max + // in-flight packet count. const maxTransferSize = (this.port as WebUSBSerialPort).maxTransferSize || 64; - const baseBlockSize = Math.floor((maxTransferSize - 2) / 2); // 31 bytes - - // Use current adaptive multipliers (initialized at start of readFlash) - blockSize = baseBlockSize * this._adaptiveBlockMultiplier; - maxInFlight = baseBlockSize * this._adaptiveMaxInFlightMultiplier; + packetSize = Math.floor((maxTransferSize - 2) / 2); // 31 bytes + maxInFlightPackets = 8; } else { - // Web Serial (Desktop): Use multiples of 63 for consistency - const base = 63; - blockSize = base * 65; // 63 * 65 = 4095 (close to 0x1000) - maxInFlight = base * 130; // 63 * 130 = 8190 (close to blockSize * 2) + // Web Serial (Desktop): Match esptool's default READ_FLASH protocol. + packetSize = FLASH_SECTOR_SIZE; + maxInFlightPackets = 64; } - // The stub (legacy approach) interprets the 4th READ_FLASH parameter as - // max_unacked_packets (a packet count), not bytes. Convert accordingly. - const maxUnackedPackets = Math.max( - 1, - Math.ceil(maxInFlight / blockSize), - ); - const pkt = pack( "= 2) { - const maxTransferSize = - (this.port as WebUSBSerialPort).maxTransferSize || 64; - const baseBlockSize = Math.floor((maxTransferSize - 2) / 2); // 31 bytes - - // Maximum: blockSize=248 (8 * 31), maxInFlight=248 (8 * 31) - const MAX_BLOCK_MULTIPLIER = 8; // 248 bytes - tested stable - const MAX_INFLIGHT_MULTIPLIER = 8; // 248 bytes - tested stable - - let adjusted = false; - - // Increase blockSize first (up to 248), then maxInFlight - if (this._adaptiveBlockMultiplier < MAX_BLOCK_MULTIPLIER) { - this._adaptiveBlockMultiplier = Math.min( - this._adaptiveBlockMultiplier * 2, - MAX_BLOCK_MULTIPLIER, - ); - adjusted = true; - } - // Once blockSize is at maximum, increase maxInFlight - else if ( - this._adaptiveMaxInFlightMultiplier < MAX_INFLIGHT_MULTIPLIER - ) { - this._adaptiveMaxInFlightMultiplier = Math.min( - this._adaptiveMaxInFlightMultiplier * 2, - MAX_INFLIGHT_MULTIPLIER, - ); - adjusted = true; - } - - if (adjusted) { - const newBlockSize = - baseBlockSize * this._adaptiveBlockMultiplier; - const newMaxInFlight = - baseBlockSize * this._adaptiveMaxInFlightMultiplier; - this.logger.debug( - `Speed increased: blockSize=${newBlockSize}, maxInFlight=${newMaxInFlight}`, - ); - this._lastAdaptiveAdjustment = Date.now(); - } - - // Reset counter - this._consecutiveSuccessfulChunks = 0; - } - } } catch (err) { retryCount++; - // ADAPTIVE SPEED ADJUSTMENT: Only for CDC devices - // Non-CDC devices stay at fixed values - if (this.isWebUSB() && this._isCDCDevice && retryCount === 1) { - // Only reduce if we're above minimum - if ( - this._adaptiveBlockMultiplier > 1 || - this._adaptiveMaxInFlightMultiplier > 1 - ) { - // Reduce to minimum on error - this._adaptiveBlockMultiplier = 1; // 31 bytes (for CH343) - this._adaptiveMaxInFlightMultiplier = 1; // 31 bytes - this._consecutiveSuccessfulChunks = 0; // Reset success counter - - const maxTransferSize = - (this.port as WebUSBSerialPort).maxTransferSize || 64; - const baseBlockSize = Math.floor((maxTransferSize - 2) / 2); - const newBlockSize = - baseBlockSize * this._adaptiveBlockMultiplier; - const newMaxInFlight = - baseBlockSize * this._adaptiveMaxInFlightMultiplier; - - this.logger.debug( - `Error at higher speed - reduced to minimum: blockSize=${newBlockSize}, maxInFlight=${newMaxInFlight}`, - ); - } else { - // Already at minimum and still failing - this is a real error - this.logger.debug( - `Error at minimum speed (blockSize=31, maxInFlight=31) - not a speed issue`, - ); - } - } - // Check if it's a timeout error or SLIP error if (err instanceof SlipReadError) { if (retryCount <= MAX_RETRIES) { diff --git a/src/stubs/README.md b/src/stubs/README.md index 3728d730..1be73aa3 100644 --- a/src/stubs/README.md +++ b/src/stubs/README.md @@ -2,4 +2,4 @@ The binaries in JSON format distributed in this directory are released as Free Software under GNU General Public License Version 2 or later. -The stub payloads are generated from the flasher-stub sources and may be replaced with newer upstream artifacts from https://github.com/Jason2866/esp-flasher-stub/ or the corresponding Espressif upstream project. The legacy esptool stub repository is retained only for historical reference. \ No newline at end of file +The stub payloads are from the Espressif project https://github.com/espressif/esp-flasher-stub \ No newline at end of file diff --git a/src/stubs/esp32.json b/src/stubs/esp32.json index 0d9af208..76d968b7 100644 --- a/src/stubs/esp32.json +++ b/src/stubs/esp32.json @@ -1,8 +1,8 @@ { - "entry": 1074434260, - "text": "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", + "entry": 1074434092, + "text": "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", "text_start": 1074429952, - "data": "AMD8P2iHCkBPSEFJAAAAAOWUCkDqlApAVZUKQGCVCkATlgpAopUKQK2UCkBRlgpAzJYKQEWXCkBJmQpA9pYKQEmZCkCqlwpAzpcKQOCXCkBVlQpAPZgKQFOYCkAwhQpALIIKQCCDCkDAggpArIIKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQKyECkCshApArIQKQA==", + "data": "AMD8PzyHCkBPSEFJAAAAAD2UCkBClApArpQKQLiUCkBnlQpA+pQKQAWUCkCllQpAIJYKQJmWCkCdmApASpYKQJ2YCkD+lgpAI5cKQDSXCkCulApAkZcKQKeXCkAUhQpALIIKQLCCCkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkCQhApAkIQKQJCECkA=", "data_start": 1073605996, "bss_start": 1073528832 } \ No newline at end of file diff --git a/src/stubs/esp32c2.json b/src/stubs/esp32c2.json index 2a0591b1..aea3bfdf 100644 --- a/src/stubs/esp32c2.json +++ b/src/stubs/esp32c2.json @@ -1,8 +1,8 @@ { - "entry": 1077415930, - "text": "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", + "entry": 1077415824, + "text": "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", "text_start": 1077411840, - "data": "FgY4QDxAyj/IEjhA1BI4QCQTOEA2EzhAMBQ4QK4TOECgEjhAchQ4QPgUOEBQFThAVhI4QAwVOEBWEjhAyhU4QNoVOEDeFThAJBM4QCwWOEBGFjhAwgM4QFQBOEAkAjhArAE4QJwBOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEBUAzhAVAM4QFQDOEA=", + "data": "+gU4QDxAyj9eEjhAahI4QLoSOEDMEjhAxhM4QEQTOEA2EjhACBQ4QI4UOEDmFDhA7BE4QKIUOEDsEThAYBU4QHAVOEB0FThAuhI4QMIVOEDcFThArAM4QFQBOECcAThAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhAPgM4QD4DOEA+AzhA", "data_start": 1070296428, "bss_start": 1070219264 } \ No newline at end of file diff --git a/src/stubs/esp32c3.json b/src/stubs/esp32c3.json index 47379f35..75a36b43 100644 --- a/src/stubs/esp32c3.json +++ b/src/stubs/esp32c3.json @@ -1,8 +1,8 @@ { - "entry": 1077415682, - "text": "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", + "entry": 1077415578, + "text": "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", "text_start": 1077411840, - "data": "3gY4QDhAyD/uEjhA+BI4QEgTOEBaEzhAVBQ4QNITOEDGEjhAlhQ4QBwVOEB0FThAfBI4QDAVOEB8EjhA7hU4QP4VOEACFjhASBM4QFAWOEBqFjhA7AM4QFABOEAgAjhAqAE4QJgBOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEBQAzhAUAM4QFADOEA=", + "data": "wgY4QDhAyD+GEjhAkBI4QOASOEDyEjhA7BM4QGoTOEBeEjhALhQ4QLQUOEAMFThAFBI4QMgUOEAUEjhAhhU4QJYVOECaFThA4BI4QOgVOEACFjhA1gM4QFABOECYAThAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhAOgM4QDoDOEA6AzhA", "data_start": 1070165352, "bss_start": 1070088192 } \ No newline at end of file diff --git a/src/stubs/esp32c5.json b/src/stubs/esp32c5.json index d3ca8a3a..595eb3df 100644 --- a/src/stubs/esp32c5.json +++ b/src/stubs/esp32c5.json @@ -1,8 +1,8 @@ { - "entry": 1082136122, - "text": "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", + "entry": 1082136018, + "text": "goABRYKAtweEQJOHBwCDxgcAEWaTBQYRs4a2AjeHhEATB8cdupayloPGxhCR6oPGBwCzhrYCupY2loNG1hCFyoPGBwAFRpFlFY6RZhN29g+ThgYRswbWAgFFupauloPFxhCd5YPG1hCF5iOAxwCDxgcAEWYTBgYRs4bGApFlupauliOkBhADxQcAMwXFAjqVgoC3B4RAA8cHAJFmE4YGERN39w8zB8cCt4eEQJOHxx2ThXYQupe2l2P2pQAFR6OG5xCCgCOkpxAFRyOG5xCCgLcHhECThwcAA8cHAIVGEWWZjpP29g8TCAURs4UGAzeHhEATB8cdupWqlQPG1RAJxqOA1wAJRYKAA8YHADMGBgM6liqWA0bWEBHGA8cHAKOA5wDNtwPGxRAJxqOA1wAFRYKAg8YHALOGBgM2lzqVA0fFEAFFddcDxwcAo4DnAMW3twWEQJOFBQADxxUAkWYThgYRMwfHAreHhECTh8cdPpc2lyMkBxADxxUAMwfHAj6XNpcjBgcQA8cVADMHxwK6l76Wo4YGEIKAUcEBESbKtzSFQJOExPCcQCLMSshOxlLEKoQGzhMFAAwzCbQAEwoADIKXkwmwDZxAYxWJAhMFAAyCl7cHhECThwcA3EORw4KX8kBiRNJEQkmySSJKBUUFYYKAA0UEAGMHRQFjDDUBgpcFBNG3EwWwDYKXnEATBcAN/beCl5xAEwXQDdW3goC3B4RAk4cHAJRH2Edj/OYAmEuURxOGFgCQx7MH1wAjgKcAgoCDxgcAEWYTBgYRs4bGAjeHhEATB8cdNpeRZjaXhUajBtcQI6gHACOqBwCCgEERIsQ3BIRAEwQEAFRIBsYFR6qHY4PmAglGY4bGBJHqkwYADGMX1QAcSIHHIyQEAFjIskAiREEBgoATBwAMYx3lABxEiccIRPE7IygEACMkBAAjKgQA8b8TB7ANYxLlAolHXMj5t1jIkwbADRMFAAxjiNcAkwbQDWOY1wATBbANIkSyQEEBLbeDRgQAEWYTBgYRs4bGAreHhECTh8cdtpeRZraXo4bnECMoBABdtwNHFQCDRwUAIgddj4NHJQADRTUAwgfZj2IFXY2CgEFlEwUF8IKAtwcAYJxHNwcAYBzLk/cXEJXLQREixEBPJsJKwAbGE3T0D4FEOoljmIQAskAiRJJEAklBAYKAAyUJAIUEE3X1D/U11beCgLf3AGDYR0ERIsQmwgbG2Mu+hBOERwAcQJGLkeeyQCJEkkRBAYKAiEATdfUPbT3lt0ERBsapMbcHhECyQJOHBwARZ4jLEwd3ENjHQQGCgAERIswmygbOI4AFAKqELoTtMRHJKsbxNzJFiUdjG/UAhUcjAPQAAUXyQGJE0kQFYYKANwaEQBMGBgCDRxYAkWaThgYRs4fXAjeHhEATB8cdkWW6l66Xg6eHEANFFgCcwDMF1QI6lcm3QREGxtE2acWTdzUA8eM3B4RAEwcHAINHhwHd64NHlwHF6xMGxwE3TgDwNwMA8LcIAOA3CADAgUayjrFD8XJ9Hn0T/Rh9GLcPAIATDwACs4d2ArqXzE+z9VUAk+UFIMzPzE+z9cUBzM/MT7P1ZQDMz8xPs/UVAczPzE+z9QUBzM/MT7Pl9QHMz5OXlgCql4UGXMKThwb+szfwAJMFxgCzB/BA7Y8cxi6G45Pm+7d3AWAjpNcF9EM3BgAg0Y70w4Vnk4cHArd2AWD80oVHIwz3ALJAQQGCgAERIswmygbOI4AFAKqELoR1NgXptweEQJOHBwADx5cBAeshNwFF8kBiRNJEBWGCgAOlhxqjjAcAmTZJNirG9TUyRYlHYxb1AIVHIwD0ANm/NwaEQBMGBgCDRxYAkWaThgYRs4fXAjeHhEATB8cdkWW6l66Xg6eHEANFFgCcwDMF1QI6lU23NzcAYBxDvYv1/4KAt3cBYJhDE2cXAJjDmEN5m5jDN4coAJjLtweEQJOHBwADp8caI4wHABhbIyIHACMmBwCCgANXJQCRR2MQ9wQ3BYVAEwXFP41nqpcDx1ewsWeThwdgBccYQbFnDeMNZkEREwYGsYFFBsaXAID/54Cg6rJAgUc+hUEBgoCxZz6FgoABEU7GtzkAYCLMJspKyFLEVsJawAbOKosuigFEAUmThMkCtwoACLk3I6AEACOgWQGDpwkA9f+cQIWLnc8FRZcAgP/ngICdkwcUADO3hwA6mT6E42pJ/WMUKgHj5mf9NwUAECUF8kBiRNJEQkmySSJKkkoCSwVhgoABRe23AREmyk7GsWS3+QBgIsxKyAbOKoQBSZEJk4QENQVFlwCA/+eAwJeDpwkAiYuB7wUJ4xaZ/gVF8kBiRNJEQkmySQVhgoC39wBggMMBRe23QREixCbCN/QAYLFkSsAGxgFJEQSThAQ1BUWXAID/54AgkxxAiYuB5wUJ4xeZ/hxAskCSRJPnFwAcwCJEAklBAYKAGXGi3KbaztYuhKqJsoSBRRMGoARICDbGht7K2JcAgP/ngKDWskYBRpnKA9dGBJMHAAQ6hmPz5wA+hkIGQYKTB6YAE5kHAYVHIwrxAJMHJgAjC/EAowqBABNZCQGBR5HCnEI+zGAIkc6D10YEmcsihZOFRgAyxpcAgP/ngEDRMkYylJPXhAAjAPQAg6eJAKMAlADKhUgIgpf2UGZU1lRGWbZZCWGCgBcDgP9nAAOIARG3dwFgIszAQwbOkxcEAWPUBwIhZ7d3AWCYyywAaACXEID/54BA2bJGNweEQBMHBwCx4iMMBwCTF8QAY9cHALd3AWA3BwgAmMuTF7QAY9cHALd3AWA3BxAAmMuTF6QAY9kHBGJE8kC3dwFgNwcgAJjLBWGJuyJGtwUAwP0VHELtjxzCkWUjJAca/RWcQgMlhxq5g+2PwgfBg6qXIyT3GmME1gCURv3yhUejDPcAITtht/JAYkQFYYKAQREixABFBsYihaU8GekTBUQAhTwqhAFFl/B//+eAIHwClLJAIkQBRUEBgoAIRQERBs4izLk0KoQFZRMFhTiX8H//54BAdpcAgP/ngADikxVFALPVhQIBRS7Gl/B//+eAQHiyRQFFl/B//+eAwHcFZRMFhTiX8H//54DgcvJAYkQBRQVhgoB5cZFnItT9FxOE9f8zNPQAEzcVABM0FABZjAbWNwcAECbSStBOzlLMGQdx4JN5NQBjnwkKtwSEQO2Pk4QEABOXBwGThwQYlFtxdkGD8Y7ZjpTblFs3RgDwfRbxjjoHVY+Y25hbtwYA8P0WdY+Y25hbtwYA4P0WdY+Y25hbtwYAQMjbVY+Y25hbtwYAgDd5AWBVj5jbI6wEGrd3AWA3BxcAmMu3hwFg7NeThQQbLoU3Sg8AlxCA/+eAoL0RCRMKCiQFRZfwf//ngKBlgycJABPXFwEliynjhQnjlEn/g6fEGhNHFAByByOqBwAjrAcAslAiVJJUAlnySWJKEzUXAEVhgoATl7cA41sH/Ld3AWA3BxAAmMvht4MnCQATl+cA41IH/rd3AWA3BwcAmMtsACgAlxCA/+eAQLYFRE23tweGQAOlx/4X83//ZwCDcBxRVFFMQRBFGEkDKIUBgyjFAQMjhQIDTgUDNwUAQAMvRQF5cQVFNsI+wAbWiU5yyCrGGsSTBwACoUZj+e4Bl+CC/+eAoPSyUEVhgoCXwIL/54Agl82/s2fFAI2Lzeu3B4RAg8fHG1lxhtai1KbSytDOztLM1srayN7G4sTmwr3PqoQJZS6JEwUFcYFFMoQ1NrcHABClBxHpQUsFSpFLMUyhSpMMAAIF4IFHtlAmVJZUBln2SWZK1kpGS7ZLJkyWTD6FZWGCgKKJY3OLAMFJk5c5AGgAJs5K2FLGXshiylbMZtBW0gLUAtY+2lLcIw4BAjMENEExN06ZzpR1t5fwf//ngIBfVdG3BwAQkQd5v7cHABCJBz6FgoBVcaLFAEWmw4bHysFO31LdVtta2V7XYtVm02rRbs8TAQGAEwEBgKqEEwWEAO/wz/aFZ2PvpxAqjCKF7/Dv9aqKEwVEAO/wT/XcRKqMEwoBCdxDZomBS4KXCBgjJgr4AUuXAID/54BAuxFNYxMJAoMnyvhj75cBCBAMGJcAgP/ngCC63ETBRQgQnEeClwFFuaDcRJMFsQEIEJxDgpeDR7r4qoWxz9xE3EOCl+MCCfzjEXv/4oljc4kByomT9zoAE4Y5AD6WIAFxmqKFE/XK/z7GvTWyRzHBMWUTBQVAhWIWkb5ALkSeRA5J+llqWtpaSlu6WypcmlwKXfpNaWGCgFXVgycK+eOZp/dqhmgIlwCA/+eAwIKFC3m3sw30AInL7oVOhiKFlwCA/+eAgIGijU6G7oUIGJcAgP/ngECu3ETOhW6FnEfOmjMJOUGClwULMb8xZWm3eXEi1CbSStBOzlLMVsoG1hMBAYATAQGAhUeuhKqKMokjAPYAAUSFaQwIfVpjfZQCM4aEQGPzyQAFZjMFVAEyxi7EZTMd7TJGokWBRwmCLodjFfYAhWc+lNG/FEMRB2OARgMjAAkAAUWFYhaRslAiVJJUAlnySWJK0kpFYYKAhQfBvzFlEwUFQMW3A1clAMFHYxf3CnVxIsUARQbHJsNKwc7e0tzW2trYEwEBgBMBAYAihS6L7/AP2RN6xf8TeTUAEwVEAO/wD9iqhCgIlwCA/+eAQJ+FapMJAQeF5FqFLAiXAID/54CAngFFhWIWkbpAKkSaRApJ9llmWtZaRltJYYKAMwSZAGPzigAFZA0EcZgihs6FUoXROQ3lMwYkQWPzxAAmhrOFKQEoCDLGlwCA/+eAgJkyRiKaAUmRjHm/MWWCgDFlEwUFQE23XXERRzrISUc6yiFHhUc6zCrOEwcAAmgAhsY+xjrQAtIu1DLWAtgC2j7cIw7xAjE5tkBhYYKAtweEQIPHxxtdcYbGosSmwsrATt5S3FbaWthe1mLUZtJq0G7OY4oHIpMJ9j+zt8kA2geT2akAvpmdZ5OHB1OzivkCKokuirKEs7n5AmOLBhqzZ8UANwQAEL2LDQRjmAcUl/B//+eAQCe3JwBgI6IHNJfwf//ngMApNwQAEGMUBRJWhc6F7/Cv9CqEYxoFELcnAGCThwc0PsC3JwBgk4cHMD7CtycAYJOHhzQ+xLcnAGCTh8c0fU2TDfADPsYFS/3AE3X5AxN3+Q9J5WP4nQiTBvfzkwsABGP13QiCRxPXWwBehpjDkkfShT6Vl/B//+eAoFeiRyOgJwGyRyOgZwEZNjPnOgE15zcnAGCDJoc1CUdjl+YINycAYCMoZzU3JwBggyaHNQ1HY5zmBhOWOwCBRUqFfRZZPTcnAGAjKmc1VoXOhe/wz+gh7V6aXpmzhHRBvbeTdvkBwUvJ8sFL43+d9hMH9/EzN+0AkxtHAMELtbfWjE6Mk7UcAAVFMwy8QJfwf//ngGAGNyYAYBMGhjUIQv0cCUiz5YwBYwoFA+H9NwQAECUEl/B//+eAQBO2QCKFJkSWRAZJ8lliWtJaQluyWyJcklwCXfJNYWGCgDcmAGAjKGY1odUFRZfwf//ngMAANyYAYBMGhjUMQg1I448F85O1HAAzDLxA/Ryz5YwB4f15v1aFzoXv8I/cAekTCwAQkwsAApnkAURRvzcEABAlBHG3E3T5DzMEi0Cmh2P0mwCTBwACY/OHAD6E6TLShUqFExY0AFkzVoXOhe/wT9hx9SKaIpmBjH2/kcqX8H//54AgB1XZNwQAECEEibeX8H//54CACf23XXGmwqqECWXKwBMFBXEuiYFFhsaixO/wL9Qd7SqEhToVRzrIIUeFRzrMaAATBwACPsZKyibOOtAC0gLUAtYC2ALaPtwjDvECmTq2QCKFJkSWRAZJYWGCgDcEABAlBPW3eXFexmLErosqjIFFAUUG1iLUJtJK0E7OUsxWylrIZsLv8I/NFcG3BAAQpQSyUCJUAlnySWJK0kpCS7JLIkySTCaFklRFYYKAg6kLAKqE448J/EFkAykMAGPmiQCTFwkBwYOdz5MXSQHZ44FHBWQ3B4RAA0fHGx3HkwXADZnjkwUQAkqFMT9F8SKZs4eJQDO0iQB9FCMgLAF9jCOgiwB5t4VH8be3DAABE4v8/zc6AGAze2kBkwpKAJnP7/Bfh+/w77q3B4AAI6BqASMg+gCDJwoA9f9Vv+/wn4Xv8C+5I6BqASMgmgGDJwoA9f9xv7cEABCZBCW/eXEi1Dc0hUATBMQ/gyfEsAbWJtKZ5wFFslAiVJJURWGCgLcEhECThAQAg8fUG7njtweGQIOnx/4DJYSwEwbxAcxHLsaFPGn5g0fxAbJFhcMDJ4SwgyfEsC6XIyTksD6HY/P1AC6HmY8jJvSwdbeFR6OO9Bq3NYVANzWFQJOFhfATBUXwWTVB2bcHAPDdFz6VWdExZRMFBUBBtxP3tf/BR2MX9wx5cSLUNwSFQC7GBtYTBMQ/JtJK0KqETs5SzFbKMopayO/wT4MIwKqJE4VEAO/wj4JIwCqJE4WEAO/wz4EIxCqLE4XEAO/wD4GyRUjE0UeqigFFY5j1ABOFBAHv4L//MzWgAA1nIpeFRyMCp7CjAvewYwgKADMJaQMjKgQAIygkAbcHhkCDp8f+3EczBvBA/RfOl9aXs/bKAPGPlY8jJvewtweEQCMk17CjjgcaRT0BxTFlEwUFQLJQIlSSVAJZ8kliStJKQktFYYKAMWWCgHlxTs63CYVAk4nJP1LMA6rJACLUDWQm0krQBtZWyiqJroQumk6UgyeEsGPtRwOZzINHRLADpckAocezZ5UAvYuFRp3jJobKha08Ge2DpwkAAUWFjyOg+QCDp8kAppcjpvkAMaAtNWHRMWUTBQVAslAiVJJUAlnySWJK0kpFYYKAk3c1AJHnk/c0ALHjgUZdvxN6xf8zBKpAEQRj84QAJoSTCsEAfVcihsqFM4X6ADrGl/B//+eAYAeBRhFG1oVShQk0XfEimREKM4SEQCGgE3rF/yaEk3rE/2OMCgCBRlaGyoVShfk6SfFWmTMEVEFWmjHc/VcihsqFaAA+xpfwf//ngKACgUYRRmwAUoU1v11xVtqDKoUAWtiGxlaFosSmwsrATt5S3F7WYtTv4N/lKosThUoA7+A/5QnptweEQDc3hUCTh8cdIyj38Lc0hUC3C4RAtwmFQBM4FQBaiQVEk4TE8BOKyx2Tick/YwQJAGNIgAAxZRMFBXB9hGGNaaDYQKFnSs4zB0dBmY8+zIOnCQFjdPkAE2goAELG1Tk14TJI2ECTBQsBs4UlQTcFhUA8CNaVk4bLHXAIEwUFQZfwf//ngKC6zEDiR3JMKoS+lYOnCQHMwLOHh0EjqPkAt4eEQJOHxx1j8/UAAemzhUVBUoUBPRnlI6JEATMJiUEBSLW3MWUTBQVAtkAmRJZEBknyWWJa0lpCW7JbIlxhYYKAg1UlALcHhUCDp8c/wRXCBcGBY/O3AL6FCEVBBdmzFXG3B4RANzeFQKLNhs+my8rJzsfSxdbD2sFe32LdZttq2W7XgBGThwcAEwfH8GPv5xa3BwBAA6dHAYVHY+znFpfwf//ngGCqgURjHQUWgUUBRZfwf//ngMC8tzcAYJhPtwYAgDcKhkBVj5jPl/B//+eAYLSDJ8r+KUe3BQACiEOTd/UPk4bn/mNp1wCFRbOV9QC3BwABY/e3ALcHhEAFRyOO5xpBZpMH9v8TBwAQhWaX8H//54DgrolHY4n0Fo1HY5D0JJcAgP/ngGDstweEQJOHBwC+hCOmpxrv4L/vt3cBYJOHhwqYQ4VFSUUTZxcAmMO3dwFgBWf40yOMBACjjAQAt3cBYCOkBBqxByOgBwC+hH1Xt3cBYJjLtwcBYBMHIAIjqucQl/B//+eAwAS3BYBAAUaThQV+SUWX8H//54AABjcFBACX8H//54DABbeHKACcwDc5hUDv4F/REwkJ9rdXQUmTh/eEIyL09IMniQCRRRMFRPSCl7cHhECThwcAtzmFQCMu9PKTiUnxgycJAJMFNPQTBYT0gpeDRzT0KotjgQcggydJAIKXzbcjoAcAkQe1vZcAgP/ngCDd4wIF6I1EAagDR4UBjUeBROMR9+iJRBMFAAyX8H//54DAiTdnCWATB8cRHEO3Bv3//RaT9wfwk+c3ABzDN2cJYBMHBxEcQwllEwUFcfWPtwYCANWPHMO3Zwlgk4dHFJhDE2cXAJjDl/B//+eAgIQVtbcnC2CThwfDmEO3BgCANyYLYFWPmMO3JgtgN0fYUJOGhsETBxeqmMIjIAbAI6AGAJRDNwYAQIVF0Y6Uw7cnC2CThwfCmMM3JwtgEwfHwRRDNwYEAEVF0Y4UwyOgBwATBxACtwcBYCOs5wyX8H//54DA7bf3AGB9V7cFgEDYywFGk4WFOEVFl/B//+eAgO639wBgmEs3BQIAE2dHAJjLl/B//+eAgO23B4BANzeFQJOHJ2ojJvfwtweAQDcHhECThwdvIyL3ADc5hUDv4B+vEwnJ9o21CWUTBQVxl+B//+eAQHYBRZfgf//ngGB5twcAYPhT/XaNBnWPE2eHAvjT+FMTZxcA+NO3BwBgk4eHCQVHmMOYQwWLdf83BwBgXFO3BYBAAUaT9wfwk+cHAlzTtwcAYH1XmMuThSU0FUWX8H//54Ag47cHAGDYRxMFAAITZxcQ2MeX8H//54Ag4rcHgECTh4d9NzeFQCMm9/C3B4RAI6IHAIm/4wUF3oNHBQCDRBUAkcsxZoFGEwYGMKaFSoXv4F/a1bODSjUAg0clAAMnhPSiCrPq+gCTh4oAYwX3AIFGMWbhvxEF7+B/loMnxPOTC4sAIwiU9AOmBxyjCAT0IxlU9SMqpPQjLHT1Iy4k9SqMGcqBRqaFSoXv4L/UgyfE8yOgBxxJsxMGwASBRRMFRPeX8H//54CAq9FHY+CXAoVHY/uXApOH5P+T9/cPSUdjYPcEigfOl5xDgoeTByANY4n0SGPilwKTBwANY4v0SJMHEA1jjPRIgyfE8zFlEwUFMCOgpxzJopMHMA3jjvTQk4e0ApP39w9pR+Nv9/wTBsAEgUUTBUT3l/B//+eAIKQTh7TytzeFQAoHk4cH9rqXnE+TBkT3VobehSaFgpeDJ8TzI6CnHIMnxPvNwwMnxPMjIvccYaiTB0ACY5f6PJ1KAyXE9YFGAUahRf0a7+CfxuOYCv6DJ8TzI6AHHNmgAUbWhV6F7/DP/bGovUdj8VcdtzeFQIPHF/BjiwcYwRpehcIK7+DfgZPaCgFjHVUPgUcTB/AOY+1XAWMb7DK3F4BAk4dHWwMnxPMjIvccjaizBvsAg8aGAYUHNY/pvxMFBPXv4N+pgyfE8yOgpxw5yemgwUdjm/oyXoXv4G/8gyfE8yOkpxwTBcsA7+Bv+4MnxPMjpqccMwVbAe/gb/qDJ8TzI6inHBMFSwHv4G/5gyfE8wMnxPMjqqcchUcjDPccIyAHHJMGRPcBRqaFSoXv4J+4gyfE8yOgBxyDp0cc444HuhMFBPWCl4MnxPMjoKccI6IHHF22vUdj/FcNgyfE84PHhx3Vx16F7+CP84MnxPOqi4Onhxxj6KcAwRrCCpPaCgFjB1UDAyfE87Vnk4cHkDVlIyD3HBMFBZAqhoFGpoVKhe/gX7GDJ8TzI6IHHFG3gyfE8yqGkwWLAQOlRx2TigcYl/B//+eA4IeDp0oF3pcjqvoEg6eKBLOHd0EjpPoEnb2hR2OT+iKDJ8Tzg8eHHYXDgyfE81FGgUUThYccl/B//+eA4IO3F4BAk4eniWG9AyfE87Fnk4cHYDFlIyD3HBMFBWCdv2OFCgCT9/oAgc8DJ8TztWeThweANWUjIPccEwUFgJm/E91KAP1dgUqDK4T1k5dKAL6bXoXv4G/kqowThUsA7+DP4yqME4WLAO/gL+MqixOFywDv4I/il+B//+eAQDSzd2wBYwq7AQOnDAATS/v/M3vrALPnZwGFCiOg/ACTlwoBwYPj46f7bbORR2Od+hRehe/gr94cQSMq9PZZu5FHY5P6FF6F7+Bv3aqKVUWX8H//54BgnkVFl/B//+eAwJ1ZRZfwf//ngCCdQUWX8H//54CAnIFFVoWX4H//54CAR4m74UdjkfoQXoXv4C/ZqooTBcsA7+CP2CMmpPITBQsB7+DP1yMopPITBUsB7+AP1yMqpPITBYsB7+BP1iMspPITBcsB7+CP1QMnhPODJkTzAyYE84MlxPKqh1aFl+B//+eAQDnjBwXOAyfE87Fnk4cHQDFlIyD3HBMFBUApvaFHY5P6CLcXgECTh2eMGbsFRvmxvUdj+VcHtzeFQIPHF/DjhgfmXoXv4G/PWpWTB/AOYxmrAGMc/AC3F4BAk4dHSs2xA0eLAQULuY/dtwMnxPOxZ5OHBxAxZSMg9xwTBQUQXbuTBYT3EwUE9e/gn++DJ8TzI6CnHMFHIxz0+vmxCotjigoAWoEDJ8TzsWcxZSMg9xxRsxMGBPaBRQFFl+B//+eAQCJl8VFGkwUE9hMFhPeX4H//54DAYNFHIxz0+hG5wUfjkvr8txeAQJOHR7iRuZfgf//ngEAmMbehR+OV+vpehe/gr8OqiiMmpPQTBcsA7+DPwoMnyv4jIKT23Eez+voC45IK+DN39QI1/5OK9/+qmrPa+gL1Z5OHB0wBS7OK+gKDJwT2gcez52oBkedWhdqF7+BP7321kwUE9hMFxPTv8O+eBUWX4H//54BgD5O3GgAzC/tA/RrptwAA", "text_start": 1082130432, - "data": "8AeAQNwBhEBEG4BAUBuAQKIbgEC2G4BAxhyAQDocgEAcG4BACh2AQJIdgEDqHYBAxhqAQKYdgEDGGoBAZh6AQHYegEB6HoBAohuAQMoegEDmHoBAKgWAQFABgEA4CYBAdAqAQAAAgEDsA4BAUAGAQCACgECoAYBAmAGAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQA==", + "data": "2AeAQNwBhEDcGoBA6BqAQDobgEBOG4BAXhyAQNIbgEC0GoBAohyAQCodgECCHYBAXhqAQD4dgEBeGoBA/h2AQA4egEASHoBAOhuAQGIegEB+HoBAFAWAQFABgEAgCYBA1gOAQFABgECYAYBAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BA", "data_start": 1082470156, "bss_start": 1082392576 } \ No newline at end of file diff --git a/src/stubs/esp32c6.json b/src/stubs/esp32c6.json index 1228700e..9722a5d0 100644 --- a/src/stubs/esp32c6.json +++ b/src/stubs/esp32c6.json @@ -1,8 +1,8 @@ { - "entry": 1082135076, - "text": "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", + "entry": 1082134972, + "text": "goABRYKAtweEQJOHBwCDxgcAEWaTBQYRs4a2AjeHhEATB8cdupayloPGxhCR6oPGBwCzhrYCupY2loNG1hCFyoPGBwAFRpFlFY6RZhN29g+ThgYRswbWAgFFupauloPFxhCd5YPG1hCF5iOAxwCDxgcAEWYTBgYRs4bGApFlupauliOkBhADxQcAMwXFAjqVgoC3B4RAA8cHAJFmE4YGERN39w8zB8cCt4eEQJOHxx2ThXYQupe2l2P2pQAFR6OG5xCCgCOkpxAFRyOG5xCCgLcHhECThwcAA8cHAIVGEWWZjpP29g8TCAURs4UGAzeHhEATB8cdupWqlQPG1RAJxqOA1wAJRYKAA8YHADMGBgM6liqWA0bWEBHGA8cHAKOA5wDNtwPGxRAJxqOA1wAFRYKAg8YHALOGBgM2lzqVA0fFEAFFddcDxwcAo4DnAMW3twWEQJOFBQADxxUAkWYThgYRMwfHAreHhECTh8cdPpc2lyMkBxADxxUAMwfHAj6XNpcjBgcQA8cVADMHxwK6l76Wo4YGEIKAUcEBESbKtzSFQJOExPCcQCLMSshOxlLEKoQGzhMFAAwzCbQAEwoADIKXkwmwDZxAYxWJAhMFAAyCl7cHhECThwcA3EORw4KX8kBiRNJEQkmySSJKBUUFYYKAA0UEAGMHRQFjDDUBgpcFBNG3EwWwDYKXnEATBcAN/beCl5xAEwXQDdW3goC3B4RAk4cHAJRH2Edj/OYAmEuURxOGFgCQx7MH1wAjgKcAgoCDxgcAEWYTBgYRs4bGAjeHhEATB8cdNpeRZjaXhUajBtcQI6gHACOqBwCCgEERIsQ3BIRAEwQEAFRIBsYFR6qHY4PmAglGY4bGBJHqkwYADGMX1QAcSIHHIyQEAFjIskAiREEBgoATBwAMYx3lABxEiccIRPE7IygEACMkBAAjKgQA8b8TB7ANYxLlAolHXMj5t1jIkwbADRMFAAxjiNcAkwbQDWOY1wATBbANIkSyQEEBLbeDRgQAEWYTBgYRs4bGAreHhECTh8cdtpeRZraXo4bnECMoBABdtwNHFQCDRwUAIgddj4NHJQADRTUAwgfZj2IFXY2CgEFlEwUF8IKAtwcAYJxHNwcAYBzLk/cXEJXLQREixEBPJsJKwAbGE3T0D4FEOoljmIQAskAiRJJEAklBAYKAAyUJAIUEE3X1D/U11beCgLf3AGDYR0ERIsQmwgbG2Mu+hBOERwAcQJGLkeeyQCJEkkRBAYKAiEATdfUPbT3lt0ERBsapMbcHhECyQJOHBwARZ4jLEwd3ENjHQQGCgAERIswmygbOI4AFAKqELoTtMRHJKsbxNzJFiUdjG/UAhUcjAPQAAUXyQGJE0kQFYYKANwaEQBMGBgCDRxYAkWaThgYRs4fXAjeHhEATB8cdkWW6l66Xg6eHEANFFgCcwDMF1QI6lcm3QREGxtE2acWTdzUA8eM3B4RAEwcHAINHhwHd64NHlwHF6xMGxwE3TgDwNwMA8LcIAOA3CADAgUayjrFD8XJ9Hn0T/Rh9GLcPAIATDwACs4d2ArqXzE+z9VUAk+UFIMzPzE+z9cUBzM/MT7P1ZQDMz8xPs/UVAczPzE+z9QUBzM/MT7Pl9QHMz5OXlgCql4UGXMKThwb+szfwAJMFxgCzB/BA7Y8cxi6G45Pm+7d3AWAjpNcF9EM3BgAg0Y70w4Vnk4cHArd2AWD80oVHIwz3ALJAQQGCgAERIswmygbOI4AFAKqELoR1NgXptweEQJOHBwADx5cBAeshNwFF8kBiRNJEBWGCgAOlhxqjjAcAmTZJNirG9TUyRYlHYxb1AIVHIwD0ANm/NwaEQBMGBgCDRxYAkWaThgYRs4fXAjeHhEATB8cdkWW6l66Xg6eHEANFFgCcwDMF1QI6lU23NzcAYBxDvYv1/xxDk/cHD/X7goC3dwFgmEMTZxcAmMOYQ3mbmMM3hygAmMu3B4RAk4cHAAOnxxojjAcAGFsjIgcAIyYHAIKAA1clAJFHYxD3BDcFhUATBcU/jWeqlwPHV7CxZ5OHB2AFxxhBsWcN4w1mQRETBgaxgUUGxpcAgP/ngCDpskCBRz6FQQGCgLFnPoWCgAERTsa3OQBgIswmykrIUsRWwlrABs4qiy6KAUQBSZOEyQK3CgAImTcjoAQAI6BZAYOnCQD1/5xAhYudzwVFlwCA/+eAQJ2TBxQAM7eHADqZPoTjakn9YxQqAePmZ/03BQAQJQXyQGJE0kRCSbJJIkqSSgJLBWGCgAFF7bcBESbKTsaxZLf5AGAizErIBs4qhAFJkQmThAQ1BUWXAID/54CAl4OnCQCJi4HvBQnjFpn+BUXyQGJE0kRCSbJJBWGCgLf3AGCAwwFF7bdBESLEJsI39ABgsWRKwAbGAUkRBJOEBDUFRZcAgP/ngOCSHECJi4HnBQnjF5n+HECyQJJEk+cXABzAIkQCSUEBgoAZcaLcptrO1i6EqomyhIFFEwagBEgINsaG3srYlwCA/+eAINWyRgFGmcoD10YEkwcABDqGY/PnAD6GQgZBgpMHpgATmQcBhUcjCvEAkwcmACML8QCjCoEAE1kJAYFHkcKcQj7MYAiRzoPXRgSZyyKFk4VGADLGlwCA/+eAwM8yRjKUk9eEACMA9ACDp4kAowCUAMqFSAiCl/ZQZlTWVEZZtlkJYYKAFwOA/2cAw4cBEbd3AWAizMBDBs6TFwQBY9QHAiFnt3cBYJjLLABoAJcAgP/ngAAtskY3B4RAEwcHALHiIwwHAJMXxABj1wcAt3cBYDcHCACYy5MXtABj1wcAt3cBYDcHEACYy5MXpABj2QcEYkTyQLd3AWA3ByAAmMsFYYm7Ika3BQDA/RUcQu2PHMKRZSMkBxr9FZxCAyWHGrmD7Y/CB8GDqpcjJPcaYwTWAJRG/fKFR6MM9wAhO2G38kBiRAVhgoBBESLEAEUGxiKFhTwZ6RMFRAClNCqEAUWX8H//54CgewKUskAiRAFFQQGCgAhFAREGziLMmTQqhAVlEwWFOJfwf//ngAB2lwCA/+eAwN2TFUUAs9WFAgFFLsaX8H//54DAd7JFAUWX8H//54BAdwVlEwWFOJfwf//ngKBy8kBiRAFFBWGCgHlxkWci1P0XE4T1/zM09AATNxUAEzQUAFmMBtY3BwAQJtJK0E7OUswZB3Hgk3k1AGOfCQq3BIRA7Y+ThAQAE5cHAZOHBBiUW3F2QYPxjtmOlNuUWzdGAPB9FvGOOgdVj5jbmFu3BgDw/RZ1j5jbmFu3BgDg/RZ1j5jbmFu3BgBAyNtVj5jbmFu3BgCAN3kBYFWPmNsjrAQat3cBYDcHFwCYy7eHAWDs15OFBBsuhTdKDwCXAID/54BgEREJEwoKJAVFl/B//+eAYGWDJwkAE9cXASWLKeOFCeOUSf+Dp8QaE0cUAHIHI6oHACOsBwCyUCJUklQCWfJJYkoTNRcARWGCgBOXtwDjWwf8t3cBYDcHEACYy+G3gycJABOX5wDjUgf+t3cBYDcHBwCYy2wAKACXAID/54AACgVETbezZ8UAjYuR70ERBsaX8H//54AAbgHFNwUAEBEFskBBAYKANwUAEAkFgoBVcaLFAEWmw4bHysFO31LdVtta2V7XYtVm02rRbs8TAQGAEwEBgKqEEwWEAO/wP4aFZ2PvpxAqjCKF7/BfhaqKEwVEAO/wv4TcRKqMEwoBCdxDZomBS4KXCBgjJgr4AUuXAID/54DgxRFNYxMJAoMnyvhj75cBCBAMGJcAgP/ngMDE3ETBRQgQnEeClwFFuaDcRJMFsQEIEJxDgpeDR7r4qoWxz9xE3EOCl+MCCfzjEXv/4oljc4kByomT9zoAE4Y5AD6WIAFxmqKFE/XK/z7GGTeyRzHBMWUTBQVAhWIWkb5ALkSeRA5J+llqWtpaSlu6WypcmlwKXfpNaWGCgFXVgycK+eOZp/dqhmgIlwCA/+eAIJGFC3m3sw30AInL7oVOhiKFlwCA/+eA4I+ijU6G7oUIGJcAgP/ngOC43ETOhW6FnEfOmjMJOUGClwULMb8xZWm3eXEi1CbSStBOzlLMVsoG1hMBAYATAQGAhUeuhKqKMokjAPYAAUSFaQwIfVpjfZQCM4aEQGPzyQAFZjMFVAEyxi7EgTUd7TJGokWBRwmCLodjFfYAhWc+lNG/FEMRB2OARgMjAAkAAUWFYhaRslAiVJJUAlnySWJK0kpFYYKAhQfBvzFlEwUFQMW3A1clAMFHYxf3CnVxIsUARQbHJsNKwc7e0tzW2trYEwEBgBMBAYAihS6L7/Bv6BN6xf8TeTUAEwVEAO/wb+eqhCgIlwCA/+eA4KmFapMJAQeF5FqFLAiXAID/54AgqQFFhWIWkbpAKkSaRApJ9llmWtZaRltJYYKAMwSZAGPzigAFZA0EcZgihs6FUoW1Mw3lMwYkQWPzxAAmhrOFKQEoCDLGlwCA/+eAIKQyRiKaAUmRjHm/MWWCgDFlEwUFQE23ARFOxlLErokqioFFAUUGziLMJspKyPUwXeGDpAkAKoS5zMFnAykKAGPm9ACTFwkBwYO5z5MXSQHZ57cHiEADpcf+l/B//+eA4D7v8F+CtwYAAZOH9v83NwBgs3f5AFzDFMMcQ/3/hWczh/RAs7T0AD6Z/RQjICoB+YwjoJkA8kAihWJE0kRCSbJJIkoFYYKAtweIQAOlx/6X8H//54CAOe/w7/yTF4kAoYM3NwBgXMO3B4AAHMMcQ/3/wWd1tzcEABAlBG2/NwQAEBkETb95cSLUNzSFQBMExD+DJ8SwBtYm0pnnAUWyUCJUklRFYYKAtwSEQJOEBACDx8QbueO3B4hAg6fH/gMlhLATBvEBzEcuxlUzafmDR/EBskWFwwMnhLCDJ8SwLpcjJOSwPodj8/UALoeZjyMm9LB1t4VHI470Grc1hUA3NYVAk4WF8BMFRfB9NUHZtwcA8N0XPpVZ0TFlEwUFQEG3E/e1/8FHYxf3DHlxItQ3BIVALsYG1hMExD8m0krQqoROzlLMVsoyilrI7/DvxQjAqokThUQA7/AvxUjAKokThYQA7/BvxAjEKosThcQA7/Cvw7JFSMTRR6qKAUVjmPUAE4UEAe/wT8IzNaAADWcil4VHIwKnsKMC97BjCAoAMwlpAyMqBAAjKCQBtweIQIOnx/7cRzMG8ED9F86X1pez9soA8Y+VjyMm97C3B4RAIyTXsCOOBxpFPQHFMWUTBQVAslAiVJJUAlnySWJK0kpCS0VhgoAxZYKAeXFOzrcJhUCTick/UswDqskAItQNZCbSStAG1lbKKomuhC6aTpSDJ4SwY+9HA43Ag0dEsAOlyQCxx7NnlQC9i5XnJobKhZfwf//ngCAWGe2DpwkAAUWFjyOg+QCDp8kAppcjpvkAMaAdNVXdMWUTBQVAslAiVJJUAlnySWJK0kpFYYKAk3c1AJnrk/c0AKnrJobKhZfwf//ngMAUTb8TesX/MwSqQBEEY/OEACaEkwrBAH1XIobKhTOF+gA6xpfwf//ngCBIEUbWhVKFl/B//+eAQBFB/SKZEQozhIRAIaATesX/JoSTesT/Y44KAFaGyoVShZfwf//ngMAOJflWmTMEVEFWminU/VcihsqFaAA+xpfwf//ngOBCEUZsAFKFlb9dcVbagyqFAFrYhsZWhaLEpsLKwE7eUtxe1mLU7/AvpyqLE4VKAO/wj6YJ6bcHhEA3N4VAk4fHHSMo9/C3NIVAtwuEQLcJhUATOBUAWokFRJOExPATissdk4nJP2MECQBjSIAAMWUTBQVwfYRhjWmg2EChZ0rOMwdHQZmPPsyDpwkBY3T5ABNoKABCxsUxNeEySNhAkwULAbOFJUE3BYVAPAjWlZOGyx1wCBMFBUGX8H//54DA+8xA4kdyTCqEvpWDpwkBzMCzh4dBI6j5ALeHhECTh8cdY/P1AAHps4VFQVKF9TsZ5SOiRAEzCYlBAUi1tzFlEwUFQLZAJkSWRAZJ8lliWtJaQluyWyJcYWGCgINVJQC3B4VAg6fHP8EVwgXBgWPztwC+hQhFQQVNuxVxtweEQDc3hUCizYbPpsvKyc7H0sXWw9rBXt9i3Wbbatlu14ARk4cHABMHx/Bj6ecIlwCA/+eA4IpZ5Zfwf//ngMDrgUQhwQNHhQGNR2Mc9wKJRBMFAAqX8H//54BA4zdnCWATBwcRHEO3Bv3//Rb1j8Fm1Y8JZRzDEwUFcZfwf//ngGDgAUWBRZfwf//ngGD5l/B//+eAYPI3CohAgyfK/nFHiEOTd/UPY2H3AkVHtwUAAWN09wKFRbOV9QA5qCOgBwCRB6W3jURptxMHkAO3BQABY5TnALcFAAJBZpMH9v8TBwAQhWaX8H//54DA64lHY4f0Do1HY5z0Gpfwf//ngIB+tweEQJOHBwC+hCOmpxrv8A+ut3cBYJOHhwqYQ0lFhUUTZxcAmMO3dwFgBWf40yOMBACjjAQAt3cBYCOkBBqxB31XI6AHAL6Et3cBYJjLtwcBYCOgpxCX8H//54AgQLcFgEABRpOFhX5JRZfwf//ngCBBNwUEAJfwf//ngOBAt4coAJzANzmFQO/wb48TCQn2t1dBSZOH94QjIvT0gyeJAJFFEwVE9IKXtweEQJOHBwC3OYVAIy708pOJSfGDJwkAkwU09BMFhPSCl4NHNPQqi2OPBxaDJ0kAgpfNt7cnC2CThwfDmEO3BgCANyYLYFWPmMO3JgtgN0fYUJOGhsETBxeqmMIjIAbAI6AGAJRDNwYAQEVF0Y6Uw7cnC2CThwfCmMM3JwtgEwfHwRRDNwYEAIVF0Y4UwyOgBwC3BwFgI6CnDJfwf//ngGAxt/cAYH1XtwWAQNjLAUaThYU4RUWX8H//54DgMbf3AGCYSzcFAgATZ0cAmMuX8H//54DgMLcHgEA3N4VAk4enaiMm9/C3B4BANweEQJOHh28jIvcANzmFQO/gf/UTCcn23bUJZRMFBXGX8H//54DgvAFFl/B//+eAwL+3BwBg+FP9do0GdY8TZ4cC+NP4UxNnFwD407cHAGCTh4cJBUeYw5hDBYt1/zcHAGBcU7cFgEABRpP3B/CT5wcCXNO3BwBgfVeYy5OFJTQVRZfwf//ngIAmtwcAYNhHEwUAAhNnFxDYx5fwf//ngIAltweAQJOHB343N4VAIyb38LcHhEAjogcAib/jBwXmg0cFAINEFQCRyzFmgUYTBgYwpoVKhe/wL6GltYNKNQCDRyUAAyeE9KIKs+r6AJOHigBjBfcAgUYxZuG/EQXv4N/cgyfE85MLiwAjCJT0A6YHHKMIBPQjGVT1Iyqk9CMsdPUjLiT1KowZyoFGpoVKhe/wj5uDJ8TzI6AHHBm1EwbABIFFEwVE95fwf//ngODw0Udj4JcChUdj+5cCk4fk/5P39w9JR2Ng9wSKB86XnEOCh5MHIA1jifRIY+KXApMHAA1ji/RIkwcQDWOM9EiDJ8TzMWUTBQUwI6CnHMmikwcwDeOA9NqTh7QCk/f3D2lH42/3/BMGwASBRRMFRPeX8H//54CA6ROHtPK3N4VACgeThwf2upecT5MGRPdWht6FJoWCl4MnxPMjoKccgyfE+83DAyfE8yMi9xxhqJMHQAJjl/o8nUoDJcT1gUYBRqFF/Rrv8G+N45gK/oMnxPMjoAcc2aABRtaFXoXv8J+Bsai9R2PxVx23N4VAg8cX8GOLBxjBGl6Fwgrv4D/Ik9oKAWMdVQ+BRxMH8A5j7VcBYxvsMrcXgECTh+cZAyfE8yMi9xyNqLMG+wCDxoYBhQc1j+m/EwUE9e/gv/CDJ8TzI6CnHDnJ6aDBR2Ob+jJehe/g38KDJ8TzI6SnHBMFywDv4N/BgyfE8yOmpxwzBVsB7+DfwIMnxPMjqKccEwVLAe/g37+DJ8TzAyfE8yOqpxyFRyMM9xwjIAcckwZE9wFGpoVKhe/gf/+DJ8TzI6AHHIOnRxzjgAfEEwUE9YKXgyfE8yOgpxwjogccLbG9R2P8Vw2DJ8Tzg8eHHdXHXoXv4P+5gyfE86qLg6eHHGPopwDBGsIKk9oKAWMHVQMDJ8TztWeThweQNWUjIPccEwUFkCqGgUamhUqF7+A/+IMnxPMjogccUbeDJ8TzKoaTBYsBA6VHHZOKBxiX8H//54BAzYOnSgXelyOq+gSDp4oEs4d3QSOk+gSdvaFHY5P6IoMnxPODx4cdhcODJ8TzUUaBRROFhxyX8H//54BAybcXgECThyeKYb0DJ8TzsWeThwdgMWUjIPccEwUFYJ2/Y4UKAJP3+gCBzwMnxPO1Z5OHB4A1ZSMg9xwTBQWAmb8T3UoA/V2BSoMrhPWTl0oAvptehe/g36qqjBOFSwDv4D+qKowThYsA7+CfqSqLE4XLAO/g/6iX4H//54DgerN3bAFjCrsBA6cMABNL+/8ze+sAs+dnAYUKI6D8AJOXCgHBg+Pjp/tts5FHY536FF6F7+AfpRxBIyr09lm7kUdjk/oUXoXv4N+jqop1RZfwf//ngIDhZUWX8H//54Dg4HlFl/B//+eAQOBhRZfwf//ngKDfgUVWhZfwf//ngKCMibvhR2OR+hBehe/gn5+qihMFywDv4P+eIyak8hMFCwHv4D+eIyik8hMFSwHv4H+dIyqk8hMFiwHv4L+cIyyk8hMFywHv4P+bAyeE84MmRPMDJgTzgyXE8qqHVoWX4H//54CgfuMHBc4DJ8TzsWeThwdAMWUjIPccEwUFQCm9oUdjk/oItxeAQJOH54wZuwVG+bG9R2P5Vwe3N4VAg8cX8OOGB+Zehe/g35ValZMH8A5jGasAYxz8ALcXgECTh+cIzbEDR4sBBQu5j923AyfE87Fnk4cHEDFlIyD3HBMFBRBdu5MFhPcTBQT17/CPpoMnxPMjoKccwUcjHPT6+bEKi2OKCgBagQMnxPOxZzFlIyD3HFGzEwYE9oFFAUWX4H//54BgaGXxUUaTBQT2EwWE95fwf//ngCCm0UcjHPT6EbnBR+OS+vy3F4BAk4fnqJG5l+B//+eAoGsxt6FH45X6+l6F7+AfiqqKIyak9BMFywDv4D+JgyfK/iMgpPbcR7P6+gLjkgr4M3f1AjX/k4r3/6qas9r6AvVnk4cHTAFLs4r6AoMnBPaBx7PnagGR51aF2oXv4D+2fbWTBQT2EwXE9O/wL6UFRZfgf//ngABWk7caADML+0D9Gum3", "text_start": 1082130432, - "data": "+AeAQNwBhEDeFoBA6haAQDwXgEBQF4BAYBiAQNQXgEC2FoBApBiAQCwZgECEGYBAYBaAQEAZgEBgFoBAABqAQBAagEAUGoBAPBeAQGQagECAGoBAKgWAQFABgEBACYBAfAqAQAAAgEDsA4BAUAGAQCACgECoAYBAmAGAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQA==", + "data": "4AeAQNwBhEB2FoBAghaAQNQWgEDoFoBA+BeAQGwXgEBOFoBAPBiAQMQYgEAcGYBA+BWAQNgYgED4FYBAmBmAQKgZgECsGYBA1BaAQPwZgEAYGoBAFAWAQFABgEAoCYBA1gOAQFABgECYAYBAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BA", "data_start": 1082470156, "bss_start": 1082392576 } \ No newline at end of file diff --git a/src/stubs/esp32c61.json b/src/stubs/esp32c61.json index adbd17c3..67cb1aff 100644 --- a/src/stubs/esp32c61.json +++ b/src/stubs/esp32c61.json @@ -1,8 +1,8 @@ { - "entry": 1082134938, - "text": "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", + "entry": 1082134832, + "text": "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", "text_start": 1082130432, - "data": "1gaAQDhAgECsFYBAthWAQAYWgEAYFoBAEheAQJAWgECEFYBAVBeAQNoXgEAyGIBAOhWAQO4XgEA6FYBArBiAQLwYgEDAGIBABhaAQA4ZgEAoGYBA7AOAQFABgEAgAoBAqAGAQJgBgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEA=", + "data": "ugaAQDhAgEBCFYBATBWAQJwVgECuFYBAqBaAQCYWgEAaFYBA6haAQHAXgEDIF4BA0BSAQIQXgEDQFIBAQhiAQFIYgEBWGIBAnBWAQKQYgEC+GIBA1gOAQFABgECYAYBAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BA", "data_start": 1082223976, "bss_start": 1082146816 } \ No newline at end of file diff --git a/src/stubs/esp32h2.json b/src/stubs/esp32h2.json index 9fb664d9..0dbfe4d8 100644 --- a/src/stubs/esp32h2.json +++ b/src/stubs/esp32h2.json @@ -1,8 +1,8 @@ { - "entry": 1082134266, - "text": "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", + "entry": 1082134162, + "text": "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", "text_start": 1082130432, - "data": "1gaAQDgAg0D6EoBABBOAQFQTgEBmE4BAYBSAQN4TgEDSEoBAohSAQCgVgECAFYBAiBKAQDwVgECIEoBA+hWAQAoWgEAOFoBAVBOAQFwWgEB2FoBA7AOAQFABgEAgAoBAqAGAQJgBgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEBQA4BAUAOAQFADgEA=", + "data": "ugaAQDgAg0CSEoBAnBKAQOwSgED+EoBA+BOAQHYTgEBqEoBAOhSAQMAUgEAYFYBAIBKAQNQUgEAgEoBAkhWAQKIVgECmFYBA7BKAQPQVgEAOFoBA1gOAQFABgECYAYBAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BAOgOAQDoDgEA6A4BA", "data_start": 1082404200, "bss_start": 1082327040 } \ No newline at end of file diff --git a/src/stubs/esp32h4.json b/src/stubs/esp32h4.json index 13503d6b..01d54bf1 100644 --- a/src/stubs/esp32h4.json +++ b/src/stubs/esp32h4.json @@ -1,8 +1,8 @@ { - "entry": 1082199802, - "text": "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", + "entry": 1082199698, + "text": "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", "text_start": 1082195968, - "data": "1gaBQDgAg0AOE4FAGBOBQGgTgUB6E4FAdBSBQPITgUDmEoFAthSBQDwVgUCUFYFAnBKBQFAVgUCcEoFADhaBQB4WgUAiFoFAaBOBQHAWgUCKFoFA7AOBQFABgUAgAoFAqAGBQJgBgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUBQA4FAUAOBQFADgUA=", + "data": "ugaBQDgAg0CmEoFAsBKBQAATgUASE4FADBSBQIoTgUB+EoFAThSBQNQUgUAsFYFANBKBQOgUgUA0EoFAphWBQLYVgUC6FYFAABOBQAgWgUAiFoFA1gOBQFABgUCYAYFAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FAOgOBQDoDgUA6A4FA", "data_start": 1082404200, "bss_start": 1082327040 } \ No newline at end of file diff --git a/src/stubs/esp32p4-rev1.json b/src/stubs/esp32p4-rev1.json new file mode 100644 index 00000000..dbed009c --- /dev/null +++ b/src/stubs/esp32p4-rev1.json @@ -0,0 +1,8 @@ +{ + "entry": 1341199446, + "text": "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", + "text_start": 1341194240, + "data": "KgfxT4gA9U9OG/FPWhvxT6ob8U+8G/FPwhzxTzYc8U8mG/FPBB3xT5Ad8U+2HfFP3BrxT6Qd8U/cGvFPMB7xT0Ae8U9EHvFPqhvxT5Ie8U+sHvFP0APxT0oB8U+SAfFPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FPNAPxTzQD8U80A/FP", + "data_start": 1341533624, + "bss_start": 1341456384 +} \ No newline at end of file diff --git a/src/stubs/esp32p4.json b/src/stubs/esp32p4.json index 9868d051..c4ba8300 100644 --- a/src/stubs/esp32p4.json +++ b/src/stubs/esp32p4.json @@ -1,8 +1,8 @@ { - "entry": 1341199552, - "text": "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", - "text_start": 1341194240, - "data": "RgfxT4gA9U+4G/FPxBvxTxQc8U8mHPFPLB3xT6Ac8U+QG/FPbh3xT/od8U8gHvFPRhvxTw4e8U9GG/FPmh7xT6oe8U+uHvFPFBzxT/we8U8WH/FP6APxT0wB8U8cAvFPpAHxT5QB8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U9MA/FPTAPxT0wD8U8=", - "data_start": 1341533624, - "bss_start": 1341456384 + "entry": 1341461590, + "text": "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", + "text_start": 1341456384, + "data": "Kgf1T4gA9k9OG/VPWhv1T6ob9U+8G/VPwhz1TzYc9U8mG/VPBB31T5Ad9U+2HfVP3Br1T6Qd9U/cGvVPMB71T0Ae9U9EHvVPqhv1T5Ie9U+sHvVP0AP1T0oB9U+SAfVPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VPNAP1TzQD9U80A/VP", + "data_start": 1341599160, + "bss_start": 1341521920 } \ No newline at end of file diff --git a/src/stubs/esp32p4r3.json b/src/stubs/esp32p4r3.json deleted file mode 100644 index 7e274d91..00000000 --- a/src/stubs/esp32p4r3.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "entry": 1341461696, - "text": "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", - "text_start": 1341456384, - "data": "Rgf1T4gA9k+4G/VPxBv1TxQc9U8mHPVPLB31T6Ac9U+QG/VPbh31T/od9U8gHvVPRhv1Tw4e9U9GG/VPmh71T6oe9U+uHvVPFBz1T/we9U8WH/VP6AP1T0wB9U8cAvVPpAH1T5QB9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U9MA/VPTAP1T0wD9U8=", - "data_start": 1341599160, - "bss_start": 1341521920 -} \ No newline at end of file diff --git a/src/stubs/esp32s2.json b/src/stubs/esp32s2.json index 415aa8e9..91fe7e1d 100644 --- a/src/stubs/esp32s2.json +++ b/src/stubs/esp32s2.json @@ -1,8 +1,8 @@ { - "entry": 1073910088, - "text": "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", + "entry": 1073909924, + "text": "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", "text_start": 1073905664, - "data": "QAD9P7yHAkBPSEFJAAAAABGVAkAWlQJAfpUCQImVAkBElgJA1pUCQOGUAkB8lgJA9JYCQF6XAkBVmQJAFpcCQFWZAkC+lwJA3JcCQOqXAkB+lQJAPpgCQFCYAkAchQJAHIICQAyDAkCwggJAnIICQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQJiEAkCYhAJAmIQCQA==", + "data": "QAD9P5SHAkBPSEFJAAAAAG2UAkBylAJA2pQCQOWUAkCglQJAMpUCQD2UAkDclQJAVJYCQL6WAkC5mAJAdpYCQLmYAkAelwJAP5cCQE6XAkDalAJAoJcCQLSXAkAMhQJAJIICQKiCAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkCIhAJAiIQCQIiEAkA=", "data_start": 1073622464, "bss_start": 1073545216 } \ No newline at end of file diff --git a/src/stubs/esp32s3.json b/src/stubs/esp32s3.json index 887c6f7c..033d17d2 100644 --- a/src/stubs/esp32s3.json +++ b/src/stubs/esp32s3.json @@ -1,29 +1,29 @@ { - "entry": 1077384644, - "text": "eALLP1iAyj8NQQAANkEAkfz/ofz/wCAAsgkAsLB0oIsRuojAiBG6iMCIEQzLioqy20G6iMAgAIIIAICAdOx4wCAAwgkAwMB0oIwRyojAiBHKiMCIEcHs/4qKyojAIACCCACAgHQWOATAIADCCQAMAgvMwMBgwMB0oIwRyojAiBHKiMCIEYqKurjAIACyCwCwsHRWSwWx3P+6iMAgAIIIAICAdFY4BMAgAMJJAMAgALIJALCwdKCLEbqIwIgRuojAiBEMi7LbQYqKuogMC8AgALkIwCAAggkAgIB0oCgRiiLAIhGKIsAiESoqHfA2QQCBxP+RxP/AIACiCAAMe6CgdKCKEaqIwIgRqojAiBGKibLbQQzZktlBJzsRDImS2UGamMAgACkJkqAMktlBmogMGcAgAJJIAB3wVIDKPzZBALGw/6Gw/8AgAMILAAzeC8zAwGDAwHSgjBHKiMCIEcqIwIgRiori3kHqmMAgAJIJAJCQdIypgfH/wCAAwkgAxgwAwCAA0gsA0NB0oJ0R2pnAmRHamcCZEZqa6pnAIACSCQCQkHScKcAgAIILAJHj/8AgAIJJAAwihhUADM3S3UHaiMAgAIIIAICAdIy4gdv/wCAAwkgAhg0AAMAgAJILAAwCkJB0oIkRmojAiBGaiMCIEYqq2qrAIACCCgCAgHSM+MAgAIILAJHM/8AgAIJJAAwSHfAAADZBAKHI/5F6/8AgALIKALCwdKCLEbqIwIgRuojAiBEMi4qJsttBuogMC8AgALkIwCAAwgoAwMB0oIwRyojAiBHKiMCIEQzMionC3EHKiMAgALJIAMAgAKIKAKCgdKCKEaqIwIgRqojAiBGKmQzYgthBipnAIACySQAd8ACIAss/NkEAgf7/iAiMGOAIAB3wAPgtyz82QQAMCBbyBHH9/6KgwIgHOjLgCABioMDGCwAAogIAZxoJkqDblxoRhgYAAKKg2+AIAIgHoqDcxgIAoqDb4AgAgicAoqDd4AgAGyKIByeTy6KgwOAIAAwYLQgd8DZBAK0CvQPl+f8tCowaJfj/HfAAUIDKP0yAyj9IgMo/RIDKPzZBAJH7/4H7/8AgALgJwCAAiAih+f+HuxrAIACICsAgAKgJG7qqiMAgALkJIkgARg8AAACBKf/AIACSCACQkHSgiRGaiMCIEZqIkST/wIgRiokM2ZLZQZqIDBnAIACSSAAMCJHm/8AgAIkKwCAAiQkd8AAANkEAIKB0IeD/wCAAiAImGCYmKFtWaAuSoMCXGgJGKwCR2f/AIACYCRYpCpHU/8AgAIkJDBgGJACCoMCHmiVxz//AIACIB5wIwCAAqAcl0P+Bzf8MCcAgAJkIDAjAIACJBwYZAIKg24eaIgwoRhYAAAwbwCAAuQKCoNyHmgaioMBGAgAAgqDdh5oJoqDb5e//hg4AAIH0/sAgAJIIAJCQdKCJEZqIwIgRmoiR7/7AiBGKiQzZktlBmoiRsv/AIACySAAMCMAgAIkJwCAAiQId8DZBAJICAYICAICZEYCZIIICAiICAwCIEZCIIIAiAYAiIB3wADZBACKg/4AiER3wAAgAAGAQAABgHAAAYDZBAIH8/5H8/8AgAIgIwCAAiQmSoQGXCCaB+P8MNcAgAHgIDAZwcJQwVQGGAwAAAMAgAKgFG2agoHSl6/93lu8d8AAADIADYBSAA2AAgANgBIADYDZBAIH7/3H9/8AgAJgIgfn/wCAAmQiGAwCB9//AIACiKACgoHSl5//AIACIByfo6B3wAAA2QQClrf+Bev8MecAgAKkIgXf/ktlBwCAAmQgd8AAAADZhAIKgAIJDACW+/xbqAKkB5fz/qAFmKgoMGIJDAAwCBhEAALHx/pGj/sAgAKILAKCgdKCKEaqIwIgRqojAiBEMioqJotpBqojAIACICIkCwCAAggsAgIB0oCgRiiLAIhGKIsAiEZoiHfAAADZBAOWk/x3wNkEAgqAAgkMA5bb/zEql/v/GAQBmKgkMGIJDAAwCxhAAsdT+kYf+wCAAogsAoKB0oIoRqojAiBGqiMCIEQyKiomi2kGqiMAgAIgIiQLAIACCCwCAgHSgKBGKIsAiEYoiwCIRmiId8AA2QQAMAh3wADZBAAwCHfAANkEAHfAAAABUIABgVDAAYDZBAJH9/8AgAIgJgIAkVkj/kfr/wCAAiAmAgCRWSP8d8AAAAFDDAAAABgBANkEAYZ//ICB0cqAADBqB+//gCADAIACIBhfoDIH3/xt3h5fnDBJGAgCBlP/AIAApCAwCHfAAAAA2QQBxkf8MBgwage7/4AgAwCAAiAcX6AeB6v8bZoeW58AgAIgHDBmQiCDAIACJBx3wAAAACQAAECwgAGAAIABgNkEAUf3/bQIwcyAioAAyoACl9P8MCMAgAIkFDBmB9/9QmQHAIACZCMAgAJgIVnn/wCAAgiUAB2ggoqABgdL/4AgAG4MwmGIqKT0IdzLCJ5cCZzi8Iej/RgAADAId8AAAAMAAAKACyz/oEQBANkEAghIBIfv/Zkgnofv/IqBjgtorgggFcCIRnFiICiH1/8zoHAzC3CuyoACB9P/gCAAMAh3wAAD0EQBANuEATKwMC60BMHMgge3/4AgAPQQMBIx1whUigqBAgExjq4SAYPQMGIJBACuEgkECckEBDAiMBYgFiRGLcZw1ghUijOitB0DEILLFBIHs/+AIAEp3MIhBgkcAiCIyRwG9Bq0B4AgAHfCAAss/AADKP7z/zj8oJgBANkEAgfv/sfv/wigAgfv/oigAgfr/4AgAkfb/DAiJCR3wAAAANkEAgfL/qAgbmpkIgfH/qogiSABm2QJl/P8MAh3wAABIBgBANkEAIKB0gf3/4AgALQod8IQCyz98Ass/vC3LP0AmAEA0JgBA0CYAQDZhAHzIh5MoMfj/xgQADBy9Aa0Cgfj/4AgAiAOiAQDgCACtAoH1/+AIAOYa4MYKAABmAycMCIkBzQEMKyCiIIHv/+AIAJgBgen/zMmoCGYaCLHn/8AgAKJLAJkIHfAAABQoAEA2QQAgoiCB/f/gCAAd8AAAkAYAQDZBACgirQLltv/cKqLCBGW2/y0KoqAAgfn/4AgA4AIADAId8AC0xAQAEnoAACT0AIgTAABgAAxgfBoAQJwGAECoBgBANkEAoiICpbL/oHogofj/gUr/4AgAgfb/wCAAiAiAihTMmIH0/+AIAAYEAAAAoez/JhgIoe3/ZigCoer/wCoRoqAAge3/4AgAcCLCvQIMCoHr/+AIAKHl/wwCgTf/4AgAHfAAAOT/zj9ECgBANkEAgf3/qAiB/f/gCAAd8LgIAEA2gQCCAjAsD4lhDBiJUYiiDI2JQYiSDBqJMYiCiSGIcokRiGKJAehCyCK4EoH0/+AIAB3wAgAAEAQAABB5Ass/IAoAQDbBAECSIJCQFIH5/1Z5B4H6/4IIABbIBaKgEKLaJ7KgAOXM/4Ew/1bKBRwGRg8AAAxIYHRjiREsCQzIDBqJIZlRDIhwkPSpAYkxiWHQmREMCKmxrQEpQTmRiXGJgZJhCoJBMHBEwGX1/3ozeiJW9PsMCEYEAM0EvQOtAoHg/+AIABa6/oHc/y0IHfAACBAAAGAQAACIEAAAhBAAAJQQAACQEAAAgBAAAJwQAACMEAAAmBAAAFwcAEAAEgBAaBwAQHQcAEA2gSFyIgKixwjlmf+B9/8MGRqIqQih9P8MOBqqoioAQJkRIIgRp7kChnkAcKcgpZf/gev/MtEQGoipCEunpZb/geT/DAQQiICpCKLHDKWV/5Hi/wwYgIpzGpmJCYgyDAeIGOAIAKHY/wwIgmMcqqGB4P/gCACB1v+R1/8aiBqZWAgMCIkJgqB0gtgQkdj/ioFGSwAAAJHV/4gyocz/GpmICLgJGqrgCACCA3S9CowYBgcArAqCIxgmSAKGSgCioHCi2hAMTKqhgQL/4AgAG0SIMogY4AgAjGeIMoIoBOAIAJG//wwIGpmJCYG6/xqIiAhHOBCBuP+Ruf8aiIgIGplAiMCJCQwHhiQAgbf/fMwaiIgIsbT/gGVjgbL/O5YaiIgIGrvAqBCBrv8aiIgIoIjAipmJC8DJEL0BJeD/VooIgan/GoiICIqRgIAUjNi9Cc0GEKEggaj/4AgAnQGBov+9CRqIkmgAgZj/zQaAoYCBov/gCACRnP+IMhqZiDioCb0G4AgAFgoEgZb/kZX/GoiICBqZaoiJCWBVwBt3nFWBj/+Rjf8aiIgIGpmYCYCHkJe4AsbU/4GH/5GH/xqIiAh6iBqZiQnGAQA8GGCIEUYQAJGA/4IjHBqZmAmQiGJWSOsMGVCJk1bI6oxXiDKISOAIAIF2/7F1/4pxsLGArQeBf//gCACIMhwLgigCrQfgCAAMCC0IHfAAADZBIAwYDBVtAn0ELQOCRAAMA0BVEUYNAAAwQsBQRGPNBL0BaqPlz//sqkDCQZ0BDAjGBABLmaLJ/KgKJgoHDAiCRwCGAgAbiIec6DLTECczxwwCBgEAPBJgIhEd8AAAADYhIZISAY0CDDJNAyAiESa5AgYgAHgoDBatB2Vx/y0KS6flcP98x10KcHIQotEQcCLAgVH/4AgAQGYRxg8AWoJgiGM7OHzIgDMQMMMgELEgcKcgJcf//HqBP/8gw8BQzGMaiMkIKrGi0RCBRf/gCACBOf86dxqIyAgMAsBVwFbF+7LREK0EgT//4AgADAIGAQA8EmAiER3wNsEADEmZERwpmSEMiZkxLAkMGJlRrQEMCYkBKUGZYTlxSYGZkZmhgmELgkEwpbv/HfAAAAgAABADAAAQRMAMYEDADGAAwAxgSMAMYEzADGBYwAxgUMAMYFTADGCECQBALAoAQJAJAEBsCQBAFAoAQDZhAIHs/n0DgggAFjgegqP/gDSAgINiAEpAMDiBPAiC2HWAk4KAM6KSYQAWJRdAgiCAYDRR5f9WVh2B7P/gCACR4/8MFcAgAGkJgen/4AgAQFUBVhoUqAG9AyWF/10KFioTUQ/+xksAIKBUIIB03AqSrz+amDz7l7sOTAZHOxyGAQAgsEQcBtwbkq8fmoiyoB+HuwVioCBHOwEcBpHN/2CFQcAgAIkJgcv/YMYgvQeAqoCBJ/7gCACByP8MHcAgACkIgcb/wCAA2Qilqf+IAcHE/zCoIL0IDB2NA9xawCAAiAwmKAJG3v+Bv//AIADZCEYOAAALq7DaYguIio2pIQwaiRGBy/3gCADBtf+IEbghwCAA2AyAqyAmLQVWWv0G0P/RsP8MHsAgAOkNzNrAIACIDCY4AkbK/wYMAAAMGokhuRGBu/3gCADBpv/AIACoDCY6GLgRiCELq7DaYguIio29CoCqIFY6/Ya9/wDQxhEMC60CC8yl4f+BnP8MGsAgAKkIqAG9A2Vy/1Za7WB3gGAigGBEwFb07IGX/+AIAIYbAKgBvQNlcP8sCLy6Ub39RhcAAAAAIFB0UtX/gJRjUFBgkFVj5Zn/UMD0cLcgIKIg0MwR5dv/qAG9AyVt/1a6/Fp3WiJQRMAsCFaE/AwFhgcAAM0EvQOtAoyFgX//4AgAhgEAAIF+/+AIABbq/VFt/y0FHfA2wQAcCqLaJwwL5Wj/fQItCuz65ZP/DFmZEQyJDBiZMa0BLAmJATkheUGZUSlhKXEpgSmRImEKgmELgkEwZZL/xgAAACGS/R3wAAAABgAAEAQgAGA2YQAMCgwLKQE5EaVj/y0KjEohif3GLwCIEXgIFocLiAE4CHz4gID1d7gEMID0jOgwgLRW6AkMFgwKQGYRhgEADBYMGgBmEYFB/oIIAKx4sqDc3GqGBAAAiAFqMzkIYIfAZ7dnDAiGGAAALButA+Xz/xY6/obm/wCAQxFRcf1ASEGsSqWH/6VR/4Hc/wwZwCAASQiQmQHAIACSZQDAIACYBVZ5/wbs/wAAJYX/JU//gdP/DBnAIABJCICZAcAgAJkFwCAAmAVWef/G4v+YEYkJBgEAAAAhyP8d8AAAQIDKP6wtyz+oLcs/oC3LPzaBAHH+/4g3zEgMAkYVAACB+P+CCAD8SIH8/agniAjNAbg4uUHlsf8tCvx6ggEAuEGcGIg3mCe6mbC4Y7CIwJkniTeGBwCR6v8MGIJJALHp/6Hp/+Xr/xb6+oE8/YcaqTwSYCIRHfAANmEAfLkMOpCTEG0EIKoRJrkChiIArQI5ASUl/0FO/X0KqQRLomUk/6kUPQqLouUj/6kkXQrLomUj/4gBnQqpNBxKsqAAp5gPosIQkmEA5SH/DBuYAaC6g6LUKwwYskoEgkoFjJZQM4IMCDJkBIJkBYHM/YgIiDiAwGALiHqImojAuRDAiBCwiMCJOoG//wwJsmoCkkgAJfD/jDo8GmCqES0KHfA2YQBhK/1dAng2LQN6c0LWK0YBAADl7f/Maogkdzj1xi8APBJgIhFGLwCIBiCIwIkGiDYqiIk2DALGKgCCBASoNozIIIoggIA0DB2cWEb0/wCgkBTcSXzHIIAUcHoQTQL8qAwNzQK9BUYbAAB8x3B6EKA3wEuDIEhjfPjNBL0FiQGaoYEb/eAIAAwNDEy9Aa0H5bD/Vqr4SlVLd0BCwHzDMDQQnFMMDc0DvQVwpyAlr/9W2vY6VTBEwDB3gBak9nz4zQS9BYkBEKEggQn94AgADA0MTL0BcKcgZaz/Fqr0xs//VmL1RtD/HfAAAMAtyz9AAMo/tALLPygIAEA2oQBIIq0EZQz/qYGixATlC//MaoH3/5H3/5kIcPpAOIFh8/9wdUEMEsYlAAAAiAaR8f9R4PyQiMCC2ICAgGCoRTlBiVGnswQMKqB3IKXa/1aKBoiBeQGyyBDiJgDR5f+h5v8wu8C6tPLBFMLBEIHj/+AIALgGLQqoUYFb/6q7eEGoRYCLYguIcKrAgIBguQapRYCAdFaIAKKgASCKgxYoAYHU/4C7wICoIKXl/8y6gdH/iQZwM8AMB8YBADwSYCIRxgQADAgnqAJWE/aCoMcgLzGAiBGAIhAd8AAANkEAghIBkbT8qCK4CYLI8ICA9LC4Y6LKEOXg/y0KHfAAAMo/AAAAQADEAAAAwwAAAMgAAADGAAAAwQAAAMkAAL0tyz8QJwAAGCAAYAAAAIDo/84/xC3LP7gtyz+cgzdAmCAMYOSIN0CAiDdACAAIYAAAAgA0iDdAEIg3QEyAAGCwgABgoTrYUJiAAGC4gABgKjEdj7SAAGCAIQxg/IQ3QBCAA2B4hjdAsIY3QGAAAGD//wH4JAAAYKiEN0AMAABgWIg3QPwtyz9QLss/tC3LPwQuyz+wLcs/fJQ3QIwCyz/4iDdAPIk3QKCTN0DEijdAZC7LPyyBAGBcBwBATBoAQAQgAEB0HwBA7AoAQIwKAEBQCgBAeBsAQLgmAECIJgBAZCYAQJAbAEAMGwBAdIEEQJwJAECEGwBAHCkAQCQnAEAIKABA5AYAQDZhAYG1/5G8/30BDAoGAQAAqQhLiJc4+IHm/+AIAIxqggoYDBQmOBGB4v/gCAAMBJx6ggoYZkgSDCQsioHe/+AIAKGu/4Ea/OAIAIHb/+AIAF0Kgdr/4AgADAuB2f/gCACRp/9hqP/AIACICWCIIMAgAIkJFoUAgaT/kaT/kmgAgdH/4AgAgdX8HMmICKgIoIB0hzkKHBmxkf+HuSLGAwA8mbGO/5eYFwwbcLsBxgMADBsAGEAAu6EMGICIAbe4B4Hd/AwZkkgAfP8MHQwc8PD14qEAQN0RAMwRgbv/4AgAUQD7JhQKZiQCBiIAxkoAAACBh/8cE5GH/zkIgWr8YVH8mQiRTvwMCIkJkWj8wWb8qAbAIACCSQAMK4Fn/OAIAIF+/7F+/8AgADkIDAwcGoGn/+AIALF6/6gGgaX/4AgAqAaBpP/gCACoBoGj/+AIAJF1/6F1/8AgAIgJQIggwCAAiQmBnv/gCACBcP+JBYFw/8ZNAACBb/8MisAgAJgIsXD/oJkgwCAAmQiha/+Ra/8MDMAgAJkKDAnAIACZC8AgAJkKwCAAqAgMGxC7EbCqIMAgAKkIoWP/gWT/sWT/wCAAiQrAIACIC2CIIMAgAIkLgWD/wCAAmQocGcAgAJkIgVP7fPmxXP/AIACZCKKgEYF3/+AIAJFY/wxKwCAAiAmgiCChSf/AIACJCYF0/+AIAIFT/4kFgVL/BiQAoTj/gaT74AgADAqBUvzgCACRTv+hTv/AIACICbFO/6CIEAxa4KoBoIggwCAAiQmRSP8MGsAgAIgJkKoBoIggwCAAiQnAIACICaKsAKCIECwKoIggwCAAiQmBGvt8+cAgAJkIDAyioAWBUv/gCACROv+ioQHAIACICaCIIMAgAIkJoqAggU//4AgAgTT/iQUMCJGI+oJpAKXL/oEx/wxLkggAoggBkkd4kggCgggDokd5kkd6gkd7osd4pab+ssd8osd05cr+ggd8XQoWaABllv4G+v8AFophggoB8goAgmcgjI/B+f4MDb0IRgcAggoDkgoCgIgRkDggoicdksMIlxoSwZv7sicg0qAAoRb/per+Ru7/APJnIUulJbf+gicgYRL/8ichgkdggQ//i5XoBvJHYTJXMaJnGZJnGoJnGy0KnE6yJyAMDeDOIICoIKXm/vInIfkGBt3/4mcikmchTMyyoABwpyCBhPvgCACCJyAcSpInIeInIoc6HvYoAsZGAaLI/qCgdBwrp7sChjABsff+sKqgqAqgCgCCJyCioNKnmAKG+ACHOhSioNCnmAKG/QCioNGnmAKGAwGGNwGCJyCioNOnmALGwP8GIQEALEmXkxkMdaInGwwNDAwMi6Xd/guFXQhWyP7GAgAAAKFh+wyLqQbGMgGJBgyLBiwBDAyGtQAM+je6WKHr/aIKBRZ6BK0Jpaf+gsPwgID0h5oxDAmioO9GAgCatbILGBuZsKowhznyp5IRgc7+kc7+DDuZCAwIiQaGGQEAoaP+BgUAAAChov4GAwAAAKGe/gYBAAAAoZv+qQYMO8YVAaLHYOXQ/gabAAAAZrM/rQklof6Bvv6pCKLFDGWg/oG8/qJoAaLFEKWf/oG5/qJoAqLFFOWe/oG2/pG1/qk4DBiCSRAMCIkGDFvG/QAAAKEu+wxbqQbG/wAM+je6YIGs/qIIEBb6BK0JpZv+gaj+LQqYCKc5OILD8ICA9IcaAwYLAACBo/7NCqg4ssUYgS/74AgAgZ/+kZ7+iDgMeyqIiTmICSCIwIkJDAiJBkblAIFw/okGBucAoWz+BgEAAAChaf6pBgx7xuMAAGaDKaGQ/oIKEJyYDAscTIEN++AIAIGK/pGM/gxrmQgMCIkGBtUAoV3+xgAAAKEE+6kGDGvG1QAAAIyDMJA0DAIwNEGMuaFV/gybqQbGzwAAAABSJxogkPTAmRGaVa0FpY/+omciS6Ulj/6iZyGLpaWO/qJnIMulJY7+gbn64AgAgicgkichsicigJkQJggNwCAAqAugiBCgiDCAmSAbIsAgAJkLIJD0NzmnDAiJBgybxrEAAABmQxStCeWJ/sAgAIgKDKuJBwwIiQZGqwCh3PoMq6kGxq0AZkM5rQnlh/5dChzqgWv+4AgAHPqBaf7gCAAsCoFn/uAIABzagWX+4AgADAutBYFb/uAIAAwIiQYM24aZAKHK+gzbqQYGnAAAHIqnk1StCSWD/qJnIMulpYL+PQqixRAlgv6iZyKixRSlgf6iZyGixRglgf4tCqLFHKWA/v0K0ichwicioicg7QIwsyCBRf7gCACMSqEJ/oYCAKkGDLuGgAAAobH6qQYMu8aCAGaDEoEt/pEx/gz7mQgMCIkGxngAAAChqfoM+6kGxnoAAAwcvQOtCSVU/6kGxnAAAAz6N7pCgTL9gggFvDitCWV5/qqlgqDvxgEAkgUYG1WQiDBXmvSHkhGBGP6RHP4cG5kIDAiJBoZjAACh7f2GAgAAAKHq/YYAAKGQ+qkGHBtGYgBLt6LHYOUB/xwIqQaCVyKGVwAAAF0BjLOhiPocSxAVAKkGBlkAwsdMsqAAoqAAgRj+4AgAVgr+ssdMHExLp4GP+uAIABxJklciHEs5BkZJAGazEIH5/ZH+/ekGmQiyoNKGRAAAoXX6sqDSqQaGRgAAgQn+4AgAjKqhxf2yoNCpBoZBAAAMCIkGsqDQxjkAAAAAJoMFoWn6hhsArQlla/49CqJnHMul5Wr+gff6omcTiAiIOICT4lap/YCa4lZJ/QuYqpmAmcKCp1OgiBGAOYIMBQYHAACyx0yix3ClK/8MGoEf+uAIAAuDMJhiC1U9CFpZgicTFlgAUIMgVnj9rQO9BWWN/oyaoaH9qQayoNEGHgCpBrKg0QYXAIInIByrosgroKB0pzs8TMyyoACSZyFwpyCBQ/rgCACCJyChxv2yrKywuKC6qugKsichrQjdB80D4A4AgicSqQacSJG3/YkJRgMAAKGL/bInIKkGhgYAAACyJyDcKqGt/d0HDAwlkP7GBQAAAKGG/Qx7zQqhqP0MDeWO/oGp/QwJmQiBp/0MBYgIWQYW2J6ix2DgCACBov2pBlkIRnf+ACYUAkZx/pFm+sAgAIIJAICAdBZom4F7/cAgAKJJAKgIABpAAKShga794AgAoXH9gd354AgAgav94AgAkZn9fOrAIACCKQCgiBCha/3AIACCaQCBpf3gCACBpf3gCAAMCoGk/eAIAIZY/gAAAA==", + "entry": 1077384484, + "text": "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", "text_start": 1077379072, - "data": "QADKPxgYGBgQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABYiDdAT0hBSQAAAADdmTdA4pk3QEqaN0BVmjdAE5s3QKKaN0CtmTdATJs3QMibN0AynDdAMZ43QOqbN0AxnjdAlpw3QLecN0DGnDdASpo3QBidN0AsnTdAUIU3QBSCN0AEgzdAqII3QJSCN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0CQhDdAkIQ3QJCEN0A=", + "data": "QADKPxgYGBgQAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwiDdAT0hBSQAAAAA9mTdAQpk3QKqZN0C1mTdAc5o3QAKaN0ANmTdAqpo3QCibN0CSmzdAjZ03QEqbN0CNnTdA9ps3QBacN0AmnDdAqpk3QHqcN0CMnDdAOIU3QBSCN0CYgjdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdAeIQ3QHiEN0B4hDdA", "data_start": 1070280128, "bss_start": 1070202880, "plugin_first_opcode": 213, - "plugin_table_offset": 164, + "plugin_table_offset": 156, "plugin_table_entries": 27, "plugins": { "nand": { - "text": "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", - "text_start": 1077387072, - "bss_size": 10292, + "text": "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", + "text_start": 1077386912, + "bss_size": 10288, "handlers": { - "0xD5": 1816, - "0xD6": 3144, - "0xD7": 3248, - "0xD8": 3424, - "0xD9": 3520, - "0xDA": 3572, - "0xDE": 3752, - "0xDB": 3856, - "0xDC": 3892, - "0xDD": 3968 + "0xD5": 1728, + "0xD6": 3056, + "0xD7": 3160, + "0xD8": 3336, + "0xD9": 3416, + "0xDA": 3468, + "0xDE": 3648, + "0xDB": 3752, + "0xDC": 3788, + "0xDD": 3864 } } } diff --git a/src/stubs/esp32s31.json b/src/stubs/esp32s31.json index 3d5ad405..5e03a685 100644 --- a/src/stubs/esp32s31.json +++ b/src/stubs/esp32s31.json @@ -1,8 +1,8 @@ { - "entry": 788537988, - "text": "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", + "entry": 788537886, + "text": "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", "text_start": 788533248, - "data": "MBcAL4igAC+oJwAvtCcALwQoAC8WKAAvHCkAL5AoAC+AJwAvXikAL+opAC8WKgAvNicAL/4pAC82JwAvkCoAL6AqAC+kKgAvBCgAL/IqAC8MKwAv5hMAL0oRAC8aEgAvohEAL5IRAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC9KEwAvShMAL0oTAC8=", + "data": "FBcAL4igAC9CJwAvTicAL54nAC+wJwAvtigALyooAC8aJwAv+CgAL4QpAC+wKQAv0CYAL5gpAC/QJgAvKioALzoqAC8+KgAvnicAL4wqAC+mKgAv0BMAL0oRAC+SEQAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAvNBMALzQTAC80EwAv", "data_start": 788647352, "bss_start": 788570112 } \ No newline at end of file diff --git a/src/stubs/esp8266.json b/src/stubs/esp8266.json index 4e64357a..0bbfae88 100644 --- a/src/stubs/esp8266.json +++ b/src/stubs/esp8266.json @@ -1,8 +1,8 @@ { "entry": 1074840836, - "text": "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", + "text": "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", "text_start": 1074840832, - "data": "fM0QQCyB/j8AAAAAAAAAAAAAAQAAEAAAAAEAAP//AAD/////x9cQQBXYEEBJ2BBA79gQQAToEEBN2RBApdkQQPTZEEAE6BBAz9oQQEbbEED32xBABOgQQAToEECh3BBABOgQQGffEEA74BBAe+AQQAToEEAE6BBAH+EQQAToEEAX4hBAyeIQQBnkEEDn5BBAweUQQAToEEAE6BBABOgQQAToEEDZ5hBABOgQQPDnEEC83RBAutgQQAToEED02hBAN9oQQAToEECB5xBAy+cQQAToEEAE6BBABOgQQAToEEAE6BBABOgQQAToEEAE6BBAZdoQQKDaEEBC5hBAkMwQQLTJEECUyRBABMkQQHzJEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEECYxhBAmMYQQJjGEEABAAAAAgAAAAMAAAAEAAAABQAAAAcAAAAJAAAADQAAABEAAAAZAAAAIQAAADEAAABBAAAAYQAAAIEAAADBAAAAAQEAAIEBAAABAgAAAQMAAAEEAAABBgAAAQgAAAEMAAABEAAAARgAAAEgAAABMAAAAUAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAIAAAACAAAAAwAAAAMAAAAEAAAABAAAAAUAAAAFAAAABgAAAAYAAAAHAAAABwAAAAgAAAAIAAAACQAAAAkAAAAKAAAACgAAAAsAAAALAAAADAAAAAwAAAANAAAADQAAAAAAAAAAAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADQAAAA8AAAARAAAAEwAAABcAAAAbAAAAHwAAACMAAAArAAAAMwAAADsAAABDAAAAUwAAAGMAAABzAAAAgwAAAKMAAADDAAAA4wAAAAIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAAAAAAAAAAAAAAAAAAAAQERIACAcJBgoFCwQMAw0CDgEPAAEBAAABAAAABAAAAAUFBAACAwcAAwMLAA==", + "data": "RM0QQCyB/j8AAAAAAAAAAAAAAQAAEAAAAAEAAP//AAD/////A9cQQFHXEECE1xBAKdgQQDjnEECF2BBA3dgQQCzZEEA45xBAB9oQQHzaEEAs2xBAOOcQQDjnEEDV2xBAOOcQQJveEEBv3xBAsd8QQDjnEEA45xBAU+AQQDjnEEBL4RBA/eEQQE3jEEAb5BBA9eQQQDjnEEA45xBAOOcQQDjnEEAN5hBAOOcQQCTnEEDw3BBA8tcQQDjnEEAs2hBAb9kQQDjnEEC15hBA/+YQQDjnEEA45xBAOOcQQDjnEEA45xBAOOcQQDjnEEA45xBAndkQQNjZEEB25RBAWMwQQHzJEED0yBBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAhMYQQITGEECExhBAAQAAAAIAAAADAAAABAAAAAUAAAAHAAAACQAAAA0AAAARAAAAGQAAACEAAAAxAAAAQQAAAGEAAACBAAAAwQAAAAEBAACBAQAAAQIAAAEDAAABBAAAAQYAAAEIAAABDAAAARAAAAEYAAABIAAAATAAAAFAAAABYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AAAAAAAAAAAAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAA0AAAAPAAAAEQAAABMAAAAXAAAAGwAAAB8AAAAjAAAAKwAAADMAAAA7AAAAQwAAAFMAAABjAAAAcwAAAIMAAACjAAAAwwAAAOMAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAQAAAAEAAAACAAAAAgAAAAIAAAACAAAAAwAAAAMAAAADAAAAAwAAAAQAAAAEAAAABAAAAAQAAAAFAAAABQAAAAUAAAAFAAAAAAAAAAAAAAAAAAAAEBESAAgHCQYKBQsEDAMNAg4BDwABAQAAAQAAAAQAAAAFBQQAAgMHAAMDCwA=", "data_start": 1073720940, "bss_start": 1073643776 } \ No newline at end of file diff --git a/src/stubs/index.ts b/src/stubs/index.ts index e0a67e62..7970b4fa 100644 --- a/src/stubs/index.ts +++ b/src/stubs/index.ts @@ -23,6 +23,7 @@ interface LoadedStub { text_start: number; entry: number; data_start: number; + default?: LoadedStub; } export interface Stub { @@ -40,10 +41,7 @@ export const getStubCode = async ( let stubcode!: LoadedStub; // Chips without stub support yet - if ( - chipFamily == CHIP_FAMILY_ESP32H4 || - chipFamily == CHIP_FAMILY_ESP32H21 - ) { + if (chipFamily == CHIP_FAMILY_ESP32H21) { return null; } @@ -67,12 +65,19 @@ export const getStubCode = async ( stubcode = await import("./esp32c61.json"); } else if (chipFamily == CHIP_FAMILY_ESP32H2) { stubcode = await import("./esp32h2.json"); + } else if (chipFamily == CHIP_FAMILY_ESP32H4) { + stubcode = await import("./esp32h4.json"); } else if (chipFamily == CHIP_FAMILY_ESP32P4) { - // ESP32-P4: Use esp32p4r3.json for Rev. 300+, esp32p4.json for older revisions - if (chipRevision !== null && chipRevision !== undefined && chipRevision >= 300) { - stubcode = await import("./esp32p4r3.json"); - } else { + // esp32p4.json for Rev 3.x (300+) and + // esp32p4-rev1.json for older revisions. + if ( + chipRevision !== null && + chipRevision !== undefined && + chipRevision >= 300 + ) { stubcode = await import("./esp32p4.json"); + } else { + stubcode = await import("./esp32p4-rev1.json"); } } else if (chipFamily == CHIP_FAMILY_ESP32S31) { stubcode = await import("./esp32s31.json"); @@ -81,10 +86,12 @@ export const getStubCode = async ( return null; } + const sc = stubcode?.default ?? stubcode; + // Base64 decode the text and data return { - ...stubcode, - text: toByteArray(atob(stubcode.text)), - data: toByteArray(atob(stubcode.data)), + ...sc, + text: toByteArray(atob(sc.text)), + data: toByteArray(atob(sc.data)), }; };