getprop("ro.product.device") == "phoenix" || abort("E3004: This package is for \"phoenix\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/phoenix/phoenix:10/QKQ1.190825.002/V12.0.3.0.QGHCNXM:user/release-keys");
ui_print("Target: Redmi/phoenix/phoenix:10/QKQ1.190825.002/V12.0.4.0.QGHCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/phoenix/phoenix:10/QKQ1.190825.002/V12.0.3.0.QGHCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/phoenix/phoenix:10/QKQ1.190825.002/V12.0.4.0.QGHCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/phoenix/phoenix:10/QKQ1.190825.002/V12.0.3.0.QGHCNXM:user/release-keys or Redmi/phoenix/phoenix:10/QKQ1.190825.002/V12.0.4.0.QGHCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:134217728:b1d1ed5e7019286834ee5aa5d01ce670315cc20c",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:b2723dd9ce62f34d1e611251004a614fbf85a3c2") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:b1d1ed5e7019286834ee5aa5d01ce670315cc20c\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:b2723dd9ce62f34d1e611251004a614fbf85a3c2\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "60,1,32770,32979,98306,98515,115501,117298,117302,117330,163842,164051,194246,194266,229378,229587,294914,295123,335260,336509,336510,339056,339057,339059,339060,339073,339074,339527,339528,352440,352441,352448,352449,352462,352463,352542,352543,352690,352691,360448,360463,364095,364096,364585,374859,375966,375967,376186,504128,504157,592736,592769,819202,819411,851981,851983,856110,858986,872596,872777,872778") == "bf2dc7c600ffd032fe0a937ab6f84f14eace0818" || 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"), "60,1,32770,32979,98306,98515,115501,117298,117302,117330,163842,164051,194246,194266,229378,229587,294914,295123,335260,336509,336510,339056,339057,339059,339060,339073,339074,339527,339528,352440,352441,352448,352449,352462,352463,352542,352543,352690,352691,360448,360463,364095,364096,364585,374859,375966,375967,376186,504128,504157,592736,592769,819202,819411,851981,851983,856110,858986,872596,872777,872778") && 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"), "30,1,5309,5317,6820,6830,32770,32851,97779,97780,98117,98118,98155,98156,98306,98387,163842,163923,229378,229459,294914,294995,324579,324628,327690,327699,333795,334858,340166,340246,340247") == "2afba33377fe89064ba05064c5d60c8a7e229ee1" || 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"), "30,1,5309,5317,6820,6830,32770,32851,97779,97780,98117,98118,98155,98156,98306,98387,163842,163923,229378,229459,294914,294995,324579,324628,327690,327699,333795,334858,340166,340246,340247") && 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"), "218,1,70,74,75,82,88,89,90,96,102,103,104,164,168,173,174,176,177,183,189,190,191,306,312,313,314,326,332,333,334,337,338,344,350,351,352,375,381,382,383,1227,1228,14674,14675,14694,14695,16375,16377,30171,30172,30586,30587,31185,31186,31197,31203,31204,31205,31215,31216,31221,31225,31230,31231,31237,31243,31244,31245,31257,31263,31264,31265,31275,31281,31282,31283,31285,31292,31298,31299,32768,32770,32787,32811,33100,33101,33107,33108,33247,33248,34451,34458,34512,34519,34524,34563,34583,34590,34608,34615,34631,34632,34674,34676,34846,34847,34848,34849,34850,34851,34885,34886,34887,34888,35120,35124,35128,35132,35133,35137,35138,35142,35143,35147,35148,35152,35153,35157,35158,35162,35163,35165,35172,35176,35177,35181,35182,35186,35187,35191,35192,35196,35197,35201,35202,35206,35207,35209,35210,35214,35215,35219,35220,35224,35225,35229,35230,35234,35235,35239,35240,35242,35247,35251,35252,35256,35257,35261,35262,35264,35265,35269,35270,35272,35273,35277,35278,35280,35281,35285,35286,35290,35291,35295,35296,35330,35333,35430,36298,36299,39840,39841,40695,40696,45389,45390,46577,46580,46995,46996,49160,49204,49941,49943,49963,49967,50392,50393,55256,55258,55276,65559,65560,71918,72139,73286,73315,73316") == "746b6c6a32ad729e1091244fc761439e58510085" || 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
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "218,1,70,74,75,82,88,89,90,96,102,103,104,164,168,173,174,176,177,183,189,190,191,306,312,313,314,326,332,333,334,337,338,344,350,351,352,375,381,382,383,1227,1228,14674,14675,14694,14695,16375,16377,30171,30172,30586,30587,31185,31186,31197,31203,31204,31205,31215,31216,31221,31225,31230,31231,31237,31243,31244,31245,31257,31263,31264,31265,31275,31281,31282,31283,31285,31292,31298,31299,32768,32770,32787,32811,33100,33101,33107,33108,33247,33248,34451,34458,34512,34519,34524,34563,34583,34590,34608,34615,34631,34632,34674,34676,34846,34847,34848,34849,34850,34851,34885,34886,34887,34888,35120,35124,35128,35132,35133,35137,35138,35142,35143,35147,35148,35152,35153,35157,35158,35162,35163,35165,35172,35176,35177,35181,35182,35186,35187,35191,35192,35196,35197,35201,35202,35206,35207,35209,35210,35214,35215,35219,35220,35224,35225,35229,35230,35234,35235,35239,35240,35242,35247,35251,35252,35256,35257,35261,35262,35264,35265,35269,35270,35272,35273,35277,35278,35280,35281,35285,35286,35290,35291,35295,35296,35330,35333,35430,36298,36299,39840,39841,40695,40696,45389,45390,46577,46580,46995,46996,49160,49204,49941,49943,49963,49967,50392,50393,55256,55258,55276,65559,65560,71918,72139,73286,73315,73316") && 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"), "8,1,11,12,203,206,212,228,229") == "b3921e04df2e7eb743a28eb4ea37819e88f49acc" || 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
check_first_block(map_partition("odm"));
ifelse (block_image_recover(map_partition("odm"), "8,1,11,12,203,206,212,228,229") && 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;

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

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

# ---- 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/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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/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/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/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
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/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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");
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");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Patch partition product

ui_print("Patching product image after verification.");
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 vendor

ui_print("Patching vendor image after verification.");
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 system

ui_print("Patching system image after verification.");
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 odm

ui_print("Patching odm image after verification.");
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.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");
