getprop("ro.product.device") == "picasso" || abort("E3004: This package is for \"picasso\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/picasso/picasso:10/QKQ1.191222.002/V12.0.5.0.QGICNXM:user/release-keys");
ui_print("Target: Redmi/picasso/picasso:10/QKQ1.191222.002/V12.0.6.0.QGICNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/picasso/picasso:10/QKQ1.191222.002/V12.0.5.0.QGICNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/picasso/picasso:10/QKQ1.191222.002/V12.0.6.0.QGICNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/picasso/picasso:10/QKQ1.191222.002/V12.0.5.0.QGICNXM:user/release-keys or Redmi/picasso/picasso:10/QKQ1.191222.002/V12.0.6.0.QGICNXM: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:90efae1379c5d4a1fe7b4add826053158363fdbd",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:579afbbb7be34b0ad60d7d812b95fddcf024da9d") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:90efae1379c5d4a1fe7b4add826053158363fdbd\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:579afbbb7be34b0ad60d7d812b95fddcf024da9d\" 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"), "372,1,32770,32978,98306,98514,163842,164050,174129,175052,175054,175080,229378,229586,294914,295122,304184,304185,305394,305437,305438,305442,305558,305562,305585,305693,305694,306130,306192,306239,306240,306245,306262,306286,309402,311653,311685,311690,311691,311694,311719,311720,311725,311726,311728,311734,311735,311736,311737,311743,311744,311747,311750,311751,311758,311762,311764,311766,311786,311788,311791,311792,311802,311803,311881,311884,311890,311895,311896,311906,311907,311922,311925,311928,311932,311935,311950,311952,311964,311965,311967,311968,311973,311974,311977,311978,311979,311980,311982,311983,312011,312030,312047,312048,312065,312066,312072,312073,312084,312089,312092,312099,312104,312106,312111,312155,312157,312167,312168,312173,312175,312198,312200,312208,312210,312223,312225,312226,312227,312229,312230,312242,312248,312252,312263,312264,312278,312284,312292,312293,312298,312300,312310,312312,312342,312345,312350,312356,312363,312373,312377,312382,312388,312426,312457,312467,312468,312469,312483,312487,312506,312512,312519,312525,312529,312537,312538,312539,312546,312555,312567,312617,312620,312621,312627,312628,312629,312660,312685,312688,312689,312690,312693,312694,312702,312716,312723,312725,312733,312734,312747,312750,312753,312754,312758,312760,312762,312763,312778,312782,312786,312815,312818,312820,312826,312827,312829,312833,312844,312845,312859,312861,312862,312865,312872,312873,312883,312897,312903,312912,312916,312917,312927,312929,312930,312932,312936,312954,312958,312974,312978,312994,312996,313000,313001,313074,313080,313081,313085,313086,313088,313090,313095,313106,313107,313132,313134,313146,313149,313154,313156,313167,313169,313184,313194,313200,313205,313208,313214,313241,313258,313265,313270,313287,313295,313296,313300,313301,313321,313325,313327,313329,313332,313334,313337,313338,313342,313346,313384,313386,313449,313450,313451,313452,313460,313462,313463,313473,313475,313476,313482,313483,313494,313495,313516,313517,313523,313525,313526,313527,313536,313549,313551,313559,313563,313564,313565,313568,313570,313623,313625,313684,313685,313748,313755,313756,313787,313789,313812,313826,313888,313889,313905,313910,313921,313924,313940,313941,313946,313948,313949,313951,313974,313977,313978,313985,313989,313990,313996,314021,314058,314062,314065,314066,314068,314069,314070,314074,314190,314192,314193,314194,314255,314258,314259,314260,314263,314271,314272,314289,314299,314302,314304,314306,314307,314308,314310,314315,314344,314351,314355,314356,819202,819410,819422,819427,849851,851968,851969,852710,866221,866400,866401") == "faee91d51b228d077040b3d7a5536eb795e61e71" || 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"), "372,1,32770,32978,98306,98514,163842,164050,174129,175052,175054,175080,229378,229586,294914,295122,304184,304185,305394,305437,305438,305442,305558,305562,305585,305693,305694,306130,306192,306239,306240,306245,306262,306286,309402,311653,311685,311690,311691,311694,311719,311720,311725,311726,311728,311734,311735,311736,311737,311743,311744,311747,311750,311751,311758,311762,311764,311766,311786,311788,311791,311792,311802,311803,311881,311884,311890,311895,311896,311906,311907,311922,311925,311928,311932,311935,311950,311952,311964,311965,311967,311968,311973,311974,311977,311978,311979,311980,311982,311983,312011,312030,312047,312048,312065,312066,312072,312073,312084,312089,312092,312099,312104,312106,312111,312155,312157,312167,312168,312173,312175,312198,312200,312208,312210,312223,312225,312226,312227,312229,312230,312242,312248,312252,312263,312264,312278,312284,312292,312293,312298,312300,312310,312312,312342,312345,312350,312356,312363,312373,312377,312382,312388,312426,312457,312467,312468,312469,312483,312487,312506,312512,312519,312525,312529,312537,312538,312539,312546,312555,312567,312617,312620,312621,312627,312628,312629,312660,312685,312688,312689,312690,312693,312694,312702,312716,312723,312725,312733,312734,312747,312750,312753,312754,312758,312760,312762,312763,312778,312782,312786,312815,312818,312820,312826,312827,312829,312833,312844,312845,312859,312861,312862,312865,312872,312873,312883,312897,312903,312912,312916,312917,312927,312929,312930,312932,312936,312954,312958,312974,312978,312994,312996,313000,313001,313074,313080,313081,313085,313086,313088,313090,313095,313106,313107,313132,313134,313146,313149,313154,313156,313167,313169,313184,313194,313200,313205,313208,313214,313241,313258,313265,313270,313287,313295,313296,313300,313301,313321,313325,313327,313329,313332,313334,313337,313338,313342,313346,313384,313386,313449,313450,313451,313452,313460,313462,313463,313473,313475,313476,313482,313483,313494,313495,313516,313517,313523,313525,313526,313527,313536,313549,313551,313559,313563,313564,313565,313568,313570,313623,313625,313684,313685,313748,313755,313756,313787,313789,313812,313826,313888,313889,313905,313910,313921,313924,313940,313941,313946,313948,313949,313951,313974,313977,313978,313985,313989,313990,313996,314021,314058,314062,314065,314066,314068,314069,314070,314074,314190,314192,314193,314194,314255,314258,314259,314260,314263,314271,314272,314289,314299,314302,314304,314306,314307,314308,314310,314315,314344,314351,314355,314356,819202,819410,819422,819427,849851,851968,851969,852710,866221,866400,866401") && 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"), "114,1,7622,16490,16491,16722,16773,17549,17550,17554,17556,17559,17561,17564,17566,17569,17571,17574,17576,17579,17581,17585,17587,17588,17589,17591,17593,17594,17595,17597,17599,17600,17601,17609,17611,17612,17613,17615,17617,17618,17619,17623,17624,17628,17630,17633,17635,17638,17640,17643,17645,17648,17650,17651,17652,17661,17662,17663,17664,17685,17686,17687,17688,17693,17694,17698,17699,17703,17704,17708,17709,17714,17715,17719,17720,17721,17722,17725,17726,17727,17728,17731,17732,17733,17734,17737,17738,17739,17740,18086,18087,19248,19253,23155,23156,23470,32770,32867,82738,85579,98306,98403,163842,163939,229378,229475,294914,295011,393224,393233,396427,397686,403990,404082,404083") == "dbf67c899e355a670919b8ba1798b8acbc542e0f" || 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"), "114,1,7622,16490,16491,16722,16773,17549,17550,17554,17556,17559,17561,17564,17566,17569,17571,17574,17576,17579,17581,17585,17587,17588,17589,17591,17593,17594,17595,17597,17599,17600,17601,17609,17611,17612,17613,17615,17617,17618,17619,17623,17624,17628,17630,17633,17635,17638,17640,17643,17645,17648,17650,17651,17652,17661,17662,17663,17664,17685,17686,17687,17688,17693,17694,17698,17699,17703,17704,17708,17709,17714,17715,17719,17720,17721,17722,17725,17726,17727,17728,17731,17732,17733,17734,17737,17738,17739,17740,18086,18087,19248,19253,23155,23156,23470,32770,32867,82738,85579,98306,98403,163842,163939,229378,229475,294914,295011,393224,393233,396427,397686,403990,404082,404083") && 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"), "8,1,32770,32787,71991,72212,73360,73391,73392") == "e3f64dec3c3b7e3c155fc0e40dd5f121bcd5abd0" || 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"), "8,1,32770,32787,71991,72212,73360,73391,73392") && 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,212,215,221,237,238") == "d3762b611e46af04d9bfe6d63c2ca6eeaab20a82" || 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,212,215,221,237,238") && 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 ----


# ---- 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/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
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/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/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/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/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:134217728:90efae1379c5d4a1fe7b4add826053158363fdbd",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:579afbbb7be34b0ad60d7d812b95fddcf024da9d",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:579afbbb7be34b0ad60d7d812b95fddcf024da9d");

# ---- 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/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
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/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/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/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/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


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