getprop("ro.product.device") == "cmi" || abort("E3004: This package is for \"cmi\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/cmi_eea/cmi:11/RKQ1.200826.002/V12.2.3.0.RJAEUXM:user/release-keys");
ui_print("Target: Xiaomi/cmi_eea/cmi:11/RKQ1.200826.002/V12.2.4.0.RJAEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cmi_eea/cmi:11/RKQ1.200826.002/V12.2.3.0.RJAEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cmi_eea/cmi:11/RKQ1.200826.002/V12.2.4.0.RJAEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cmi_eea/cmi:11/RKQ1.200826.002/V12.2.3.0.RJAEUXM:user/release-keys or Xiaomi/cmi_eea/cmi:11/RKQ1.200826.002/V12.2.4.0.RJAEUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:4ad65362b0de936b1d42caae067c276d39ef904b"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7a01b811ce1705bc1ab70ba47464e89cdeda1fff")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:4ad65362b0de936b1d42caae067c276d39ef904b"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7a01b811ce1705bc1ab70ba47464e89cdeda1fff"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "26,1,35,45,55,57,61,89,90,114,115,20478,20479,26643,26644,28058,39086,50092,655374,655379,688129,688147,699583,701679,712798,712947,712948") == "25c58de4c902355ba66607739bbef92db98c9560" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "26,1,35,45,55,57,61,89,90,114,115,20478,20479,26643,26644,28058,39086,50092,655374,655379,688129,688147,699583,701679,712798,712947,712948") && block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1(map_partition("vendor"), "1034,1,28,38,42,47,48,126,134,140,141,1815,1819,2296,2297,2302,2306,2310,2311,2316,2322,2323,2324,2568,2572,2577,2578,2580,2584,2586,2587,2610,2611,2647,2651,2701,2702,2713,2719,2720,2721,2724,2730,2731,2732,2735,2736,2741,2742,4334,4335,7513,7514,7956,7957,16833,16834,17909,17911,17912,17913,17915,17918,17919,17920,17922,17924,17925,17926,17928,17930,17931,17932,17934,17936,17937,17938,17940,17942,17943,17944,17946,17948,17953,17955,17958,17960,17963,17965,17973,17975,17978,17980,17981,17982,17984,17986,17987,17988,17991,17993,17994,17995,17997,17999,18000,18001,18003,18005,18006,18007,18009,18011,18012,18013,18015,18017,18018,18019,18028,18029,18048,18049,18050,18051,18055,18056,18057,18058,18061,18062,18063,18064,18067,18068,18069,18070,18073,18074,18075,18076,18080,18081,18082,18083,18086,18087,18088,18089,18093,18094,18098,18099,18103,18104,18108,18109,18113,18114,18115,18116,18125,18126,18127,18128,18131,18132,18133,18134,18137,18138,18139,18140,18143,18144,18145,18146,18148,18150,18442,18443,18558,18559,19602,19608,32768,32794,61046,61047,61675,61677,65536,65555,67160,67161,74232,74233,74332,74334,75134,75135,76157,76159,76207,76208,80827,80828,81462,81464,82098,82099,82188,82189,86529,86530,87146,87147,88874,88875,91556,91557,98304,98325,104495,104496,104500,104502,104519,104520,104555,104556,104565,104566,104709,104710,104760,104761,105473,105474,105483,105484,107823,107824,107849,107850,107885,107886,107996,107997,108040,108041,108519,108520,112446,112447,112461,112462,112517,112518,112585,112586,112588,112590,112654,112655,112725,112726,112793,112794,112796,112797,112799,112800,112859,112861,112863,112864,112928,112929,112999,113000,113067,113068,113070,113071,113073,113079,113081,113082,113084,113086,113088,113099,113159,113160,113162,113163,113173,113174,113240,113241,113318,113319,113329,113330,113396,113397,113473,113474,113553,113554,113630,113631,113707,113708,113784,113785,113799,113800,113863,113864,113939,113940,113950,113951,114017,114018,114094,114095,114167,114168,114170,114171,114183,114189,114249,114250,114251,114253,114255,114256,114325,114326,114402,114403,114480,114481,114555,114556,114558,114559,114702,114703,114780,114781,114794,114795,114859,114860,114938,114939,115013,115014,115016,115017,115094,115095,115169,115170,115172,115173,115239,115240,115242,115243,115308,115309,115311,115312,115381,115382,115384,115385,115450,115451,115453,115454,115522,115523,115525,115526,115593,115594,115670,115671,115745,115746,115748,115749,115817,115818,115820,115821,115829,115830,115890,115891,115893,115894,115963,115964,115966,115967,116037,116038,116040,116041,116112,116113,116115,116116,116188,116189,116190,116191,116263,116264,116265,116266,116339,116340,116342,116343,116412,116413,116416,116417,116485,116486,116488,116489,116558,116559,116561,116562,116635,116636,116638,116639,116708,116709,116711,116712,116780,116781,116783,116785,116854,116855,116857,116858,116929,116930,116996,116997,117065,117066,117133,117134,117203,117204,117270,117271,117338,117339,117409,117410,117474,117475,117477,117478,117545,117546,117548,117549,117645,117646,117658,117659,118122,118124,118183,118184,122026,122027,122129,122130,122243,122244,122649,122650,122711,122712,122851,122852,122973,122974,123042,123043,123211,123212,123327,123328,123373,123374,123590,123591,123632,123633,123670,123671,123848,123849,123982,123983,124153,124154,124366,124367,124468,124469,124523,124524,124574,124575,124673,124674,124760,124761,124762,124763,124852,124854,124861,124863,124864,124865,124872,124873,126326,126327,126365,126366,127415,127416,128451,128452,130604,130605,130753,130754,130776,130777,130778,130779,130785,130786,131072,131100,131210,131211,131212,131213,131638,131641,131643,131650,131651,131664,131665,131691,131692,131718,131719,131728,131729,131733,131735,131742,131743,131755,131756,131782,131783,131809,131810,131819,132024,132025,132116,132117,132126,132127,132129,132131,133009,133017,133018,133020,133021,133023,133025,133026,133027,133029,133031,133032,133034,133035,133042,133044,133052,133053,133054,133062,133073,133074,133076,133077,134099,134100,134101,134102,134107,134112,134116,134117,134118,134119,134120,134125,134126,134129,134138,134143,134144,134146,134147,134149,134150,134151,134157,134160,134161,134163,134164,134166,134168,134169,134177,134178,134195,134196,134197,134205,134390,134392,134554,134555,135145,135146,135148,135149,135157,135158,135160,135161,135332,135333,135462,135463,135485,135486,135587,135591,135780,135786,135787,135788,135852,135853,135864,135865,135867,135868,135870,135871,135878,135879,135881,135882,135884,135885,136656,136657,136659,136660,136667,136668,136670,136671,137658,137659,137661,137662,138568,138579,138585,138586,138587,138588,139222,139223,139885,139886,139887,139888,140248,140249,140250,140251,140567,140568,140954,140955,142575,142576,142577,142578,144406,144407,144700,144701,144702,144703,144793,144794,144833,144838,145295,145296,145298,145299,145421,145422,145424,145425,145427,145428,145501,145502,145739,145741,146019,146020,146248,146250,146251,146256,146412,146414,147264,147265,147267,147268,147270,147271,147279,147280,147282,147283,147290,147291,148643,148645,148843,148845,148846,148848,148849,148851,148852,148853,148855,148856,148858,148860,148861,148862,149312,149313,149315,149317,149836,149837,149839,149841,150265,150266,154686,157131,160450,160451,160989,161004,161305,161306,163840,163873,166987,166989,170401,170402,174345,174346,174348,174349,180342,180343,181348,181349,182262,182263,185129,185130,186391,186392,190461,192580,192586,198142,198375,198376,199946,199947,202406,202407,204723,204725,207258,207259,207958,207959,208786,208793,209417,209418,217496,217497,217555,217556,218457,220705,224396,224398,225255,225256,229376,229402,230177,230178,231621,231622,232027,232089,240459,240460,245003,245004,245006,245007,245143,245144,245177,245178,246894,246901,263576,263806,264096,264097,265952,265953,266287,266298,266312,266323,266360,266361,266373,266374,275876,275877,277122,277123,277248,277310,288702,288703,289169,289170,292029,292031,294912,294935,295077,295078,295080,295081,295087,295088,295173,295174,295414,295415,296739,296740,298486,298487,300302,300303,305233,305234,314357,314358,318919,318920,318926,318928,318935,318936,327054,327055,327059,327060,327067,327068,327680,327699,330182,330183,330188,330189,330191,330192,330348,330349,331576,331577,331778,331840,333033,333034,333252,333253,334808,334809,336283,336284,337715,337716,338226,338227,345905,345906,356595,356596,359997,360013,360448,360467,364608,364609,364611,364612,364619,364620,367898,367899,372902,372903,379400,379401,379407,379409,379416,379417,380234,380235,380257,380258,381068,381070,381271,381272,382789,382795,382796,382797,384022,384024,388083,388084,391135,391136,391162,391163,391830,391831,393216,393231,393235,393236,394399,394401,394421,394422,394453,398983,398990,399001,400218,406562,406654,406655") == "3330882ef06b0f513d50664187a90488b77eaf44" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "1034,1,28,38,42,47,48,126,134,140,141,1815,1819,2296,2297,2302,2306,2310,2311,2316,2322,2323,2324,2568,2572,2577,2578,2580,2584,2586,2587,2610,2611,2647,2651,2701,2702,2713,2719,2720,2721,2724,2730,2731,2732,2735,2736,2741,2742,4334,4335,7513,7514,7956,7957,16833,16834,17909,17911,17912,17913,17915,17918,17919,17920,17922,17924,17925,17926,17928,17930,17931,17932,17934,17936,17937,17938,17940,17942,17943,17944,17946,17948,17953,17955,17958,17960,17963,17965,17973,17975,17978,17980,17981,17982,17984,17986,17987,17988,17991,17993,17994,17995,17997,17999,18000,18001,18003,18005,18006,18007,18009,18011,18012,18013,18015,18017,18018,18019,18028,18029,18048,18049,18050,18051,18055,18056,18057,18058,18061,18062,18063,18064,18067,18068,18069,18070,18073,18074,18075,18076,18080,18081,18082,18083,18086,18087,18088,18089,18093,18094,18098,18099,18103,18104,18108,18109,18113,18114,18115,18116,18125,18126,18127,18128,18131,18132,18133,18134,18137,18138,18139,18140,18143,18144,18145,18146,18148,18150,18442,18443,18558,18559,19602,19608,32768,32794,61046,61047,61675,61677,65536,65555,67160,67161,74232,74233,74332,74334,75134,75135,76157,76159,76207,76208,80827,80828,81462,81464,82098,82099,82188,82189,86529,86530,87146,87147,88874,88875,91556,91557,98304,98325,104495,104496,104500,104502,104519,104520,104555,104556,104565,104566,104709,104710,104760,104761,105473,105474,105483,105484,107823,107824,107849,107850,107885,107886,107996,107997,108040,108041,108519,108520,112446,112447,112461,112462,112517,112518,112585,112586,112588,112590,112654,112655,112725,112726,112793,112794,112796,112797,112799,112800,112859,112861,112863,112864,112928,112929,112999,113000,113067,113068,113070,113071,113073,113079,113081,113082,113084,113086,113088,113099,113159,113160,113162,113163,113173,113174,113240,113241,113318,113319,113329,113330,113396,113397,113473,113474,113553,113554,113630,113631,113707,113708,113784,113785,113799,113800,113863,113864,113939,113940,113950,113951,114017,114018,114094,114095,114167,114168,114170,114171,114183,114189,114249,114250,114251,114253,114255,114256,114325,114326,114402,114403,114480,114481,114555,114556,114558,114559,114702,114703,114780,114781,114794,114795,114859,114860,114938,114939,115013,115014,115016,115017,115094,115095,115169,115170,115172,115173,115239,115240,115242,115243,115308,115309,115311,115312,115381,115382,115384,115385,115450,115451,115453,115454,115522,115523,115525,115526,115593,115594,115670,115671,115745,115746,115748,115749,115817,115818,115820,115821,115829,115830,115890,115891,115893,115894,115963,115964,115966,115967,116037,116038,116040,116041,116112,116113,116115,116116,116188,116189,116190,116191,116263,116264,116265,116266,116339,116340,116342,116343,116412,116413,116416,116417,116485,116486,116488,116489,116558,116559,116561,116562,116635,116636,116638,116639,116708,116709,116711,116712,116780,116781,116783,116785,116854,116855,116857,116858,116929,116930,116996,116997,117065,117066,117133,117134,117203,117204,117270,117271,117338,117339,117409,117410,117474,117475,117477,117478,117545,117546,117548,117549,117645,117646,117658,117659,118122,118124,118183,118184,122026,122027,122129,122130,122243,122244,122649,122650,122711,122712,122851,122852,122973,122974,123042,123043,123211,123212,123327,123328,123373,123374,123590,123591,123632,123633,123670,123671,123848,123849,123982,123983,124153,124154,124366,124367,124468,124469,124523,124524,124574,124575,124673,124674,124760,124761,124762,124763,124852,124854,124861,124863,124864,124865,124872,124873,126326,126327,126365,126366,127415,127416,128451,128452,130604,130605,130753,130754,130776,130777,130778,130779,130785,130786,131072,131100,131210,131211,131212,131213,131638,131641,131643,131650,131651,131664,131665,131691,131692,131718,131719,131728,131729,131733,131735,131742,131743,131755,131756,131782,131783,131809,131810,131819,132024,132025,132116,132117,132126,132127,132129,132131,133009,133017,133018,133020,133021,133023,133025,133026,133027,133029,133031,133032,133034,133035,133042,133044,133052,133053,133054,133062,133073,133074,133076,133077,134099,134100,134101,134102,134107,134112,134116,134117,134118,134119,134120,134125,134126,134129,134138,134143,134144,134146,134147,134149,134150,134151,134157,134160,134161,134163,134164,134166,134168,134169,134177,134178,134195,134196,134197,134205,134390,134392,134554,134555,135145,135146,135148,135149,135157,135158,135160,135161,135332,135333,135462,135463,135485,135486,135587,135591,135780,135786,135787,135788,135852,135853,135864,135865,135867,135868,135870,135871,135878,135879,135881,135882,135884,135885,136656,136657,136659,136660,136667,136668,136670,136671,137658,137659,137661,137662,138568,138579,138585,138586,138587,138588,139222,139223,139885,139886,139887,139888,140248,140249,140250,140251,140567,140568,140954,140955,142575,142576,142577,142578,144406,144407,144700,144701,144702,144703,144793,144794,144833,144838,145295,145296,145298,145299,145421,145422,145424,145425,145427,145428,145501,145502,145739,145741,146019,146020,146248,146250,146251,146256,146412,146414,147264,147265,147267,147268,147270,147271,147279,147280,147282,147283,147290,147291,148643,148645,148843,148845,148846,148848,148849,148851,148852,148853,148855,148856,148858,148860,148861,148862,149312,149313,149315,149317,149836,149837,149839,149841,150265,150266,154686,157131,160450,160451,160989,161004,161305,161306,163840,163873,166987,166989,170401,170402,174345,174346,174348,174349,180342,180343,181348,181349,182262,182263,185129,185130,186391,186392,190461,192580,192586,198142,198375,198376,199946,199947,202406,202407,204723,204725,207258,207259,207958,207959,208786,208793,209417,209418,217496,217497,217555,217556,218457,220705,224396,224398,225255,225256,229376,229402,230177,230178,231621,231622,232027,232089,240459,240460,245003,245004,245006,245007,245143,245144,245177,245178,246894,246901,263576,263806,264096,264097,265952,265953,266287,266298,266312,266323,266360,266361,266373,266374,275876,275877,277122,277123,277248,277310,288702,288703,289169,289170,292029,292031,294912,294935,295077,295078,295080,295081,295087,295088,295173,295174,295414,295415,296739,296740,298486,298487,300302,300303,305233,305234,314357,314358,318919,318920,318926,318928,318935,318936,327054,327055,327059,327060,327067,327068,327680,327699,330182,330183,330188,330189,330191,330192,330348,330349,331576,331577,331778,331840,333033,333034,333252,333253,334808,334809,336283,336284,337715,337716,338226,338227,345905,345906,356595,356596,359997,360013,360448,360467,364608,364609,364611,364612,364619,364620,367898,367899,372902,372903,379400,379401,379407,379409,379416,379417,380234,380235,380257,380258,381068,381070,381271,381272,382789,382795,382796,382797,384022,384024,388083,388084,391135,391136,391162,391163,391830,391831,393216,393231,393235,393236,394399,394401,394421,394422,394453,398983,398990,399001,400218,406562,406654,406655") && block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;
if (range_sha1(map_partition("product"), "300,1,16,2804,2805,5712,5713,5729,5733,5737,5738,10481,10485,10547,10548,12842,12845,12849,12850,12890,12891,19544,19545,27441,27442,30254,30255,30617,30621,31140,31141,31153,31159,31160,31161,32768,32777,33010,33014,33056,33057,34447,34448,36133,36134,36141,36142,36187,36188,36478,36479,36485,36486,36572,36573,36574,36575,38507,38511,38582,38583,42702,42703,50698,50699,51094,51095,59904,59905,64248,64249,64333,64335,64349,64352,64412,64417,64430,64432,64577,64580,65536,65543,68289,68290,77805,77806,85969,85976,86073,86077,86107,86113,86211,86215,86482,86489,86517,86523,87050,87056,87326,87333,88099,88105,88622,88623,93500,93501,97262,97263,98304,98313,103436,103438,104372,104373,104378,104379,104507,104513,104514,104515,104527,104533,104534,104535,105374,105375,107377,107379,119644,119645,119697,119698,121507,121509,131072,131079,136458,136459,136473,136474,136919,136920,138351,138352,144978,144979,145581,145582,146822,146823,150873,150874,155023,155025,155868,155869,155876,155877,155883,155884,159741,159742,159749,159751,159920,159921,159922,159923,159926,159927,159942,159943,159946,159948,159949,159951,159969,159970,159981,159982,160021,160025,160029,160033,160034,160038,160039,160055,160470,160471,160842,160843,162328,162329,163505,163507,163840,163883,167394,167395,174541,174543,180338,180339,182327,182328,183855,183858,184071,184073,193593,193594,193597,193598,194200,194202,194614,194616,196608,196636,196829,196830,196832,196833,203952,203953,204047,204048,204227,204228,204238,204239,205349,205353,205409,205410,205435,205436,205572,205576,205584,205585,206973,206977,207012,207013,207153,207159,207160,207161,207165,207166,207282,207286,207287,207288,207568,207569,210056,210059,211945,211946,213580,213583,214511,214512,216353,216354,216853,216857,217536,217538,220109,220111,229376,229392,230474,230475,230704,230705,231493,231500,231525,231532,251893,251896,262144,262145,268264,268265,271612,271615,274949,274950,282228,286703,286773,286774") == "bd07b374ace1d7552ee1f2926eb316c86c43d9e7" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "300,1,16,2804,2805,5712,5713,5729,5733,5737,5738,10481,10485,10547,10548,12842,12845,12849,12850,12890,12891,19544,19545,27441,27442,30254,30255,30617,30621,31140,31141,31153,31159,31160,31161,32768,32777,33010,33014,33056,33057,34447,34448,36133,36134,36141,36142,36187,36188,36478,36479,36485,36486,36572,36573,36574,36575,38507,38511,38582,38583,42702,42703,50698,50699,51094,51095,59904,59905,64248,64249,64333,64335,64349,64352,64412,64417,64430,64432,64577,64580,65536,65543,68289,68290,77805,77806,85969,85976,86073,86077,86107,86113,86211,86215,86482,86489,86517,86523,87050,87056,87326,87333,88099,88105,88622,88623,93500,93501,97262,97263,98304,98313,103436,103438,104372,104373,104378,104379,104507,104513,104514,104515,104527,104533,104534,104535,105374,105375,107377,107379,119644,119645,119697,119698,121507,121509,131072,131079,136458,136459,136473,136474,136919,136920,138351,138352,144978,144979,145581,145582,146822,146823,150873,150874,155023,155025,155868,155869,155876,155877,155883,155884,159741,159742,159749,159751,159920,159921,159922,159923,159926,159927,159942,159943,159946,159948,159949,159951,159969,159970,159981,159982,160021,160025,160029,160033,160034,160038,160039,160055,160470,160471,160842,160843,162328,162329,163505,163507,163840,163883,167394,167395,174541,174543,180338,180339,182327,182328,183855,183858,184071,184073,193593,193594,193597,193598,194200,194202,194614,194616,196608,196636,196829,196830,196832,196833,203952,203953,204047,204048,204227,204228,204238,204239,205349,205353,205409,205410,205435,205436,205572,205576,205584,205585,206973,206977,207012,207013,207153,207159,207160,207161,207165,207166,207282,207286,207287,207288,207568,207569,210056,210059,211945,211946,213580,213583,214511,214512,216353,216354,216853,216857,217536,217538,220109,220111,229376,229392,230474,230475,230704,230705,231493,231500,231525,231532,251893,251896,262144,262145,268264,268265,271612,271615,274949,274950,282228,286703,286773,286774") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2036,32231,32745,32767,32768") == "19ec605ae4ff661e00a6e96a3f03336ed6de3150" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2036,32231,32745,32767,32768") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "376,1,29,36,40,44,45,51,57,58,59,73,79,80,81,139,143,148,149,155,161,162,163,357,361,365,366,369,373,378,379,382,383,389,395,396,397,419,425,426,427,1162,1166,1184,1185,1189,1195,1196,1197,1199,1200,1211,1217,1218,1219,1229,1230,1235,1239,1243,1244,1248,1254,1258,1259,1266,1272,1273,1274,1286,1292,1293,1294,1296,1303,1309,1316,1321,1328,1358,1365,1384,1391,1409,1414,1431,1438,1454,1455,1546,1548,1558,1559,1571,1572,1573,1574,1575,1576,1583,1584,1607,1608,1652,1657,1660,1663,1666,1669,1672,1674,1678,1679,1683,1686,1691,1692,1695,1697,2170,2172,2176,2180,2185,2187,2192,2196,2197,2201,2202,2206,2207,2211,2212,2216,2217,2221,2222,2226,2227,2229,2236,2240,2241,2245,2246,2250,2251,2255,2256,2260,2261,2265,2266,2270,2271,2273,2274,2278,2279,2283,2284,2288,2289,2293,2294,2298,2299,2303,2304,2308,2309,2311,2315,2319,2320,2322,2323,2325,2326,2330,2331,2335,2336,2338,2339,2343,2344,2348,2349,2353,2354,2358,2359,2361,2362,2366,2367,2369,2373,2386,2391,2421,2424,2532,4977,4978,5112,5788,6035,6036,7637,7638,7696,7697,7835,7836,8145,8146,13327,13328,13400,13401,13409,13410,13545,13546,13550,13551,13604,13605,13615,13616,13649,13650,13669,13670,13722,13723,13868,13869,13944,13945,14091,14092,18842,18844,18983,18984,19009,19010,19106,19107,19158,19159,19170,19171,19221,19222,19297,19298,19361,19362,19624,19625,20129,20130,24004,24005,24061,24062,24486,24487,30460,31496,32314,32315,32768,32801,33258,33259,38285,38286,38476,38477,38795,38796,40856,40857,46515,46519,48201,48203,48385,48387,48435,48437,50021,50023,50693,50695,51046,51047,51201,51202,51372,51373,52050,52138,52139,52155,53113,53114,53503,53504,54706,54707,55403,55428,55657,55662,58880,58881,59251,59253,65536,65563,65793,65794,83523,83524,84372,84373,85101,85102,85914,85915,85972,85973,86001,86002,87284,87285,87368,87370,88195,94662,95755,95756,97852,97854,97900,97904,97933,97935,98304,98324,98326,98361,98789,98793,98816,98817,98824,98830,98831,98832,99110,99116,99125,99132,99156,99161,99471,101052,101086,101087") == "2782d50b7d5da66e296f90f2297688dd3a7e0bfb" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "376,1,29,36,40,44,45,51,57,58,59,73,79,80,81,139,143,148,149,155,161,162,163,357,361,365,366,369,373,378,379,382,383,389,395,396,397,419,425,426,427,1162,1166,1184,1185,1189,1195,1196,1197,1199,1200,1211,1217,1218,1219,1229,1230,1235,1239,1243,1244,1248,1254,1258,1259,1266,1272,1273,1274,1286,1292,1293,1294,1296,1303,1309,1316,1321,1328,1358,1365,1384,1391,1409,1414,1431,1438,1454,1455,1546,1548,1558,1559,1571,1572,1573,1574,1575,1576,1583,1584,1607,1608,1652,1657,1660,1663,1666,1669,1672,1674,1678,1679,1683,1686,1691,1692,1695,1697,2170,2172,2176,2180,2185,2187,2192,2196,2197,2201,2202,2206,2207,2211,2212,2216,2217,2221,2222,2226,2227,2229,2236,2240,2241,2245,2246,2250,2251,2255,2256,2260,2261,2265,2266,2270,2271,2273,2274,2278,2279,2283,2284,2288,2289,2293,2294,2298,2299,2303,2304,2308,2309,2311,2315,2319,2320,2322,2323,2325,2326,2330,2331,2335,2336,2338,2339,2343,2344,2348,2349,2353,2354,2358,2359,2361,2362,2366,2367,2369,2373,2386,2391,2421,2424,2532,4977,4978,5112,5788,6035,6036,7637,7638,7696,7697,7835,7836,8145,8146,13327,13328,13400,13401,13409,13410,13545,13546,13550,13551,13604,13605,13615,13616,13649,13650,13669,13670,13722,13723,13868,13869,13944,13945,14091,14092,18842,18844,18983,18984,19009,19010,19106,19107,19158,19159,19170,19171,19221,19222,19297,19298,19361,19362,19624,19625,20129,20130,24004,24005,24061,24062,24486,24487,30460,31496,32314,32315,32768,32801,33258,33259,38285,38286,38476,38477,38795,38796,40856,40857,46515,46519,48201,48203,48385,48387,48435,48437,50021,50023,50693,50695,51046,51047,51201,51202,51372,51373,52050,52138,52139,52155,53113,53114,53503,53504,54706,54707,55403,55428,55657,55662,58880,58881,59251,59253,65536,65563,65793,65794,83523,83524,84372,84373,85101,85102,85914,85915,85972,85973,86001,86002,87284,87285,87368,87370,88195,94662,95755,95756,97852,97854,97900,97904,97933,97935,98304,98324,98326,98361,98789,98793,98816,98817,98824,98830,98831,98832,99110,99116,99125,99132,99156,99161,99471,101052,101086,101087") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

# ---- start making changes here ----


# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/xbl_config_5.elf", "/dev/block/bootdevice/by-name/xbl_config_5");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/xbl_5.elf", "/dev/block/bootdevice/by-name/xbl_5");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl_config_4.elf", "/dev/block/bootdevice/by-name/xbl_config_4");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/xbl_4.elf", "/dev/block/bootdevice/by-name/xbl_4");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");

# --- Start patching dynamic partitions ---


# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:4ad65362b0de936b1d42caae067c276d39ef904b"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7a01b811ce1705bc1ab70ba47464e89cdeda1fff"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:7a01b811ce1705bc1ab70ba47464e89cdeda1fff")));

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");

# ---- update tasks: exaid part 2----


package_extract_file("exaid.img", "/dev/block/bootdevice/by-name/exaid");
    
set_progress(1.000000);
