getprop("ro.product.device") == "sweet" || abort("E3004: This package is for \"sweet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/sweet_eea/sweet:13/RKQ1.210614.002/V14.0.7.0.TKFEUXM:user/release-keys");
ui_print("Target: Redmi/sweet_eea/sweet:13/RKQ1.210614.002/V14.0.9.0.TKFEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/sweet_eea/sweet:13/RKQ1.210614.002/V14.0.7.0.TKFEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/sweet_eea/sweet:13/RKQ1.210614.002/V14.0.9.0.TKFEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/sweet_eea/sweet:13/RKQ1.210614.002/V14.0.7.0.TKFEUXM:user/release-keys or Redmi/sweet_eea/sweet:13/RKQ1.210614.002/V14.0.9.0.TKFEUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:bb7c3ed39d4db0a7d1aab1239d2448b6829edecc"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0c1a879cd825a36f09d5f269ce6537161cf6e1cd")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:bb7c3ed39d4db0a7d1aab1239d2448b6829edecc"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0c1a879cd825a36f09d5f269ce6537161cf6e1cd"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "4,0,16384,24576,326849") == "5f5b0bedca179430ce86640f7075ac0004400bc9" || 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"), "4,0,16384,24576,326849") && 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"), "482,1,120,131,133,140,141,221,227,235,236,621,622,628,630,636,637,882,884,891,892,1025,1026,1034,1036,1041,1042,1047,1049,1054,1055,1058,1059,1069,1071,1077,1078,1693,1744,1861,1862,4412,4413,13141,13142,14167,14169,14173,14175,14176,14177,14198,14199,14200,14201,14204,14205,14210,14211,14212,14213,14217,14218,14222,14223,14227,14228,14232,14233,14237,14238,14242,14243,14244,14245,14248,14250,14251,14252,14254,14256,14257,14258,14261,14262,14263,14264,14267,14268,14269,14270,14273,14274,14275,14276,14279,14280,14281,14282,14286,14287,14291,14292,14295,14297,14301,14302,14305,14307,14308,14309,14313,14314,14315,14316,14319,14320,14321,14322,14325,14326,14327,14328,14331,14332,14333,14334,14337,14339,14340,14341,14344,14345,14346,14347,14352,14353,14357,14358,14362,14363,14367,14368,14372,14373,14734,14735,15650,15655,32768,32770,32857,32885,57184,57185,57814,57816,57851,57853,58352,58353,58575,58576,65536,65559,65634,65635,65639,65641,65658,65659,65694,65695,65704,65705,65707,65708,65762,65763,65767,65768,65843,65844,65850,65851,65876,65877,65913,65914,66021,66022,66075,66076,66208,66212,66680,66681,66705,66706,66712,66713,66729,66730,66843,66844,66846,66848,66912,66913,66983,66984,67051,67052,67054,67055,67057,67067,67126,67127,67129,67131,67192,67193,67195,67196,67256,67257,67259,67260,67323,67324,67326,67327,67394,67395,67397,67398,67465,67466,67535,67536,67604,67605,67676,67677,67679,67680,67745,67746,67748,67749,67813,67814,67816,67817,67881,67882,67884,67885,67952,67953,67955,67956,68023,68024,68026,68027,68091,68092,68094,68095,68159,68160,68162,68163,68227,68228,68231,68232,68296,68297,68299,68300,68365,68366,68368,68369,68371,68372,68435,68436,68438,68439,68444,68445,68446,68447,68448,68449,68510,68511,68513,68514,68574,68575,68577,68578,68641,68642,68644,68645,68712,68713,68715,68716,68783,68784,68853,68854,68922,68923,68994,68995,68997,68998,69063,69064,69066,69067,69131,69132,69134,69135,69199,69200,69202,69203,69267,69268,69270,69271,69335,69336,69338,69339,69403,69404,69406,69407,69471,69472,69474,69475,69539,69540,69542,69543,69607,69608,69611,69612,69677,69678,69680,69681,69744,69746,69748,69749,69911,69912,69926,69927,70409,70410,70411,70412,73583,73584,78210,78211,78267,78268,78293,78294,78358,78359,78509,78510,78589,78590,78614,78615,78685,78686,78753,78754,78785,78786,78878,78879,78951,78952,78976,78977,79063,79064,79103,79104,79106,79107,79139,79140,79361,79362,79478,79479,79550,79551,79607,79608,79749,79750,79751,79752,79862,79863,79928,79929,79953,79954,80002,80003,80073,80074,80156,80157,80431,80432,80435,80436,80440,80441,80526,80528,80584,80585,80875,80879,80887,80889,80897,80904,80918,80919,81080,81091,81099,81100,81101,81102,81193,81195,81201,81203,81238,81264,82933,98306,98393,163842,163929,229378,229465,294914,295001,327702,327703,358278,359498,365197,365281,365282") == "247d075de0e49f2e97eb652d4d8543acf56fb508" || 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"), "482,1,120,131,133,140,141,221,227,235,236,621,622,628,630,636,637,882,884,891,892,1025,1026,1034,1036,1041,1042,1047,1049,1054,1055,1058,1059,1069,1071,1077,1078,1693,1744,1861,1862,4412,4413,13141,13142,14167,14169,14173,14175,14176,14177,14198,14199,14200,14201,14204,14205,14210,14211,14212,14213,14217,14218,14222,14223,14227,14228,14232,14233,14237,14238,14242,14243,14244,14245,14248,14250,14251,14252,14254,14256,14257,14258,14261,14262,14263,14264,14267,14268,14269,14270,14273,14274,14275,14276,14279,14280,14281,14282,14286,14287,14291,14292,14295,14297,14301,14302,14305,14307,14308,14309,14313,14314,14315,14316,14319,14320,14321,14322,14325,14326,14327,14328,14331,14332,14333,14334,14337,14339,14340,14341,14344,14345,14346,14347,14352,14353,14357,14358,14362,14363,14367,14368,14372,14373,14734,14735,15650,15655,32768,32770,32857,32885,57184,57185,57814,57816,57851,57853,58352,58353,58575,58576,65536,65559,65634,65635,65639,65641,65658,65659,65694,65695,65704,65705,65707,65708,65762,65763,65767,65768,65843,65844,65850,65851,65876,65877,65913,65914,66021,66022,66075,66076,66208,66212,66680,66681,66705,66706,66712,66713,66729,66730,66843,66844,66846,66848,66912,66913,66983,66984,67051,67052,67054,67055,67057,67067,67126,67127,67129,67131,67192,67193,67195,67196,67256,67257,67259,67260,67323,67324,67326,67327,67394,67395,67397,67398,67465,67466,67535,67536,67604,67605,67676,67677,67679,67680,67745,67746,67748,67749,67813,67814,67816,67817,67881,67882,67884,67885,67952,67953,67955,67956,68023,68024,68026,68027,68091,68092,68094,68095,68159,68160,68162,68163,68227,68228,68231,68232,68296,68297,68299,68300,68365,68366,68368,68369,68371,68372,68435,68436,68438,68439,68444,68445,68446,68447,68448,68449,68510,68511,68513,68514,68574,68575,68577,68578,68641,68642,68644,68645,68712,68713,68715,68716,68783,68784,68853,68854,68922,68923,68994,68995,68997,68998,69063,69064,69066,69067,69131,69132,69134,69135,69199,69200,69202,69203,69267,69268,69270,69271,69335,69336,69338,69339,69403,69404,69406,69407,69471,69472,69474,69475,69539,69540,69542,69543,69607,69608,69611,69612,69677,69678,69680,69681,69744,69746,69748,69749,69911,69912,69926,69927,70409,70410,70411,70412,73583,73584,78210,78211,78267,78268,78293,78294,78358,78359,78509,78510,78589,78590,78614,78615,78685,78686,78753,78754,78785,78786,78878,78879,78951,78952,78976,78977,79063,79064,79103,79104,79106,79107,79139,79140,79361,79362,79478,79479,79550,79551,79607,79608,79749,79750,79751,79752,79862,79863,79928,79929,79953,79954,80002,80003,80073,80074,80156,80157,80431,80432,80435,80436,80440,80441,80526,80528,80584,80585,80875,80879,80887,80889,80897,80904,80918,80919,81080,81091,81099,81100,81101,81102,81193,81195,81201,81203,81238,81264,82933,98306,98393,163842,163929,229378,229465,294914,295001,327702,327703,358278,359498,365197,365281,365282") && 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"), "4,0,8192,16384,1108665") == "54c3c3a02c82d5184e97dfe5043960753efe6ad1" || 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
ifelse (block_image_recover(map_partition("product"), "4,0,8192,16384,1108665") && 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"), "12,1,14,40,42,52,53,333,334,338,347,363,364") == "1f77ca253cef37a9e0674464bef0194b97bdb2b9" || 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
ifelse (block_image_recover(map_partition("odm"), "12,1,14,40,42,52,53,333,334,338,347,363,364") && 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;
if (range_sha1(map_partition("system_ext"), "12,0,8192,32768,65536,73728,81920,98304,106496,114688,122880,131072,196996") == "c78f9436f8112493d8db634f767b9230971f8585" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "12,0,8192,32768,65536,73728,81920,98304,106496,114688,122880,131072,196996") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;
if (range_sha1(map_partition("mi_ext"), "2,0,69") == "b4f3cb0390da0426bcc61d6c7d025fc3604edfce" || block_image_verify(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat")) then
ui_print("Verified mi_ext image...");
else
ifelse (block_image_recover(map_partition("mi_ext"), "2,0,69") && block_image_verify(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat"), ui_print("mi_ext recovered successfully."), abort("E2004: mi_ext 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/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib.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/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/km41.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
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/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
package_extract_file("firmware-update/km41.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# Patch partition system

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

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

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
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.");
show_progress(0.100000, 0);
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.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# Patch partition mi_ext

ui_print("Patching mi_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("mi_ext"), package_extract_file("mi_ext.transfer.list"), "mi_ext.new.dat", "mi_ext.patch.dat") ||
  abort("E2001: Failed to update mi_ext image.");

# --- End patching dynamic partitions ---

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

# ---- 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");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
set_progress(1.000000);
