getprop("ro.product.device") == "eros-p1" || abort("E3004: This package is for \"eros-p1\" devices; this is a \"" + getprop("ro.product.device") + "\".");
assert_boot_version(0);
ui_print("Source: google/ATV BOX/eros-p1:10/QP1A.191105.004/eng.winner.20241204.132757:user/release-keys");
ui_print("Target: google/ATV BOX/eros-p1:10/QP1A.191105.004/eng.winner.20250403.131624:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "google/ATV BOX/eros-p1:10/QP1A.191105.004/eng.winner.20241204.132757:user/release-keys" ||
    getprop("ro.build.fingerprint") == "google/ATV BOX/eros-p1:10/QP1A.191105.004/eng.winner.20250403.131624:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of google/ATV BOX/eros-p1:10/QP1A.191105.004/eng.winner.20241204.132757:user/release-keys or google/ATV BOX/eros-p1:10/QP1A.191105.004/eng.winner.20250403.131624:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:3cbe787327500d8b1502a1c01a7f9565a9c21e5b",
                      "EMMC:/dev/block/by-name/boot:33554432:b659864436aa03a948be8b49b71e3443b23c363a") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:3cbe787327500d8b1502a1c01a7f9565a9c21e5b\" or \"EMMC:/dev/block/by-name/boot:33554432:b659864436aa03a948be8b49b71e3443b23c363a\" has unexpected contents.");
apply_patch_space(143925248) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "54,1,118,388,400,402,403,509,510,988,989,991,993,994,995,1010,1011,1148,1149,1964,1965,1967,1968,1971,1972,1979,1980,1981,1982,6239,6240,6242,6243,6524,6525,6527,6528,6730,32770,32853,98306,98389,163842,163925,229378,229461,294914,294997,327698,327699,341541,342583,348013,348095,348096") == "71b4721f9a32e4c24e3b59213d7f0debf5f7b0c6" || 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"), "54,1,118,388,400,402,403,509,510,988,989,991,993,994,995,1010,1011,1148,1149,1964,1965,1967,1968,1971,1972,1979,1980,1981,1982,6239,6240,6242,6243,6524,6525,6527,6528,6730,32770,32853,98306,98389,163842,163925,229378,229461,294914,294997,327698,327699,341541,342583,348013,348095,348096") && 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"), "102,1,2,8,69,427,431,438,439,1039,1040,2128,2129,2130,2131,2156,2157,2159,2160,2168,2169,2174,2175,2184,2185,2330,2331,5661,5662,5683,5684,5685,5686,5823,5824,5867,5868,5902,5903,5928,5929,5954,5955,6001,6002,6003,6004,6008,6009,6010,6196,6197,6302,6310,6355,6357,6358,6359,6360,6365,6366,6373,6374,6380,6381,6700,6701,6870,6871,10114,10115,11224,11236,14993,14994,15016,15017,15680,15681,16329,16330,16434,21016,21142,21745,21747,21926,21967,24229,24237,24384,24386,24395,24400,24882,25036,25037,25049,25050,25131,25534,25555,25556") == "55ffd9cb12561d286a3c16555d8192fe4b77cf05" || 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"), "102,1,2,8,69,427,431,438,439,1039,1040,2128,2129,2130,2131,2156,2157,2159,2160,2168,2169,2174,2175,2184,2185,2330,2331,5661,5662,5683,5684,5685,5686,5823,5824,5867,5868,5902,5903,5928,5929,5954,5955,6001,6002,6003,6004,6008,6009,6010,6196,6197,6302,6310,6355,6357,6358,6359,6360,6365,6366,6373,6374,6380,6381,6700,6701,6870,6871,10114,10115,11224,11236,14993,14994,15016,15017,15680,15681,16329,16330,16434,21016,21142,21745,21747,21926,21967,24229,24237,24384,24386,24395,24400,24882,25036,25037,25049,25050,25131,25534,25555,25556") && 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,2,8,28037,28123,28573,28595,28596") == "d65ac060590dcfe5e93672a2ad6c87a098622a6d" || 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"), "8,1,2,8,28037,28123,28573,28595,28596") && 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;

# ---- start making changes here ----


# --- Start patching dynamic partitions ---


# 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 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 system

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

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/by-name/boot:33554432:3cbe787327500d8b1502a1c01a7f9565a9c21e5b",
                "EMMC:/dev/block/by-name/boot:33554432:b659864436aa03a948be8b49b71e3443b23c363a",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:b659864436aa03a948be8b49b71e3443b23c363a");
ui_print("Updating boot-resource.fex into bootloader partition...");
package_extract_file("boot-resource.fex","/dev/block/by-name/bootloader");
ui_print("Updating env.fex into env partition...");
package_extract_file("env.fex","/dev/block/by-name/env");
ui_print("Updating vbmeta.img into vbmeta partition...");
package_extract_file("vbmeta.img","/dev/block/by-name/vbmeta");
ui_print("Updating vbmeta_system.img into vbmeta_system partition...");
package_extract_file("vbmeta_system.img","/dev/block/by-name/vbmeta_system");
ui_print("Updating vbmeta_vendor.img into vbmeta_vendor partition...");
package_extract_file("vbmeta_vendor.img","/dev/block/by-name/vbmeta_vendor");
ui_print("Updating boot...");
burnboot();
set_progress(1.000000);
