getprop("ro.product.device") == "davinci" || abort("E3004: This package is for \"davinci\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/davinci/davinci:11/RKQ1.200826.002/V12.1.2.0.RFJMIXM:user/release-keys");
ui_print("Target: Xiaomi/davinci/davinci:11/RKQ1.200826.002/V12.1.4.0.RFJMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/davinci/davinci:11/RKQ1.200826.002/V12.1.2.0.RFJMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/davinci/davinci:11/RKQ1.200826.002/V12.1.4.0.RFJMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/davinci/davinci:11/RKQ1.200826.002/V12.1.2.0.RFJMIXM:user/release-keys or Xiaomi/davinci/davinci:11/RKQ1.200826.002/V12.1.4.0.RFJMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:59de2286b71a55c9b37c3dbb05c90bd0b8be7b09"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c27bb21ee2532162a39ebebf8e424359dc14c5e2")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:59de2286b71a55c9b37c3dbb05c90bd0b8be7b09"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c27bb21ee2532162a39ebebf8e424359dc14c5e2"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/bootdevice/by-name/system", "90,1,405,508,522,536,545,547,552,554,555,931,932,933,934,1123,1124,1452,1453,1455,1456,1471,1886,2010,2011,2014,2015,2315,2316,3704,3705,7757,7758,11555,32771,33276,65537,66042,98307,98812,131073,131578,163843,164348,196609,197114,229379,229884,262145,262650,294915,295420,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819203,819708,822737,884736,884739,903007,917316,917503,917504") == "3eefe89ba36e95e1b2e941e5c0cde1f08948203c" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "90,1,405,508,522,536,545,547,552,554,555,931,932,933,934,1123,1124,1452,1453,1455,1456,1471,1886,2010,2011,2014,2015,2315,2316,3704,3705,7757,7758,11555,32771,33276,65537,66042,98307,98812,131073,131578,163843,164348,196609,197114,229379,229884,262145,262650,294915,295420,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819203,819708,822737,884736,884739,903007,917316,917503,917504") && block_image_verify("/dev/block/bootdevice/by-name/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("/dev/block/bootdevice/by-name/vendor", "160,1,193,508,515,525,526,604,609,2283,2284,2346,2347,2349,2353,2592,2593,2596,2597,2600,2601,2610,2611,3433,3434,3478,3519,4835,5639,5861,5862,14448,14449,14461,14462,15388,15389,16023,16024,17008,17016,19269,19270,32768,32771,47621,47623,53087,53088,65536,65537,71011,71012,75811,75812,82569,82570,96537,96538,97768,97770,97799,97801,98283,98284,98304,98307,98876,98877,121167,121168,121172,121174,121192,121193,121238,121239,121257,121258,121260,121261,121311,121312,121367,121368,121374,121375,121400,121401,121436,121437,121542,121543,121596,121597,121851,121852,121865,121866,127125,127126,128848,128849,128860,128861,129540,129542,129587,129588,129702,129703,131072,131073,136521,136522,136524,136525,139554,139555,139556,139557,139603,139604,140027,140028,140084,140085,140387,140389,140390,140396,140720,140722,140727,140737,140742,140743,140745,140749,140890,140901,141341,163843,164348,196609,197114,229379,229884,262145,262650,294915,295420,327681,328186,360449,360954,376853,386991,393125,393215,393216") == "507c99eaef93bac4bd3979f6874462e7fd9bba8c" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "160,1,193,508,515,525,526,604,609,2283,2284,2346,2347,2349,2353,2592,2593,2596,2597,2600,2601,2610,2611,3433,3434,3478,3519,4835,5639,5861,5862,14448,14449,14461,14462,15388,15389,16023,16024,17008,17016,19269,19270,32768,32771,47621,47623,53087,53088,65536,65537,71011,71012,75811,75812,82569,82570,96537,96538,97768,97770,97799,97801,98283,98284,98304,98307,98876,98877,121167,121168,121172,121174,121192,121193,121238,121239,121257,121258,121260,121261,121311,121312,121367,121368,121374,121375,121400,121401,121436,121437,121542,121543,121596,121597,121851,121852,121865,121866,127125,127126,128848,128849,128860,128861,129540,129542,129587,129588,129702,129703,131072,131073,136521,136522,136524,136525,139554,139555,139556,139557,139603,139604,140027,140028,140084,140085,140387,140389,140390,140396,140720,140722,140727,140737,140742,140743,140745,140749,140890,140901,141341,163843,164348,196609,197114,229379,229884,262145,262650,294915,295420,327681,328186,360449,360954,376853,386991,393125,393215,393216") && block_image_verify("/dev/block/bootdevice/by-name/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;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:59de2286b71a55c9b37c3dbb05c90bd0b8be7b09"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c27bb21ee2532162a39ebebf8e424359dc14c5e2"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c27bb21ee2532162a39ebebf8e424359dc14c5e2")));

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