getprop("ro.product.device") == "olivewood" || abort("E3004: This package is for \"olivewood\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/olivewood/olivewood:10/QKQ1.191014.001/V12.5.2.0.QCQIDXM:user/release-keys");
ui_print("Target: Redmi/olivewood/olivewood:10/QKQ1.191014.001/V12.5.4.0.QCQIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/olivewood/olivewood:10/QKQ1.191014.001/V12.5.2.0.QCQIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/olivewood/olivewood:10/QKQ1.191014.001/V12.5.4.0.QCQIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/olivewood/olivewood:10/QKQ1.191014.001/V12.5.2.0.QCQIDXM:user/release-keys or Redmi/olivewood/olivewood:10/QKQ1.191014.001/V12.5.4.0.QCQIDXM: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:33554432:6e9d61ba713457f22fc068c50796e5dc73d6b119",
                      "EMMC:/dev/block/bootdevice/by-name/boot:33554432:929bc2dd13f11ff4ec6df66cc321fb8ff17b942c") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:33554432:6e9d61ba713457f22fc068c50796e5dc73d6b119\" or \"EMMC:/dev/block/bootdevice/by-name/boot:33554432:929bc2dd13f11ff4ec6df66cc321fb8ff17b942c\" has unexpected contents.");
apply_patch_space(36286464) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/aboot:779468:094641a7b0b78722f5d30d5a68cf8b2b6a6ab47f",
                      "EMMC:/dev/block/bootdevice/by-name/aboot:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/aboot:779468:094641a7b0b78722f5d30d5a68cf8b2b6a6ab47f\" or \"EMMC:/dev/block/bootdevice/by-name/aboot:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/abootbak:779468:094641a7b0b78722f5d30d5a68cf8b2b6a6ab47f",
                      "EMMC:/dev/block/bootdevice/by-name/abootbak:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/abootbak:779468:094641a7b0b78722f5d30d5a68cf8b2b6a6ab47f\" or \"EMMC:/dev/block/bootdevice/by-name/abootbak:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:a153a8587152764385d844190df90b1e6c8ef5b8",
                      "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:4453c830834575b90742db212356f5c77e0c82f5") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:a153a8587152764385d844190df90b1e6c8ef5b8\" or \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:4453c830834575b90742db212356f5c77e0c82f5\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:ac0046abbd571f22a0b074f4eebd78c3fb946163",
                      "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:704d09ec8091a412a13444bec5f8881e280234be") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:ac0046abbd571f22a0b074f4eebd78c3fb946163\" or \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:704d09ec8091a412a13444bec5f8881e280234be\" has unexpected contents.");
