getprop("ro.product.device") == "olive" || abort("E3004: This package is for \"olive\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.2.0.QCNCNXM:user/release-keys");
ui_print("Target: Xiaomi/olive/olive:10/QKQ1.191014.001/V12.0.1.0.QCNCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.2.0.QCNCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/olive/olive:10/QKQ1.191014.001/V12.0.1.0.QCNCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/olive/olive:10/QKQ1.191014.001/V11.0.2.0.QCNCNXM:user/release-keys or Xiaomi/olive/olive:10/QKQ1.191014.001/V12.0.1.0.QCNCNXM: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:67108864:4544204907e986f673c08d46c0a2026adb06f905",
                      "EMMC:/dev/block/bootdevice/by-name/boot:67108864:b94750b9073bfc1fec3ea4440204e79fcef8ab55") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:4544204907e986f673c08d46c0a2026adb06f905\" or \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:b94750b9073bfc1fec3ea4440204e79fcef8ab55\" has unexpected contents.");
apply_patch_space(127766528) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "280,1,690,791,805,815,818,836,843,863,864,1124,1129,1131,1132,1238,1239,1719,1720,2408,2409,2411,2413,2414,2415,2430,2431,2612,2613,2945,3055,3075,3086,3106,3265,3782,3783,3785,3786,3790,3791,3799,3800,3801,3802,4419,4542,5109,5313,5623,5893,8365,8498,9127,9128,9130,9536,9538,9539,10532,10534,16473,16474,16607,16608,19377,19379,25603,25605,32768,32770,33053,33054,34855,34856,34858,34860,34919,34920,35053,35055,35397,35401,35414,35415,35575,35579,35587,35588,35596,35600,35605,35606,35628,35632,35636,35637,40511,40512,40521,40525,40529,62923,63583,63585,63609,65537,66042,98306,98589,98590,99095,131073,131578,163842,164125,164126,164631,166503,166776,166778,166792,166793,166843,166845,166854,196609,197114,229378,229661,229662,230167,262145,262650,271868,272686,286518,294912,294914,295197,295198,296364,300978,300979,327681,328186,360449,360954,393217,393722,422081,422085,423244,423248,425985,426490,458753,459258,471873,472137,475815,475818,475829,475895,478051,478055,482574,482577,482645,482647,484910,484919,491521,492026,502865,502898,524289,524794,532434,532982,533242,533243,533320,549104,549422,549553,549686,549819,550663,550793,550926,551059,556189,557056,557057,557588,557589,558456,589825,590330,614454,614467,618147,618149,618163,618170,618191,618201,618203,618205,618214,618215,618217,618218,618222,618223,618230,618233,618259,618260,618267,618268,618271,618273,618282,618284,618297,618298,618313,618314,618371,618372,618376,618377,618418,618420,618435,618436,618443,618446,618455,618456,618470,618473,618506,618507,618519,618520,618541,618543,618549,618551,618888,618890,619156,619157,622593,623098,655361,655866,688129,688634,720897,721402,735804,735834,753665,754170,771951,771962,771968,819200,819202,884736,884738,1146880,1146881,1161015,1179411,1179647,1179648") == "51de0d40d800f6625f6bd862976dab15d3d3d180" || 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", "280,1,690,791,805,815,818,836,843,863,864,1124,1129,1131,1132,1238,1239,1719,1720,2408,2409,2411,2413,2414,2415,2430,2431,2612,2613,2945,3055,3075,3086,3106,3265,3782,3783,3785,3786,3790,3791,3799,3800,3801,3802,4419,4542,5109,5313,5623,5893,8365,8498,9127,9128,9130,9536,9538,9539,10532,10534,16473,16474,16607,16608,19377,19379,25603,25605,32768,32770,33053,33054,34855,34856,34858,34860,34919,34920,35053,35055,35397,35401,35414,35415,35575,35579,35587,35588,35596,35600,35605,35606,35628,35632,35636,35637,40511,40512,40521,40525,40529,62923,63583,63585,63609,65537,66042,98306,98589,98590,99095,131073,131578,163842,164125,164126,164631,166503,166776,166778,166792,166793,166843,166845,166854,196609,197114,229378,229661,229662,230167,262145,262650,271868,272686,286518,294912,294914,295197,295198,296364,300978,300979,327681,328186,360449,360954,393217,393722,422081,422085,423244,423248,425985,426490,458753,459258,471873,472137,475815,475818,475829,475895,478051,478055,482574,482577,482645,482647,484910,484919,491521,492026,502865,502898,524289,524794,532434,532982,533242,533243,533320,549104,549422,549553,549686,549819,550663,550793,550926,551059,556189,557056,557057,557588,557589,558456,589825,590330,614454,614467,618147,618149,618163,618170,618191,618201,618203,618205,618214,618215,618217,618218,618222,618223,618230,618233,618259,618260,618267,618268,618271,618273,618282,618284,618297,618298,618313,618314,618371,618372,618376,618377,618418,618420,618435,618436,618443,618446,618455,618456,618470,618473,618506,618507,618519,618520,618541,618543,618549,618551,618888,618890,619156,619157,622593,623098,655361,655866,688129,688634,720897,721402,735804,735834,753665,754170,771951,771962,771968,819200,819202,884736,884738,1146880,1146881,1161015,1179411,1179647,1179648") && 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", "56,1,525,602,610,620,624,629,630,711,715,720,721,726,727,990,994,999,32770,32864,32865,33370,41545,44042,65537,66042,71828,72437,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,220002,220267,229378,229472,229473,229978,262145,262650,287202,294912,294914,360448,360449,386991,393125,393215,393216") == "228c285c30269e0e1520c53739ed6a3b0084e486" || 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", "56,1,525,602,610,620,624,629,630,711,715,720,721,726,727,990,994,999,32770,32864,32865,33370,41545,44042,65537,66042,71828,72437,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,220002,220267,229378,229472,229473,229978,262145,262650,287202,294912,294914,360448,360449,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 ----

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

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
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/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/aboot");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1");
package_extract_file("firmware-update/cmnlib64_30.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/adspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/cmnlib_30.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
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/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/abootbak");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1bak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
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.");
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.");
show_progress(0.100000, 2);

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