getprop("ro.product.device") == "gauguin" || abort("E3004: This package is for \"gauguin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/gauguinin/gauguin:12/RKQ1.200826.002/V13.0.4.0.SJSINXM:user/release-keys");
ui_print("Target: Redmi/gauguinin/gauguin:12/RKQ1.200826.002/V13.0.6.0.SJSINXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/gauguinin/gauguin:12/RKQ1.200826.002/V13.0.4.0.SJSINXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/gauguinin/gauguin:12/RKQ1.200826.002/V13.0.6.0.SJSINXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/gauguinin/gauguin:12/RKQ1.200826.002/V13.0.4.0.SJSINXM:user/release-keys or Redmi/gauguinin/gauguin:12/RKQ1.200826.002/V13.0.6.0.SJSINXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:44f8ce4a12b1df56dc2b3a111274d8d78c989797"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:1fdb3693e6ad53ed6bb47a8fecaec1242e2075f9")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:44f8ce4a12b1df56dc2b3a111274d8d78c989797"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:1fdb3693e6ad53ed6bb47a8fecaec1242e2075f9"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "266,1,33,45,59,115,116,660,661,9726,9727,11886,22264,32768,32787,39620,39621,39848,39849,40238,40240,40937,40941,40964,40965,41032,41036,41040,41041,41055,41061,41062,45069,45079,45080,45083,45116,45123,45129,45130,45131,45138,45144,45145,45146,45159,45165,45166,45167,45632,45634,45674,45675,45688,45690,45749,45751,45752,45753,45754,45755,45832,45837,45871,45872,45917,45918,45920,45922,45947,45949,45953,45955,46131,46132,46138,46139,46228,46229,46774,46775,49803,49804,49978,49979,50011,50017,50018,50019,50456,50460,50470,50471,50611,50617,50618,51887,53220,53358,56683,56687,56726,56727,56749,56755,56756,56757,58001,58005,58026,58027,58159,58163,58169,58170,58295,58299,58306,58307,58312,58318,58319,58320,58353,58359,58360,58361,62612,62616,62648,62649,64416,64420,64435,64436,64466,64467,65536,65553,68542,68546,68558,68559,68626,68627,69742,69744,69745,71598,72607,72611,72632,72633,79975,79979,80000,80001,80123,80124,80782,80786,80807,80808,82965,82966,82984,82985,83167,83168,83222,83223,83792,83796,83803,83804,83835,83836,86022,86026,86052,86053,90779,90780,91580,91584,91595,91596,91639,91640,97230,97234,97252,97253,97353,97354,98304,98323,98555,98559,98575,98576,99696,99697,111225,111226,113327,113328,115950,115954,115970,115971,116060,116061,116675,116681,116682,116683,120173,120174,121528,121532,121546,121547,121626,121627,122619,122623,122637,122638,123800,123801,125137,125141,125165,125166,131072,131089,131718,131719,132293,132297,132316,132317,132401,132402,140069,140070,140369,140370,144626,144627,149803,149807,149828,149829,149947,149948,151999,152003,152031,720906,720913,739028,741280,753028,753185,753186") == "6d430cd93d62734ad8f47a715142a6c6136e4843" || 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"), "266,1,33,45,59,115,116,660,661,9726,9727,11886,22264,32768,32787,39620,39621,39848,39849,40238,40240,40937,40941,40964,40965,41032,41036,41040,41041,41055,41061,41062,45069,45079,45080,45083,45116,45123,45129,45130,45131,45138,45144,45145,45146,45159,45165,45166,45167,45632,45634,45674,45675,45688,45690,45749,45751,45752,45753,45754,45755,45832,45837,45871,45872,45917,45918,45920,45922,45947,45949,45953,45955,46131,46132,46138,46139,46228,46229,46774,46775,49803,49804,49978,49979,50011,50017,50018,50019,50456,50460,50470,50471,50611,50617,50618,51887,53220,53358,56683,56687,56726,56727,56749,56755,56756,56757,58001,58005,58026,58027,58159,58163,58169,58170,58295,58299,58306,58307,58312,58318,58319,58320,58353,58359,58360,58361,62612,62616,62648,62649,64416,64420,64435,64436,64466,64467,65536,65553,68542,68546,68558,68559,68626,68627,69742,69744,69745,71598,72607,72611,72632,72633,79975,79979,80000,80001,80123,80124,80782,80786,80807,80808,82965,82966,82984,82985,83167,83168,83222,83223,83792,83796,83803,83804,83835,83836,86022,86026,86052,86053,90779,90780,91580,91584,91595,91596,91639,91640,97230,97234,97252,97253,97353,97354,98304,98323,98555,98559,98575,98576,99696,99697,111225,111226,113327,113328,115950,115954,115970,115971,116060,116061,116675,116681,116682,116683,120173,120174,121528,121532,121546,121547,121626,121627,122619,122623,122637,122638,123800,123801,125137,125141,125165,125166,131072,131089,131718,131719,132293,132297,132316,132317,132401,132402,140069,140070,140369,140370,144626,144627,149803,149807,149828,149829,149947,149948,151999,152003,152031,720906,720913,739028,741280,753028,753185,753186") && 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"), "628,1,116,127,129,136,137,217,223,231,232,1906,1908,2387,2388,2586,2588,2597,2598,2604,2606,2612,2613,2858,2860,2867,2868,2874,2876,2881,2882,2905,2906,2942,2944,2996,2997,3134,3135,3143,3145,3150,3151,3156,3158,3163,3164,3167,3168,3495,3502,5457,5508,5595,5596,8187,8188,17298,17299,18314,18316,18317,18318,18320,18323,18324,18325,18327,18329,18330,18331,18333,18335,18336,18337,18339,18341,18342,18343,18345,18347,18348,18349,18351,18353,18358,18360,18363,18365,18368,18370,18378,18380,18383,18385,18386,18387,18389,18391,18392,18393,18396,18398,18399,18400,18402,18404,18405,18406,18408,18410,18411,18412,18414,18416,18417,18418,18420,18422,18423,18424,18433,18434,18453,18454,18455,18456,18460,18461,18462,18463,18466,18467,18468,18469,18472,18473,18474,18475,18478,18479,18480,18481,18485,18486,18487,18488,18491,18492,18493,18494,18498,18499,18503,18504,18508,18509,18513,18514,18518,18519,18520,18521,18530,18531,18532,18533,18536,18537,18538,18539,18542,18543,18544,18545,18548,18549,18550,18551,18553,18555,18847,18848,18963,18964,19983,19989,20042,20043,31062,31063,31679,31680,32768,32770,32854,32890,33529,33530,36211,36213,47200,47201,60845,60846,60850,60852,60869,60870,61113,61114,62541,62542,65536,65570,66604,66605,66608,66609,66627,66628,66671,66672,66684,66685,66747,66748,66750,66752,66816,66817,66887,66888,66955,66956,66958,66959,66961,66962,67021,67023,67025,67026,67090,67091,67161,67162,67229,67230,67232,67233,67235,67241,67243,67244,67246,67248,67250,67261,67321,67322,67324,67325,67335,67336,67402,67403,67480,67481,67558,67559,67635,67636,67715,67716,67792,67793,67869,67870,67946,67947,67961,67962,68025,68026,68101,68102,68179,68180,68256,68257,68329,68330,68332,68333,68345,68351,68411,68412,68414,68415,68481,68482,68484,68485,68549,68550,68552,68553,68616,68617,68619,68620,68683,68684,68686,68687,68750,68751,68753,68754,68817,68818,68820,68821,68885,68886,68888,68889,68954,68955,69024,69025,69101,69102,69177,69178,69255,69256,69258,69259,69322,69323,69325,69326,69390,69391,69393,69394,69457,69458,69460,69461,69524,69525,69527,69528,69590,69591,69593,69594,69655,69656,69658,69659,69735,69736,69809,69810,69812,69813,69877,69878,69880,69881,69948,69949,69951,69952,70017,70018,70020,70021,70088,70089,70091,70092,70158,70159,70161,70162,70165,70166,70231,70232,70233,70234,70304,70305,70306,70307,70380,70381,70383,70384,70452,70453,70455,70456,70464,70465,70524,70525,70527,70528,70593,70594,70596,70597,70666,70667,70669,70670,70735,70736,70738,70739,70807,70808,70810,70811,70876,70877,70879,70880,70946,70947,70949,70950,71010,71011,71013,71014,71076,71077,71145,71146,71211,71212,71214,71215,71275,71276,71278,71279,71341,71342,71407,71408,71410,71411,71470,71471,71473,71474,71542,71543,71545,71546,71614,71615,71687,71688,71764,71765,71778,71779,71843,71844,71918,71919,71921,71922,71985,71986,71988,71989,72052,72053,72055,72056,72119,72120,72122,72123,72186,72187,72189,72190,72251,72252,72254,72255,72316,72317,72319,72320,72396,72397,72469,72470,72472,72473,72537,72538,72540,72541,72607,72608,72610,72611,72676,72677,72679,72680,72747,72748,72750,72751,72819,72820,72822,72823,72891,72892,72893,72894,72966,72967,72968,72969,73041,73042,73044,73045,73113,73114,73116,73117,73119,73120,73186,73187,73189,73190,73258,73259,73327,73328,73330,73331,73396,73397,73399,73400,73467,73468,73470,73471,73536,73537,73539,73540,73605,73606,73608,73609,73669,73670,73672,73673,73735,73736,73803,73804,73869,73870,73872,73873,73933,73934,73936,73937,73999,74000,74065,74066,74068,74069,74128,74129,74131,74132,74199,74200,74202,74203,74373,74374,74634,74640,74641,74843,78154,98306,98390,163842,163926,229378,229462,294914,294998,327699,327702,344093,345189,350662,350744,350745") == "b9143ffa995093c4fba3db04217c9f8ca710d20a" || 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"), "628,1,116,127,129,136,137,217,223,231,232,1906,1908,2387,2388,2586,2588,2597,2598,2604,2606,2612,2613,2858,2860,2867,2868,2874,2876,2881,2882,2905,2906,2942,2944,2996,2997,3134,3135,3143,3145,3150,3151,3156,3158,3163,3164,3167,3168,3495,3502,5457,5508,5595,5596,8187,8188,17298,17299,18314,18316,18317,18318,18320,18323,18324,18325,18327,18329,18330,18331,18333,18335,18336,18337,18339,18341,18342,18343,18345,18347,18348,18349,18351,18353,18358,18360,18363,18365,18368,18370,18378,18380,18383,18385,18386,18387,18389,18391,18392,18393,18396,18398,18399,18400,18402,18404,18405,18406,18408,18410,18411,18412,18414,18416,18417,18418,18420,18422,18423,18424,18433,18434,18453,18454,18455,18456,18460,18461,18462,18463,18466,18467,18468,18469,18472,18473,18474,18475,18478,18479,18480,18481,18485,18486,18487,18488,18491,18492,18493,18494,18498,18499,18503,18504,18508,18509,18513,18514,18518,18519,18520,18521,18530,18531,18532,18533,18536,18537,18538,18539,18542,18543,18544,18545,18548,18549,18550,18551,18553,18555,18847,18848,18963,18964,19983,19989,20042,20043,31062,31063,31679,31680,32768,32770,32854,32890,33529,33530,36211,36213,47200,47201,60845,60846,60850,60852,60869,60870,61113,61114,62541,62542,65536,65570,66604,66605,66608,66609,66627,66628,66671,66672,66684,66685,66747,66748,66750,66752,66816,66817,66887,66888,66955,66956,66958,66959,66961,66962,67021,67023,67025,67026,67090,67091,67161,67162,67229,67230,67232,67233,67235,67241,67243,67244,67246,67248,67250,67261,67321,67322,67324,67325,67335,67336,67402,67403,67480,67481,67558,67559,67635,67636,67715,67716,67792,67793,67869,67870,67946,67947,67961,67962,68025,68026,68101,68102,68179,68180,68256,68257,68329,68330,68332,68333,68345,68351,68411,68412,68414,68415,68481,68482,68484,68485,68549,68550,68552,68553,68616,68617,68619,68620,68683,68684,68686,68687,68750,68751,68753,68754,68817,68818,68820,68821,68885,68886,68888,68889,68954,68955,69024,69025,69101,69102,69177,69178,69255,69256,69258,69259,69322,69323,69325,69326,69390,69391,69393,69394,69457,69458,69460,69461,69524,69525,69527,69528,69590,69591,69593,69594,69655,69656,69658,69659,69735,69736,69809,69810,69812,69813,69877,69878,69880,69881,69948,69949,69951,69952,70017,70018,70020,70021,70088,70089,70091,70092,70158,70159,70161,70162,70165,70166,70231,70232,70233,70234,70304,70305,70306,70307,70380,70381,70383,70384,70452,70453,70455,70456,70464,70465,70524,70525,70527,70528,70593,70594,70596,70597,70666,70667,70669,70670,70735,70736,70738,70739,70807,70808,70810,70811,70876,70877,70879,70880,70946,70947,70949,70950,71010,71011,71013,71014,71076,71077,71145,71146,71211,71212,71214,71215,71275,71276,71278,71279,71341,71342,71407,71408,71410,71411,71470,71471,71473,71474,71542,71543,71545,71546,71614,71615,71687,71688,71764,71765,71778,71779,71843,71844,71918,71919,71921,71922,71985,71986,71988,71989,72052,72053,72055,72056,72119,72120,72122,72123,72186,72187,72189,72190,72251,72252,72254,72255,72316,72317,72319,72320,72396,72397,72469,72470,72472,72473,72537,72538,72540,72541,72607,72608,72610,72611,72676,72677,72679,72680,72747,72748,72750,72751,72819,72820,72822,72823,72891,72892,72893,72894,72966,72967,72968,72969,73041,73042,73044,73045,73113,73114,73116,73117,73119,73120,73186,73187,73189,73190,73258,73259,73327,73328,73330,73331,73396,73397,73399,73400,73467,73468,73470,73471,73536,73537,73539,73540,73605,73606,73608,73609,73669,73670,73672,73673,73735,73736,73803,73804,73869,73870,73872,73873,73933,73934,73936,73937,73999,74000,74065,74066,74068,74069,74128,74129,74131,74132,74199,74200,74202,74203,74373,74374,74634,74640,74641,74843,78154,98306,98390,163842,163926,229378,229462,294914,294998,327699,327702,344093,345189,350662,350744,350745") && 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"), "460,1,16,7691,7692,7898,7900,8142,8144,8879,8883,8906,8907,9022,9026,9029,9030,9046,9050,9054,9055,9900,9901,13231,13235,13267,13268,15797,15799,17082,17083,17086,17087,17736,17737,26482,26483,32768,32777,33910,33911,34519,34524,36762,36763,37368,37372,38258,38259,39634,39635,39872,39873,41486,41487,41855,41859,42371,42372,42385,42391,42392,42393,44233,44237,44248,44249,45591,45592,55512,55513,59550,59551,63555,63556,65536,65543,73404,73405,82949,82956,84432,84433,94838,94839,98304,98313,99997,99998,107786,107787,107839,107840,107861,107862,107871,107873,108792,108793,108800,108801,108804,108805,108935,108941,108942,108943,108956,108962,108963,108964,109780,109784,109799,109800,118630,118631,125063,125067,126469,126470,130326,130328,131072,131079,144000,144001,146221,146223,163840,163849,166385,166386,166960,166961,169015,169016,173066,173067,176439,176440,177054,177055,177671,177672,181813,181814,182303,182304,186003,186004,186119,186121,186129,186131,186172,186174,186183,186184,186955,186956,186963,186964,186970,186971,186974,186981,186989,186990,191576,191577,191679,191680,191682,191684,191695,191697,191707,191708,191797,191798,191810,191811,191825,191827,191836,191837,191839,191840,192147,192148,192149,192151,192162,192163,192239,192240,192242,192243,192307,192308,192391,192392,193822,193829,193837,193844,193884,193891,193917,193924,193949,193956,193976,193977,193991,193993,195206,195207,195386,195388,195389,195390,195400,195401,195406,195407,195432,195433,195437,195439,195441,195443,195464,195465,195476,195477,195539,195543,195547,195551,195552,195556,195557,195561,195562,195566,195567,195571,195572,195576,195577,195581,195582,195586,195587,195589,195590,195592,195593,195634,195693,195696,196111,196112,196483,196484,196608,196615,197976,197977,198066,198067,198105,198106,198113,198114,198121,198122,198129,198130,198137,198138,198148,198149,199382,199383,199402,199403,199443,199444,199456,199457,199493,199494,199510,199511,199527,199528,199562,199563,199701,199702,199715,199716,199720,199721,199728,199729,199741,199742,208067,208069,210080,210081,210156,210158,210172,210173,212337,212338,213804,213805,217652,217653,221535,221538,223387,223389,225194,225195,227102,227103,228749,228751,228889,228891,229376,229402,237783,237785,239629,239630,241609,241613,241698,241699,241939,241943,242179,242180,250822,250823,254390,254391,254643,254644,254677,254678,254685,254687,254694,254695,254702,254703,256158,256159,256205,256211,256212,256213,256390,256394,256402,256403,258284,258285,258720,258722,258729,258730,258908,258912,258917,258918,259036,259038,259795,259796,262144,262160,264675,264676,270552,270553,270699,270700,271073,271076,271670,271671,272296,272297,272839,272843,272856,272857,274430,274434,274458,274459,294912,294918,297450,297451,299353,299362,327680,327681,333906,333907,333980,333981,334033,334034,334072,334073,334516,334517,334692,334693,334891,334900,335395,335396,335438,335446,335475,335476,335477,335478,335833,335834,336873,336874,337178,337180,337314,337315,338714,338715,341591,341592,342543,342546,347247,347248,355301,360933,361017,361018") == "4fdfdc3ae63bf7123109a0c6c7e44ba0e9947525" || 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"), "460,1,16,7691,7692,7898,7900,8142,8144,8879,8883,8906,8907,9022,9026,9029,9030,9046,9050,9054,9055,9900,9901,13231,13235,13267,13268,15797,15799,17082,17083,17086,17087,17736,17737,26482,26483,32768,32777,33910,33911,34519,34524,36762,36763,37368,37372,38258,38259,39634,39635,39872,39873,41486,41487,41855,41859,42371,42372,42385,42391,42392,42393,44233,44237,44248,44249,45591,45592,55512,55513,59550,59551,63555,63556,65536,65543,73404,73405,82949,82956,84432,84433,94838,94839,98304,98313,99997,99998,107786,107787,107839,107840,107861,107862,107871,107873,108792,108793,108800,108801,108804,108805,108935,108941,108942,108943,108956,108962,108963,108964,109780,109784,109799,109800,118630,118631,125063,125067,126469,126470,130326,130328,131072,131079,144000,144001,146221,146223,163840,163849,166385,166386,166960,166961,169015,169016,173066,173067,176439,176440,177054,177055,177671,177672,181813,181814,182303,182304,186003,186004,186119,186121,186129,186131,186172,186174,186183,186184,186955,186956,186963,186964,186970,186971,186974,186981,186989,186990,191576,191577,191679,191680,191682,191684,191695,191697,191707,191708,191797,191798,191810,191811,191825,191827,191836,191837,191839,191840,192147,192148,192149,192151,192162,192163,192239,192240,192242,192243,192307,192308,192391,192392,193822,193829,193837,193844,193884,193891,193917,193924,193949,193956,193976,193977,193991,193993,195206,195207,195386,195388,195389,195390,195400,195401,195406,195407,195432,195433,195437,195439,195441,195443,195464,195465,195476,195477,195539,195543,195547,195551,195552,195556,195557,195561,195562,195566,195567,195571,195572,195576,195577,195581,195582,195586,195587,195589,195590,195592,195593,195634,195693,195696,196111,196112,196483,196484,196608,196615,197976,197977,198066,198067,198105,198106,198113,198114,198121,198122,198129,198130,198137,198138,198148,198149,199382,199383,199402,199403,199443,199444,199456,199457,199493,199494,199510,199511,199527,199528,199562,199563,199701,199702,199715,199716,199720,199721,199728,199729,199741,199742,208067,208069,210080,210081,210156,210158,210172,210173,212337,212338,213804,213805,217652,217653,221535,221538,223387,223389,225194,225195,227102,227103,228749,228751,228889,228891,229376,229402,237783,237785,239629,239630,241609,241613,241698,241699,241939,241943,242179,242180,250822,250823,254390,254391,254643,254644,254677,254678,254685,254687,254694,254695,254702,254703,256158,256159,256205,256211,256212,256213,256390,256394,256402,256403,258284,258285,258720,258722,258729,258730,258908,258912,258917,258918,259036,259038,259795,259796,262144,262160,264675,264676,270552,270553,270699,270700,271073,271076,271670,271671,272296,272297,272839,272843,272856,272857,274430,274434,274458,274459,294912,294918,297450,297451,299353,299362,327680,327681,333906,333907,333980,333981,334033,334034,334072,334073,334516,334517,334692,334693,334891,334900,335395,335396,335438,335446,335475,335476,335477,335478,335833,335834,336873,336874,337178,337180,337314,337315,338714,338715,341591,341592,342543,342546,347247,347248,355301,360933,361017,361018") && 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,11,12,13,20,21,29,287,289,298,314,315") == "d31f6385b12b52f0c5470922326e822083cf8153" || 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,11,12,13,20,21,29,287,289,298,314,315") && 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"), "18,1,27,27963,27965,27973,27977,27981,27982,28044,28050,28051,131090,131091,140410,140837,143073,143115,143116") == "796339ddbbbf33012fcf33c2211e5bb4bfb1453c" || 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"), "18,1,27,27963,27965,27973,27977,27981,27982,28044,28050,28051,131090,131091,140410,140837,143073,143115,143116") && 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/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/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
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/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/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

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

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

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