getprop("ro.product.device") == "gauguin" || abort("E3004: This package is for \"gauguin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.11.0.SJSCNXM:user/release-keys");
ui_print("Target: Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.15.0.SJSCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.11.0.SJSCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.15.0.SJSCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.11.0.SJSCNXM:user/release-keys or Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.15.0.SJSCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9039ecdd87a94112e1702693b3ddc13615bc9f57"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c74c55e66ff703f05ed1c398d4bff0cd9944ac5e")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9039ecdd87a94112e1702693b3ddc13615bc9f57"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c74c55e66ff703f05ed1c398d4bff0cd9944ac5e"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "458,1,27,39,53,1060,1061,8331,8332,10321,10322,23569,23570,26860,26861,29031,29032,29085,29086,29510,29511,29754,29755,32768,32781,39456,39971,40247,40251,40259,40260,40952,40956,40979,40980,41042,41046,41050,41051,41061,41067,41068,44714,44724,44725,44728,44761,44768,44774,44775,44776,44783,44789,44790,44791,44804,44810,44811,44812,45277,45279,45319,45320,45333,45335,45394,45396,45397,45398,45399,45400,45477,45482,45516,45517,45562,45563,45565,45567,45592,45594,45598,45600,45776,45777,45783,45784,45873,45874,46419,46420,49448,49449,49462,49468,49469,49470,49787,49791,49801,49802,49806,49807,49846,49852,49853,51051,54529,54533,54574,54575,54586,54592,54593,54594,54602,54608,54609,54610,54741,54745,54751,54752,54877,54881,54888,54889,55251,55252,55257,55263,55264,55265,55298,55304,55305,55306,59339,59343,59375,59376,61143,61147,61162,61163,65536,65547,67284,67286,69015,69016,74261,74262,74628,74630,74631,74632,74643,74649,74650,74651,75340,75344,75503,75504,75515,75516,75517,75519,75528,75529,75556,75557,75567,75568,75631,75635,75664,75665,75729,75730,75754,75755,75816,75817,75936,75937,75938,75940,75941,75942,75944,75945,75947,75948,75952,75953,75969,75970,76003,76005,76017,76019,76039,76040,76169,76172,76215,76216,76219,76221,76305,76307,76328,76331,76345,76349,76350,76353,76415,76416,77317,77321,77343,77344,79963,79964,80381,80382,81525,81529,81576,81577,88838,88839,89645,89649,89706,89707,93761,93762,94663,94667,94677,94678,94736,94737,95919,95923,95939,95940,98304,98317,98391,98392,98528,98532,98554,98555,100759,100760,101457,101461,101506,101507,101915,101919,101928,101929,104055,104056,104775,104779,104816,104817,110393,110394,112500,112504,112532,112533,112648,112649,114558,114562,114589,114590,116263,116264,117064,117068,117092,117093,119249,119253,119291,119292,121640,121641,122404,122408,122420,122421,122465,122466,131072,131083,135059,135060,135601,135602,135948,135951,135952,135955,135957,135961,135963,135972,135974,135976,135977,135988,135991,135992,135993,135994,135998,135999,136000,136001,136002,136003,136008,136013,136014,136019,136021,136023,136027,136029,136030,136032,136033,136039,136041,136064,136065,136066,136069,136097,138248,138249,138250,138251,138961,138965,138992,138993,139153,139154,141262,141263,141809,141813,141825,141826,141888,141889,145291,145295,145304,145305,145569,145570,145856,145860,145869,145870,151800,151801,152916,152920,152941,152942,153049,153050,157756,157758,160475,160479,160495,160496,160573,160574,163840,163853,164043,164044,175331,175335,175345,175346,175378,175379,178017,178021,178049,178050,178093,178095,178124,178130,178131,178132,184061,184062,185492,185498,185558,185559,188765,188766,191239,191243,191257,191258,191327,191328,192037,729743,729748,729762,729767,729768,729773,729774,729779,729903,729907,729943,729950,729952,729958,729959,729964,729965,729970,730416,730421,1179656,1179659,1212417,1212427,1227366,1231082,1250588,1250840,1250841") == "e6c10f501d54a2fcd16ea341d7389d0d7cbdf252" || 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"), "458,1,27,39,53,1060,1061,8331,8332,10321,10322,23569,23570,26860,26861,29031,29032,29085,29086,29510,29511,29754,29755,32768,32781,39456,39971,40247,40251,40259,40260,40952,40956,40979,40980,41042,41046,41050,41051,41061,41067,41068,44714,44724,44725,44728,44761,44768,44774,44775,44776,44783,44789,44790,44791,44804,44810,44811,44812,45277,45279,45319,45320,45333,45335,45394,45396,45397,45398,45399,45400,45477,45482,45516,45517,45562,45563,45565,45567,45592,45594,45598,45600,45776,45777,45783,45784,45873,45874,46419,46420,49448,49449,49462,49468,49469,49470,49787,49791,49801,49802,49806,49807,49846,49852,49853,51051,54529,54533,54574,54575,54586,54592,54593,54594,54602,54608,54609,54610,54741,54745,54751,54752,54877,54881,54888,54889,55251,55252,55257,55263,55264,55265,55298,55304,55305,55306,59339,59343,59375,59376,61143,61147,61162,61163,65536,65547,67284,67286,69015,69016,74261,74262,74628,74630,74631,74632,74643,74649,74650,74651,75340,75344,75503,75504,75515,75516,75517,75519,75528,75529,75556,75557,75567,75568,75631,75635,75664,75665,75729,75730,75754,75755,75816,75817,75936,75937,75938,75940,75941,75942,75944,75945,75947,75948,75952,75953,75969,75970,76003,76005,76017,76019,76039,76040,76169,76172,76215,76216,76219,76221,76305,76307,76328,76331,76345,76349,76350,76353,76415,76416,77317,77321,77343,77344,79963,79964,80381,80382,81525,81529,81576,81577,88838,88839,89645,89649,89706,89707,93761,93762,94663,94667,94677,94678,94736,94737,95919,95923,95939,95940,98304,98317,98391,98392,98528,98532,98554,98555,100759,100760,101457,101461,101506,101507,101915,101919,101928,101929,104055,104056,104775,104779,104816,104817,110393,110394,112500,112504,112532,112533,112648,112649,114558,114562,114589,114590,116263,116264,117064,117068,117092,117093,119249,119253,119291,119292,121640,121641,122404,122408,122420,122421,122465,122466,131072,131083,135059,135060,135601,135602,135948,135951,135952,135955,135957,135961,135963,135972,135974,135976,135977,135988,135991,135992,135993,135994,135998,135999,136000,136001,136002,136003,136008,136013,136014,136019,136021,136023,136027,136029,136030,136032,136033,136039,136041,136064,136065,136066,136069,136097,138248,138249,138250,138251,138961,138965,138992,138993,139153,139154,141262,141263,141809,141813,141825,141826,141888,141889,145291,145295,145304,145305,145569,145570,145856,145860,145869,145870,151800,151801,152916,152920,152941,152942,153049,153050,157756,157758,160475,160479,160495,160496,160573,160574,163840,163853,164043,164044,175331,175335,175345,175346,175378,175379,178017,178021,178049,178050,178093,178095,178124,178130,178131,178132,184061,184062,185492,185498,185558,185559,188765,188766,191239,191243,191257,191258,191327,191328,192037,729743,729748,729762,729767,729768,729773,729774,729779,729903,729907,729943,729950,729952,729958,729959,729964,729965,729970,730416,730421,1179656,1179659,1212417,1212427,1227366,1231082,1250588,1250840,1250841") && 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"), "696,1,118,129,131,138,139,219,225,233,234,1908,1910,2389,2390,2398,2400,2406,2407,2605,2607,2616,2617,2623,2625,2630,2631,2876,2878,2885,2886,2892,2894,2899,2900,2923,2924,2960,2962,3014,3015,3152,3153,3161,3163,3168,3169,3174,3176,3181,3182,3185,3186,5613,5614,8239,8240,17339,17340,18444,18446,18447,18448,18450,18453,18454,18455,18457,18459,18460,18461,18463,18465,18466,18467,18469,18471,18472,18473,18475,18477,18478,18479,18481,18483,18488,18490,18493,18495,18498,18500,18508,18510,18513,18515,18516,18517,18519,18521,18522,18523,18526,18528,18529,18530,18532,18534,18535,18536,18538,18540,18541,18542,18544,18546,18547,18548,18550,18552,18553,18554,18563,18564,18583,18584,18585,18586,18590,18591,18592,18593,18596,18597,18598,18599,18602,18603,18604,18605,18608,18609,18610,18611,18615,18616,18617,18618,18621,18622,18623,18624,18628,18629,18633,18634,18638,18639,18643,18644,18648,18649,18650,18651,18660,18661,18662,18663,18666,18667,18668,18669,18672,18673,18674,18675,18678,18679,18680,18681,18683,18685,18977,18978,19093,19094,20116,20122,20176,20177,31196,31197,31813,31814,32768,32770,32855,32892,33665,33666,36347,36349,47336,47337,60981,60982,60986,60988,61005,61006,61041,61042,61250,61251,62702,62703,65536,65570,66765,66766,66769,66770,66788,66789,66840,66841,66853,66854,66916,66917,66919,66921,66985,66986,67056,67057,67124,67125,67127,67128,67130,67131,67190,67192,67194,67195,67259,67260,67330,67331,67398,67399,67401,67402,67404,67411,67413,67414,67416,67418,67420,67430,67490,67491,67493,67494,67504,67505,67571,67572,67649,67650,67727,67728,67804,67805,67884,67885,67961,67962,68038,68039,68115,68116,68130,68131,68194,68195,68270,68271,68348,68349,68425,68426,68498,68499,68501,68502,68514,68520,68580,68581,68583,68584,68650,68651,68653,68654,68718,68719,68721,68722,68785,68786,68788,68789,68852,68853,68855,68856,68919,68920,68922,68923,68986,68987,68989,68990,69054,69055,69057,69058,69123,69124,69193,69194,69270,69271,69346,69347,69424,69425,69427,69428,69491,69492,69494,69495,69559,69560,69562,69563,69626,69627,69629,69630,69693,69694,69696,69697,69759,69760,69762,69763,69824,69825,69827,69828,69904,69905,69978,69979,69981,69982,70046,70047,70049,70050,70117,70118,70120,70121,70186,70187,70189,70190,70257,70258,70260,70261,70327,70328,70330,70331,70334,70335,70400,70401,70402,70403,70473,70474,70475,70476,70549,70550,70552,70553,70621,70622,70624,70625,70633,70634,70693,70694,70696,70697,70762,70763,70765,70766,70835,70836,70838,70839,70904,70905,70907,70908,70976,70977,70979,70980,71045,71046,71048,71049,71115,71116,71118,71119,71179,71180,71182,71183,71245,71246,71314,71315,71380,71381,71383,71384,71444,71445,71447,71448,71510,71511,71576,71577,71579,71580,71639,71640,71642,71643,71711,71712,71714,71715,71783,71784,71856,71857,71933,71934,71947,71948,72012,72013,72087,72088,72090,72091,72154,72155,72157,72158,72221,72222,72224,72225,72288,72289,72291,72292,72355,72356,72358,72359,72420,72421,72423,72424,72485,72486,72488,72489,72565,72566,72638,72639,72641,72642,72706,72707,72709,72710,72776,72777,72779,72780,72845,72846,72848,72849,72916,72917,72919,72920,72988,72989,72991,72992,73060,73061,73062,73063,73135,73136,73137,73138,73210,73211,73213,73214,73282,73283,73285,73286,73288,73289,73355,73356,73358,73359,73427,73428,73496,73497,73499,73500,73565,73566,73568,73569,73636,73637,73639,73640,73705,73706,73708,73709,73774,73775,73777,73778,73838,73839,73841,73842,73904,73905,73972,73973,74038,74039,74041,74042,74102,74103,74105,74106,74168,74169,74234,74235,74237,74238,74297,74298,74300,74301,74368,74369,74371,74372,74541,74542,74554,74555,78986,78987,79119,79120,79211,79212,79562,79563,79624,79625,79774,79775,79854,79855,79887,79888,79964,79965,80033,80034,80130,80131,80223,80224,80296,80297,80342,80343,80463,80464,80490,80491,80493,80494,80526,80527,80576,80577,80648,80649,80701,80702,81026,81027,81029,81030,81124,81125,81249,81250,81343,81344,81383,81384,81411,81412,81475,81476,81547,81548,81613,81615,81616,81618,81719,81721,81727,81731,82940,98306,98391,163842,163927,229378,229463,294914,294999,327694,327703,347307,348415,353937,354021,354022") == "1b1de5f1215567374be1c4b42ed7b215e2d04840" || 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"), "696,1,118,129,131,138,139,219,225,233,234,1908,1910,2389,2390,2398,2400,2406,2407,2605,2607,2616,2617,2623,2625,2630,2631,2876,2878,2885,2886,2892,2894,2899,2900,2923,2924,2960,2962,3014,3015,3152,3153,3161,3163,3168,3169,3174,3176,3181,3182,3185,3186,5613,5614,8239,8240,17339,17340,18444,18446,18447,18448,18450,18453,18454,18455,18457,18459,18460,18461,18463,18465,18466,18467,18469,18471,18472,18473,18475,18477,18478,18479,18481,18483,18488,18490,18493,18495,18498,18500,18508,18510,18513,18515,18516,18517,18519,18521,18522,18523,18526,18528,18529,18530,18532,18534,18535,18536,18538,18540,18541,18542,18544,18546,18547,18548,18550,18552,18553,18554,18563,18564,18583,18584,18585,18586,18590,18591,18592,18593,18596,18597,18598,18599,18602,18603,18604,18605,18608,18609,18610,18611,18615,18616,18617,18618,18621,18622,18623,18624,18628,18629,18633,18634,18638,18639,18643,18644,18648,18649,18650,18651,18660,18661,18662,18663,18666,18667,18668,18669,18672,18673,18674,18675,18678,18679,18680,18681,18683,18685,18977,18978,19093,19094,20116,20122,20176,20177,31196,31197,31813,31814,32768,32770,32855,32892,33665,33666,36347,36349,47336,47337,60981,60982,60986,60988,61005,61006,61041,61042,61250,61251,62702,62703,65536,65570,66765,66766,66769,66770,66788,66789,66840,66841,66853,66854,66916,66917,66919,66921,66985,66986,67056,67057,67124,67125,67127,67128,67130,67131,67190,67192,67194,67195,67259,67260,67330,67331,67398,67399,67401,67402,67404,67411,67413,67414,67416,67418,67420,67430,67490,67491,67493,67494,67504,67505,67571,67572,67649,67650,67727,67728,67804,67805,67884,67885,67961,67962,68038,68039,68115,68116,68130,68131,68194,68195,68270,68271,68348,68349,68425,68426,68498,68499,68501,68502,68514,68520,68580,68581,68583,68584,68650,68651,68653,68654,68718,68719,68721,68722,68785,68786,68788,68789,68852,68853,68855,68856,68919,68920,68922,68923,68986,68987,68989,68990,69054,69055,69057,69058,69123,69124,69193,69194,69270,69271,69346,69347,69424,69425,69427,69428,69491,69492,69494,69495,69559,69560,69562,69563,69626,69627,69629,69630,69693,69694,69696,69697,69759,69760,69762,69763,69824,69825,69827,69828,69904,69905,69978,69979,69981,69982,70046,70047,70049,70050,70117,70118,70120,70121,70186,70187,70189,70190,70257,70258,70260,70261,70327,70328,70330,70331,70334,70335,70400,70401,70402,70403,70473,70474,70475,70476,70549,70550,70552,70553,70621,70622,70624,70625,70633,70634,70693,70694,70696,70697,70762,70763,70765,70766,70835,70836,70838,70839,70904,70905,70907,70908,70976,70977,70979,70980,71045,71046,71048,71049,71115,71116,71118,71119,71179,71180,71182,71183,71245,71246,71314,71315,71380,71381,71383,71384,71444,71445,71447,71448,71510,71511,71576,71577,71579,71580,71639,71640,71642,71643,71711,71712,71714,71715,71783,71784,71856,71857,71933,71934,71947,71948,72012,72013,72087,72088,72090,72091,72154,72155,72157,72158,72221,72222,72224,72225,72288,72289,72291,72292,72355,72356,72358,72359,72420,72421,72423,72424,72485,72486,72488,72489,72565,72566,72638,72639,72641,72642,72706,72707,72709,72710,72776,72777,72779,72780,72845,72846,72848,72849,72916,72917,72919,72920,72988,72989,72991,72992,73060,73061,73062,73063,73135,73136,73137,73138,73210,73211,73213,73214,73282,73283,73285,73286,73288,73289,73355,73356,73358,73359,73427,73428,73496,73497,73499,73500,73565,73566,73568,73569,73636,73637,73639,73640,73705,73706,73708,73709,73774,73775,73777,73778,73838,73839,73841,73842,73904,73905,73972,73973,74038,74039,74041,74042,74102,74103,74105,74106,74168,74169,74234,74235,74237,74238,74297,74298,74300,74301,74368,74369,74371,74372,74541,74542,74554,74555,78986,78987,79119,79120,79211,79212,79562,79563,79624,79625,79774,79775,79854,79855,79887,79888,79964,79965,80033,80034,80130,80131,80223,80224,80296,80297,80342,80343,80463,80464,80490,80491,80493,80494,80526,80527,80576,80577,80648,80649,80701,80702,81026,81027,81029,81030,81124,81125,81249,81250,81343,81344,81383,81384,81411,81412,81475,81476,81547,81548,81613,81615,81616,81618,81719,81721,81727,81731,82940,98306,98391,163842,163927,229378,229463,294914,294999,327694,327703,347307,348415,353937,354021,354022") && 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"), "254,1,18,34,38,42,43,50,51,54,55,58,59,176,182,183,184,197,203,204,205,1002,1006,1022,1023,4879,4881,18546,18547,20767,20769,32768,32779,40933,40934,41508,41509,43564,43565,46032,46033,47110,47248,47769,47770,51714,51715,51718,51725,51733,51734,56320,56321,56423,56424,56426,56428,56439,56441,56451,56452,56541,56542,56554,56555,56569,56571,56580,56581,56583,56584,56891,56892,56893,56894,56895,56897,56906,56907,56909,56910,56986,56987,56989,56990,57055,57056,57109,57110,57152,57153,58570,58577,58585,58592,58632,58639,58665,58672,58697,58704,58724,58725,58739,58741,58805,58806,61482,61483,62490,62492,62495,62496,62504,62506,62512,62513,62515,62516,62629,62631,62707,62708,62721,62723,65536,65545,72186,72187,83913,83914,85126,85127,85295,85297,85298,85299,85306,85307,85312,85313,85337,85338,85342,85344,85346,85348,85369,85370,85376,85377,85438,85442,85446,85450,85451,85455,85456,85460,85461,85465,85466,85470,85471,85475,85476,85480,85481,85485,85486,85488,85489,85491,85492,85533,85592,85595,86010,86011,86382,86383,89225,89226,89245,89246,89286,89287,89299,89300,89336,89337,89353,89354,89370,89371,89405,89406,89544,89545,89558,89559,89563,89564,89571,89572,89584,89585,98304,98316,99071,99072,100538,100539,104386,104387,104754,104755,108269,108272,110121,110123,111928,111929,113836,113837,115483,115485,115623,115625,126338,126339,128318,128320,128451,128455,128481,128482,130373,130375,131072,131107,132094,132097,133822,133826,133847,133848,133976,133977,134494,134498,134920,137062,137103,137104") == "de56cc6d6118bd5ab17939fcb402a04b0d4b3147" || 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"), "254,1,18,34,38,42,43,50,51,54,55,58,59,176,182,183,184,197,203,204,205,1002,1006,1022,1023,4879,4881,18546,18547,20767,20769,32768,32779,40933,40934,41508,41509,43564,43565,46032,46033,47110,47248,47769,47770,51714,51715,51718,51725,51733,51734,56320,56321,56423,56424,56426,56428,56439,56441,56451,56452,56541,56542,56554,56555,56569,56571,56580,56581,56583,56584,56891,56892,56893,56894,56895,56897,56906,56907,56909,56910,56986,56987,56989,56990,57055,57056,57109,57110,57152,57153,58570,58577,58585,58592,58632,58639,58665,58672,58697,58704,58724,58725,58739,58741,58805,58806,61482,61483,62490,62492,62495,62496,62504,62506,62512,62513,62515,62516,62629,62631,62707,62708,62721,62723,65536,65545,72186,72187,83913,83914,85126,85127,85295,85297,85298,85299,85306,85307,85312,85313,85337,85338,85342,85344,85346,85348,85369,85370,85376,85377,85438,85442,85446,85450,85451,85455,85456,85460,85461,85465,85466,85470,85471,85475,85476,85480,85481,85485,85486,85488,85489,85491,85492,85533,85592,85595,86010,86011,86382,86383,89225,89226,89245,89246,89286,89287,89299,89300,89336,89337,89353,89354,89370,89371,89405,89406,89544,89545,89558,89559,89563,89564,89571,89572,89584,89585,98304,98316,99071,99072,100538,100539,104386,104387,104754,104755,108269,108272,110121,110123,111928,111929,113836,113837,115483,115485,115623,115625,126338,126339,128318,128320,128451,128455,128481,128482,130373,130375,131072,131107,132094,132097,133822,133826,133847,133848,133976,133977,134494,134498,134920,137062,137103,137104") && 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"), "14,1,11,12,13,20,21,29,31,286,288,291,300,316,317") == "b3e7bed8e74ca1d60c6628a5f17700462df33f06" || 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"), "14,1,11,12,13,20,21,29,31,286,288,291,300,316,317") && 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"), "298,1,31,27967,27969,27977,27981,27985,27986,28048,28054,28055,28056,28656,28658,28715,28719,28733,28734,28786,28792,28793,28794,28798,28804,28805,28806,28811,28812,29229,29233,29245,29246,29258,29264,29265,29266,29271,29277,29278,29279,29285,29289,29290,29291,29303,29309,29310,29311,29317,29318,29331,29337,29338,29345,29364,29365,29506,29507,29588,29589,29601,29602,29604,29605,29606,29607,29608,29610,29611,29612,29613,29614,29644,29656,29658,29659,29660,29661,29671,29672,29695,29696,29735,29736,29741,29743,29845,29846,29848,29850,30392,30396,30402,30404,30408,30412,30413,30417,30418,30422,30423,30427,30428,30432,30433,30437,30438,30442,30443,30447,30448,30452,30453,30457,30458,30462,30463,30467,30468,30470,30478,30482,30483,30487,30488,30492,30493,30495,30496,30500,30501,30505,30506,30510,30511,30515,30516,30520,30521,30525,30526,30530,30531,30533,30538,30540,30545,30549,30550,30554,30555,30559,30560,30562,30563,30567,30568,30572,30573,30577,30578,30582,30583,30587,30588,30592,30593,30595,30596,30600,30601,30605,30606,30608,30609,30612,30615,30669,30672,30774,32768,32798,33724,33725,33754,33755,34044,34051,34069,34072,34074,34075,34530,35280,35416,35417,35566,35567,36950,37221,38525,38526,38985,38986,39151,39152,39461,39462,44126,44127,49206,49213,49231,49234,49236,49237,49845,51027,51207,51208,51847,51848,54073,54421,60833,60834,61045,61046,61365,61366,65536,65564,67775,67776,73455,73526,74754,74756,76587,76589,85655,85656,85657,85658,86926,86928,86946,86947,87488,87490,88150,88152,88171,100508,103476,103477,104000,104001,112798,114891,114922,114923,114926,115018,115298,115299,116261,116265,116272,116273,116289,116290,116318,116324,116325,116326,116356,116364,116365,116366,117242,117246,117268,117269,117286,117292,117293,117294,117686,117692,117699,117706,117732,117738,118109,119984,120023,120024") == "f267ea97a228cf1a59adbfb271d11bcca04c768b" || 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"), "298,1,31,27967,27969,27977,27981,27985,27986,28048,28054,28055,28056,28656,28658,28715,28719,28733,28734,28786,28792,28793,28794,28798,28804,28805,28806,28811,28812,29229,29233,29245,29246,29258,29264,29265,29266,29271,29277,29278,29279,29285,29289,29290,29291,29303,29309,29310,29311,29317,29318,29331,29337,29338,29345,29364,29365,29506,29507,29588,29589,29601,29602,29604,29605,29606,29607,29608,29610,29611,29612,29613,29614,29644,29656,29658,29659,29660,29661,29671,29672,29695,29696,29735,29736,29741,29743,29845,29846,29848,29850,30392,30396,30402,30404,30408,30412,30413,30417,30418,30422,30423,30427,30428,30432,30433,30437,30438,30442,30443,30447,30448,30452,30453,30457,30458,30462,30463,30467,30468,30470,30478,30482,30483,30487,30488,30492,30493,30495,30496,30500,30501,30505,30506,30510,30511,30515,30516,30520,30521,30525,30526,30530,30531,30533,30538,30540,30545,30549,30550,30554,30555,30559,30560,30562,30563,30567,30568,30572,30573,30577,30578,30582,30583,30587,30588,30592,30593,30595,30596,30600,30601,30605,30606,30608,30609,30612,30615,30669,30672,30774,32768,32798,33724,33725,33754,33755,34044,34051,34069,34072,34074,34075,34530,35280,35416,35417,35566,35567,36950,37221,38525,38526,38985,38986,39151,39152,39461,39462,44126,44127,49206,49213,49231,49234,49236,49237,49845,51027,51207,51208,51847,51848,54073,54421,60833,60834,61045,61046,61365,61366,65536,65564,67775,67776,73455,73526,74754,74756,76587,76589,85655,85656,85657,85658,86926,86928,86946,86947,87488,87490,88150,88152,88171,100508,103476,103477,104000,104001,112798,114891,114922,114923,114926,115018,115298,115299,116261,116265,116272,116273,116289,116290,116318,116324,116325,116326,116356,116364,116365,116366,117242,117246,117268,117269,117286,117292,117293,117294,117686,117692,117699,117706,117732,117738,118109,119984,120023,120024") && 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/abl_ecc.elf", "/dev/block/bootdevice/by-name/abl");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
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/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/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/abl_ecc.elf", "/dev/block/bootdevice/by-name/ablbak");
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/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- 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.");

# 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.");

# Update dynamic partition metadata

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

# 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:9039ecdd87a94112e1702693b3ddc13615bc9f57"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c74c55e66ff703f05ed1c398d4bff0cd9944ac5e"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c74c55e66ff703f05ed1c398d4bff0cd9944ac5e")));

# ---- 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");
set_progress(1.000000);
