getprop("ro.product.device") == "surya" || abort("E3004: This package is for \"surya\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/surya_id/surya:12/RKQ1.211019.001/V14.0.1.0.SJGIDXM:user/release-keys");
ui_print("Target: POCO/surya_id/surya:12/RKQ1.211019.001/V14.0.2.0.SJGIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/surya_id/surya:12/RKQ1.211019.001/V14.0.1.0.SJGIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/surya_id/surya:12/RKQ1.211019.001/V14.0.2.0.SJGIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/surya_id/surya:12/RKQ1.211019.001/V14.0.1.0.SJGIDXM:user/release-keys or POCO/surya_id/surya:12/RKQ1.211019.001/V14.0.2.0.SJGIDXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d10ba1dcc79b560f80102c5bc3d88eb430917a7b"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:00510f638e6ca450c0e6f07511e728c1730b24c6")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:d10ba1dcc79b560f80102c5bc3d88eb430917a7b"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:00510f638e6ca450c0e6f07511e728c1730b24c6"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "34,1,31,44,58,114,115,659,660,9712,22800,23600,310860,310862,310868,314362,314363,314364,314370,318259,318267,318279,318280,318373,343333,343895,688137,688143,720897,720911,741151,743390,755170,755329,755330") == "fefb24c36f7980aa46c9fa8fa29b4c4fda441028" || 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"), "34,1,31,44,58,114,115,659,660,9712,22800,23600,310860,310862,310868,314362,314363,314364,314370,318259,318267,318279,318280,318373,343333,343895,688137,688143,720897,720911,741151,743390,755170,755329,755330") && 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"), "424,1,38,49,50,130,135,141,142,147,148,211,212,217,218,223,224,229,230,233,234,1001,1002,3455,3456,12376,12377,12381,12382,13341,13343,13347,13349,13371,13372,13373,13374,13377,13378,13383,13384,13385,13386,13389,13390,13391,13392,13397,13398,13402,13403,13407,13408,13412,13413,13417,13418,13422,13424,13425,13426,13428,13430,13431,13432,13435,13436,13437,13438,13441,13442,13443,13444,13447,13448,13449,13450,13453,13454,13455,13456,13459,13460,13461,13462,13467,13468,13471,13473,13477,13478,13481,13483,13488,13489,13493,13494,13495,13496,13499,13500,13501,13502,13505,13506,13507,13508,13512,13513,13514,13515,13518,13519,13520,13521,13524,13525,13526,13527,13530,13531,13538,13539,13543,13544,13548,13549,13909,13910,14138,14139,14814,14820,16185,16186,21076,21077,22635,22636,22638,22640,22704,22705,22775,22776,22843,22844,22846,22847,22849,22850,22909,22911,22913,22914,22978,22979,23049,23050,23117,23118,23120,23121,23123,23132,23133,23134,23196,23197,23263,23264,23266,23267,23270,23274,23276,23277,23279,23281,23283,23284,23343,23344,23346,23348,23408,23409,23411,23412,23473,23474,23476,23477,23537,23538,23540,23541,23608,23609,23677,23678,23745,23746,23812,23813,23815,23816,23879,23880,23946,23947,23949,23950,24011,24012,24014,24015,24079,24080,24082,24083,24145,24146,24148,24149,24213,24214,24216,24217,24278,24279,24281,24282,24346,24347,24349,24350,24414,24415,24417,24418,24482,24483,24485,24486,24550,24551,24553,24554,24621,24622,24623,24624,24690,24691,24692,24693,24698,24699,24759,24760,24826,24827,24829,24830,24893,24894,24960,24961,24963,24964,25025,25026,25028,25029,25093,25094,25096,25097,25159,25160,25162,25163,25227,25228,25230,25231,25292,25293,25295,25296,25360,25361,25363,25364,25428,25429,25431,25432,25496,25497,25499,25500,25564,25565,25567,25568,25635,25636,25637,25638,25704,25705,25706,25707,25712,25714,25774,25775,25847,25848,25850,25851,25913,25914,25984,25985,25993,25997,25998,25999,26198,26199,26265,26266,26268,26269,26272,26277,28209,28210,28274,28275,28425,28426,28505,28506,28530,28531,28601,28602,28669,28670,28701,28702,28794,28795,28867,28868,28892,28893,28979,28980,29019,29020,29022,29023,29055,29056,29277,29278,29394,29395,29466,29467,29523,29524,29665,29666,29667,29668,29778,29779,29844,29845,29875,29876,29924,29925,29995,29996,30078,30079,30333,30334,30392,30393,30696,30702,30707,30714,30826,30835,30843,30844,30845,30846,30877,30879,30885,30887,30939,30940,30992,30993,31367,31368,31653,229403,229407,257666,258450,262548,262615,262616") == "3412be4db9515c6cb084a4e35169282447c2b387" || 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"), "424,1,38,49,50,130,135,141,142,147,148,211,212,217,218,223,224,229,230,233,234,1001,1002,3455,3456,12376,12377,12381,12382,13341,13343,13347,13349,13371,13372,13373,13374,13377,13378,13383,13384,13385,13386,13389,13390,13391,13392,13397,13398,13402,13403,13407,13408,13412,13413,13417,13418,13422,13424,13425,13426,13428,13430,13431,13432,13435,13436,13437,13438,13441,13442,13443,13444,13447,13448,13449,13450,13453,13454,13455,13456,13459,13460,13461,13462,13467,13468,13471,13473,13477,13478,13481,13483,13488,13489,13493,13494,13495,13496,13499,13500,13501,13502,13505,13506,13507,13508,13512,13513,13514,13515,13518,13519,13520,13521,13524,13525,13526,13527,13530,13531,13538,13539,13543,13544,13548,13549,13909,13910,14138,14139,14814,14820,16185,16186,21076,21077,22635,22636,22638,22640,22704,22705,22775,22776,22843,22844,22846,22847,22849,22850,22909,22911,22913,22914,22978,22979,23049,23050,23117,23118,23120,23121,23123,23132,23133,23134,23196,23197,23263,23264,23266,23267,23270,23274,23276,23277,23279,23281,23283,23284,23343,23344,23346,23348,23408,23409,23411,23412,23473,23474,23476,23477,23537,23538,23540,23541,23608,23609,23677,23678,23745,23746,23812,23813,23815,23816,23879,23880,23946,23947,23949,23950,24011,24012,24014,24015,24079,24080,24082,24083,24145,24146,24148,24149,24213,24214,24216,24217,24278,24279,24281,24282,24346,24347,24349,24350,24414,24415,24417,24418,24482,24483,24485,24486,24550,24551,24553,24554,24621,24622,24623,24624,24690,24691,24692,24693,24698,24699,24759,24760,24826,24827,24829,24830,24893,24894,24960,24961,24963,24964,25025,25026,25028,25029,25093,25094,25096,25097,25159,25160,25162,25163,25227,25228,25230,25231,25292,25293,25295,25296,25360,25361,25363,25364,25428,25429,25431,25432,25496,25497,25499,25500,25564,25565,25567,25568,25635,25636,25637,25638,25704,25705,25706,25707,25712,25714,25774,25775,25847,25848,25850,25851,25913,25914,25984,25985,25993,25997,25998,25999,26198,26199,26265,26266,26268,26269,26272,26277,28209,28210,28274,28275,28425,28426,28505,28506,28530,28531,28601,28602,28669,28670,28701,28702,28794,28795,28867,28868,28892,28893,28979,28980,29019,29020,29022,29023,29055,29056,29277,29278,29394,29395,29466,29467,29523,29524,29665,29666,29667,29668,29778,29779,29844,29845,29875,29876,29924,29925,29995,29996,30078,30079,30333,30334,30392,30393,30696,30702,30707,30714,30826,30835,30843,30844,30845,30846,30877,30879,30885,30887,30939,30940,30992,30993,31367,31368,31653,229403,229407,257666,258450,262548,262615,262616") && 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"), "130,1,15,32,33,7397,7398,7543,7545,8114,8116,8386,8387,8396,8397,9051,9052,9068,9069,18696,18697,27198,27203,27376,27380,29687,29688,30293,30294,30677,30678,30691,30692,32532,32533,32768,32776,44206,44207,51137,51140,51197,51200,51214,51215,51227,51229,51301,51303,51331,51333,51376,51379,51390,51394,51607,51611,51622,51624,52412,52413,61982,61983,65536,65542,69728,69729,70266,70273,70541,70547,71944,71950,73065,73066,73073,73074,73077,73078,73208,73209,73222,73223,74039,74040,83129,83130,89782,89783,90694,90695,94266,94268,98304,98312,108519,108520,108599,108600,111763,111765,131072,131078,134010,134011,134398,134399,135444,135445,143227,143228,144703,144704,150126,150127,154465,154467,154476,154478,154486,154488,154497,154499,155293,294917,294920,307204,308126,313011,313086,313087") == "af697b5b44ca91d29238362381a8969bfd8d3ec9" || 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"), "130,1,15,32,33,7397,7398,7543,7545,8114,8116,8386,8387,8396,8397,9051,9052,9068,9069,18696,18697,27198,27203,27376,27380,29687,29688,30293,30294,30677,30678,30691,30692,32532,32533,32768,32776,44206,44207,51137,51140,51197,51200,51214,51215,51227,51229,51301,51303,51331,51333,51376,51379,51390,51394,51607,51611,51622,51624,52412,52413,61982,61983,65536,65542,69728,69729,70266,70273,70541,70547,71944,71950,73065,73066,73073,73074,73077,73078,73208,73209,73222,73223,74039,74040,83129,83130,89782,89783,90694,90695,94266,94268,98304,98312,108519,108520,108599,108600,111763,111765,131072,131078,134010,134011,134398,134399,135444,135445,143227,143228,144703,144704,150126,150127,154465,154467,154476,154478,154486,154488,154497,154499,155293,294917,294920,307204,308126,313011,313086,313087") && 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("system_ext"), "60,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28507,28508,29696,29699,29706,29707,29945,29946,30012,30013,30209,30210,30214,30215,30220,30221,30660,30661,30673,30674,30680,30681,30693,30694,30705,30706,30711,30712,30718,30719,30732,30733,30745,30746,30774,30775,30793,30794,30924,30925,30946,131084,131088,135662,136069,138230,138271,138272") == "d5cc6a85051f4d5181645633d961b62c9bb91551" || 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"), "60,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28507,28508,29696,29699,29706,29707,29945,29946,30012,30013,30209,30210,30214,30215,30220,30221,30660,30661,30673,30674,30680,30681,30693,30694,30705,30706,30711,30712,30718,30719,30732,30733,30745,30746,30774,30775,30793,30794,30924,30925,30946,131084,131088,135662,136069,138230,138271,138272") && 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;

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
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/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
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/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");

# --- Start patching dynamic partitions ---


# Patch partition system

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

# --- 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:d10ba1dcc79b560f80102c5bc3d88eb430917a7b"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:00510f638e6ca450c0e6f07511e728c1730b24c6"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:00510f638e6ca450c0e6f07511e728c1730b24c6")));

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