apply_patch_space(8388608) || 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", "140,1,624,759,773,803,810,830,831,1018,1023,1025,1026,1132,1133,1613,1614,1616,1618,1619,1620,1635,1636,1773,1774,1998,2040,2601,2602,2604,2605,2608,2609,2617,2618,2619,2620,3497,3665,5685,5801,7008,7009,7011,7297,7299,7300,7863,7865,13804,13805,13938,13939,16608,16710,22982,22983,22985,22987,23046,23047,23180,32770,33021,33022,33527,65537,66042,98306,98557,98558,99063,131073,131578,163842,164093,164094,164599,196609,197114,229378,229629,229630,230135,262145,262650,294914,295165,295166,295671,327681,328186,360449,360954,392703,392754,392756,392763,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,819202,819453,819454,819959,851969,852474,884738,884989,884990,885495,886975,1015808,1015809,1032011,1048363,1048575,1048576") == "ffa8e18d9bfa7e0f270a698ca3a744e6f9837a47" || 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", "140,1,624,759,773,803,810,830,831,1018,1023,1025,1026,1132,1133,1613,1614,1616,1618,1619,1620,1635,1636,1773,1774,1998,2040,2601,2602,2604,2605,2608,2609,2617,2618,2619,2620,3497,3665,5685,5801,7008,7009,7011,7297,7299,7300,7863,7865,13804,13805,13938,13939,16608,16710,22982,22983,22985,22987,23046,23047,23180,32770,33021,33022,33527,65537,66042,98306,98557,98558,99063,131073,131578,163842,164093,164094,164599,196609,197114,229378,229629,229630,230135,262145,262650,294914,295165,295166,295671,327681,328186,360449,360954,392703,392754,392756,392763,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,819202,819453,819454,819959,851969,852474,884738,884989,884990,885495,886975,1015808,1015809,1032011,1048363,1048575,1048576") && 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", "440,1,455,570,578,590,594,599,600,683,687,692,693,957,961,966,967,970,974,977,978,1204,1212,1220,1226,1231,1235,1239,1240,1813,1814,3725,3726,3864,3908,4294,4295,4927,4928,5664,5669,14863,14864,23446,23447,29619,29620,32768,32770,32832,32833,47457,47458,52746,52747,58931,58932,60162,60164,60184,60186,60505,60506,60832,60833,61127,61128,61436,61437,61719,61720,62014,62015,62391,62392,62466,62467,65536,65537,66386,66387,66566,66569,66587,66588,66633,66634,66652,66654,66703,66704,66736,66737,67624,67625,67638,67639,67670,67671,67770,67771,68054,68055,68071,68072,68169,68170,68172,68173,68368,68559,68739,68740,68815,68816,68817,68818,68830,68832,70098,70099,71236,71238,71659,71660,71934,71935,72359,72360,72558,72562,73403,73404,74312,74313,83299,83300,84286,84287,94038,94039,95517,95518,97181,97183,98304,98306,98368,98369,98892,98893,99414,99415,101190,101191,102853,102854,104578,104579,106272,106273,107487,107488,108814,108815,110136,110137,111363,111364,112687,112688,114074,114075,115367,115368,116670,116671,118025,118026,119320,119321,120577,120578,121813,121814,123166,123167,124349,124350,125702,125703,126941,126942,127751,127752,127776,127777,127801,127802,128058,128059,128083,128084,128108,128109,128133,128134,128158,128159,128259,128260,128501,128502,128526,128527,128664,128665,128689,128690,128714,128715,129324,129325,129349,129350,129374,129375,129587,129588,129632,129633,129657,129658,129682,129683,129707,129708,129732,129733,130074,130075,130099,130100,130237,130238,130262,130263,130287,130288,130924,130925,131072,131073,132632,132633,133952,133953,134143,134144,134168,134169,134193,134194,135235,135236,136529,136530,137682,137683,138930,138931,140147,140148,141338,141339,142589,142590,143803,143804,144952,144953,146093,146094,147238,147239,148388,148389,148854,148855,148879,148880,148904,148905,149161,149162,149186,149187,149211,149212,149236,149237,149261,149262,149603,149604,149628,149629,149672,149673,149767,149768,149792,149793,149817,149818,150427,150428,150452,150453,150477,150478,150734,150735,150759,150760,150784,150785,150809,150810,150834,150835,150887,150888,151177,151178,151202,151203,151340,151341,151365,151366,151390,151391,152103,152104,152342,152343,152367,152368,152392,152393,153256,153257,155009,155010,156731,156732,158472,158473,158695,158696,158720,158721,158745,158746,158770,158771,158795,158796,159137,159138,159162,159163,160221,160222,161711,161712,163076,163077,163840,163842,163904,163905,164992,164993,166270,166271,167629,167630,168970,168971,170227,170228,171544,171545,173256,173257,174972,174973,187759,187760,192774,192991,193097,193135,193320,196609,197114,224332,224422,224424,224678,224679,225441,225442,227901,227902,229376,229378,229440,229441,230387,230388,230475,230479,230496,230497,230518,230522,233008,233010,233036,233037,233064,233095,233101,233111,257987,262077,262143,262144") == "e7b9a64e4a8607daa11269e6764f6ce0e1a4cce6" || 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", "440,1,455,570,578,590,594,599,600,683,687,692,693,957,961,966,967,970,974,977,978,1204,1212,1220,1226,1231,1235,1239,1240,1813,1814,3725,3726,3864,3908,4294,4295,4927,4928,5664,5669,14863,14864,23446,23447,29619,29620,32768,32770,32832,32833,47457,47458,52746,52747,58931,58932,60162,60164,60184,60186,60505,60506,60832,60833,61127,61128,61436,61437,61719,61720,62014,62015,62391,62392,62466,62467,65536,65537,66386,66387,66566,66569,66587,66588,66633,66634,66652,66654,66703,66704,66736,66737,67624,67625,67638,67639,67670,67671,67770,67771,68054,68055,68071,68072,68169,68170,68172,68173,68368,68559,68739,68740,68815,68816,68817,68818,68830,68832,70098,70099,71236,71238,71659,71660,71934,71935,72359,72360,72558,72562,73403,73404,74312,74313,83299,83300,84286,84287,94038,94039,95517,95518,97181,97183,98304,98306,98368,98369,98892,98893,99414,99415,101190,101191,102853,102854,104578,104579,106272,106273,107487,107488,108814,108815,110136,110137,111363,111364,112687,112688,114074,114075,115367,115368,116670,116671,118025,118026,119320,119321,120577,120578,121813,121814,123166,123167,124349,124350,125702,125703,126941,126942,127751,127752,127776,127777,127801,127802,128058,128059,128083,128084,128108,128109,128133,128134,128158,128159,128259,128260,128501,128502,128526,128527,128664,128665,128689,128690,128714,128715,129324,129325,129349,129350,129374,129375,129587,129588,129632,129633,129657,129658,129682,129683,129707,129708,129732,129733,130074,130075,130099,130100,130237,130238,130262,130263,130287,130288,130924,130925,131072,131073,132632,132633,133952,133953,134143,134144,134168,134169,134193,134194,135235,135236,136529,136530,137682,137683,138930,138931,140147,140148,141338,141339,142589,142590,143803,143804,144952,144953,146093,146094,147238,147239,148388,148389,148854,148855,148879,148880,148904,148905,149161,149162,149186,149187,149211,149212,149236,149237,149261,149262,149603,149604,149628,149629,149672,149673,149767,149768,149792,149793,149817,149818,150427,150428,150452,150453,150477,150478,150734,150735,150759,150760,150784,150785,150809,150810,150834,150835,150887,150888,151177,151178,151202,151203,151340,151341,151365,151366,151390,151391,152103,152104,152342,152343,152367,152368,152392,152393,153256,153257,155009,155010,156731,156732,158472,158473,158695,158696,158720,158721,158745,158746,158770,158771,158795,158796,159137,159138,159162,159163,160221,160222,161711,161712,163076,163077,163840,163842,163904,163905,164992,164993,166270,166271,167629,167630,168970,168971,170227,170228,171544,171545,173256,173257,174972,174973,187759,187760,192774,192991,193097,193135,193320,196609,197114,224332,224422,224424,224678,224679,225441,225442,227901,227902,229376,229378,229440,229441,230387,230388,230475,230479,230496,230497,230518,230522,233008,233010,233036,233037,233064,233095,233101,233111,257987,262077,262143,262144") && 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:33554432:6e9d61ba713457f22fc068c50796e5dc73d6b119",
                "EMMC:/dev/block/bootdevice/by-name/boot:33554432:929bc2dd13f11ff4ec6df66cc321fb8ff17b942c",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:33554432:929bc2dd13f11ff4ec6df66cc321fb8ff17b942c");

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

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/aboot:779468:094641a7b0b78722f5d30d5a68cf8b2b6a6ab47f",
                "EMMC:/dev/block/bootdevice/by-name/aboot:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abootbak:779468:094641a7b0b78722f5d30d5a68cf8b2b6a6ab47f",
                "EMMC:/dev/block/bootdevice/by-name/abootbak:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:779468:e6f6300909a1c4fe5a9128dd5c4cbfc15b5ac9f4");
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/splash.img", "/dev/block/bootdevice/by-name/splash");
patch_partition("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:a153a8587152764385d844190df90b1e6c8ef5b8",
                "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:4453c830834575b90742db212356f5c77e0c82f5",
                package_extract_file("patch/firmware-update/dtbo.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:4453c830834575b90742db212356f5c77e0c82f5");
patch_partition("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:ac0046abbd571f22a0b074f4eebd78c3fb946163",
                "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:704d09ec8091a412a13444bec5f8881e280234be",
                package_extract_file("patch/firmware-update/vbmeta.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:704d09ec8091a412a13444bec5f8881e280234be");
