getprop("ro.product.device") == "polaris" || abort("E3004: This package is for \"polaris\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/polaris/polaris:8.0.0/OPR1.170623.032/8.8.2:user/release-keys");
ui_print("Target: Xiaomi/polaris/polaris:8.0.0/OPR1.170623.032/8.8.4:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/polaris/polaris:8.0.0/OPR1.170623.032/8.8.2:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/polaris/polaris:8.0.0/OPR1.170623.032/8.8.4:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/polaris/polaris:8.0.0/OPR1.170623.032/8.8.2:user/release-keys or Xiaomi/polaris/polaris:8.0.0/OPR1.170623.032/8.8.4:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:35931466:59ae1441926f0d1d87554a1dae546de8caea147e:35935562:fc510f6e6aebf168d2e3d81f41e6dbb04eaf48c2") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:35931466:59ae1441926f0d1d87554a1dae546de8caea147e:35935562:fc510f6e6aebf168d2e3d81f41e6dbb04eaf48c2\" has unexpected contents.");
apply_patch_space(110002176) || 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", "236,1,192,193,489,31580,31582,31619,31952,32148,32150,32248,32249,32294,32298,32365,32369,32371,32375,32403,32405,32413,32417,32441,32442,32445,32449,32458,32767,32768,32770,32961,32962,33468,65534,65536,65537,70837,71344,71611,98302,98304,98306,98497,98498,115774,115776,123316,124700,124820,124822,130734,130736,130793,131071,131072,131073,163840,163842,164033,164034,172320,196607,196608,196609,197115,197150,229376,229378,229569,229570,230076,262143,262144,262145,262651,262680,294912,294914,295105,295106,296880,296882,297152,298917,313707,314385,314489,327679,327680,327681,328187,360446,360448,360449,360955,393214,393216,393217,393723,425982,425984,425985,426491,458750,458752,458753,459259,491518,491520,491521,492027,519248,524288,524289,524795,557054,557056,557057,557563,589822,589824,589825,590331,622590,622592,622593,623099,655358,655360,655361,655867,688126,688128,688129,688635,718727,720244,720894,720896,720897,721403,753662,753664,753665,754171,754172,766267,766272,766275,766279,766417,766418,766422,766426,766436,766437,766459,766474,766478,766482,766501,766502,766504,766508,766536,766537,766546,766550,766964,766965,766973,766977,766985,766986,767167,768235,768237,768241,768250,768251,768256,768260,768264,770095,770123,770129,770164,770165,771165,771169,771219,771561,771563,771567,771581,771582,771595,771599,771617,771618,771631,771635,771645,771646,771665,771669,771681,771682,771763,771767,771782,773303,773306,773310,773320,773321,773324,773328,773337,773338,773915,773919,774114,774115,774117,774121,774124,774128,774136,774139,774149,774154,774155,780254,780261,786432") == "a85238baaa684faa5eca6e8ffd0357e83294c04f" || 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", "236,1,192,193,489,31580,31582,31619,31952,32148,32150,32248,32249,32294,32298,32365,32369,32371,32375,32403,32405,32413,32417,32441,32442,32445,32449,32458,32767,32768,32770,32961,32962,33468,65534,65536,65537,70837,71344,71611,98302,98304,98306,98497,98498,115774,115776,123316,124700,124820,124822,130734,130736,130793,131071,131072,131073,163840,163842,164033,164034,172320,196607,196608,196609,197115,197150,229376,229378,229569,229570,230076,262143,262144,262145,262651,262680,294912,294914,295105,295106,296880,296882,297152,298917,313707,314385,314489,327679,327680,327681,328187,360446,360448,360449,360955,393214,393216,393217,393723,425982,425984,425985,426491,458750,458752,458753,459259,491518,491520,491521,492027,519248,524288,524289,524795,557054,557056,557057,557563,589822,589824,589825,590331,622590,622592,622593,623099,655358,655360,655361,655867,688126,688128,688129,688635,718727,720244,720894,720896,720897,721403,753662,753664,753665,754171,754172,766267,766272,766275,766279,766417,766418,766422,766426,766436,766437,766459,766474,766478,766482,766501,766502,766504,766508,766536,766537,766546,766550,766964,766965,766973,766977,766985,766986,767167,768235,768237,768241,768250,768251,768256,768260,768264,770095,770123,770129,770164,770165,771165,771169,771219,771561,771563,771567,771581,771582,771595,771599,771617,771618,771631,771635,771645,771646,771665,771669,771681,771682,771763,771767,771782,773303,773306,773310,773320,773321,773324,773328,773337,773338,773915,773919,774114,774115,774117,774121,774124,774128,774136,774139,774149,774154,774155,780254,780261,786432") && 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", "184,1,64,65,186,6279,6294,10870,10899,10929,10949,10955,10964,10969,11002,11072,11086,11280,11288,11425,11433,17188,17190,18787,18788,19357,20104,20307,20342,32765,32766,32768,32770,32833,32834,65536,65537,67026,67089,68519,98302,98304,98306,98369,98370,130965,130972,131069,131070,131072,131073,163840,163842,163905,163906,180183,180244,180531,180536,180678,196606,196608,196609,197114,200341,206241,211860,229376,229378,229441,229442,229947,229948,233978,233983,233989,236479,237428,237429,237434,237831,237836,237837,238195,238196,238402,238403,238408,238409,238460,238461,238489,238490,238492,238493,238496,238498,238616,238617,238850,238894,239129,239130,239172,239173,239189,239190,239324,239325,239354,239358,240079,240080,240128,240129,240167,240168,241085,241086,241105,241106,241120,241121,241420,241421,245305,245306,245801,245802,245830,245831,245833,245834,245855,245857,246257,246258,246290,246291,247252,247255,247273,247274,247295,247296,247314,247315,247369,247370,247823,247824,247849,247850,247946,247947,248061,248062,248071,248072,249200,249201,250927,250928,251107,251109,257245,257246,257248,257249,257664,257666,257805,257806,257817,257818,257955,257958,257980,257997,258037,258043,258044,260078,260085,262144") == "06621c9e172dd7a02693f8161140931f2bb1a6e0" || 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", "184,1,64,65,186,6279,6294,10870,10899,10929,10949,10955,10964,10969,11002,11072,11086,11280,11288,11425,11433,17188,17190,18787,18788,19357,20104,20307,20342,32765,32766,32768,32770,32833,32834,65536,65537,67026,67089,68519,98302,98304,98306,98369,98370,130965,130972,131069,131070,131072,131073,163840,163842,163905,163906,180183,180244,180531,180536,180678,196606,196608,196609,197114,200341,206241,211860,229376,229378,229441,229442,229947,229948,233978,233983,233989,236479,237428,237429,237434,237831,237836,237837,238195,238196,238402,238403,238408,238409,238460,238461,238489,238490,238492,238493,238496,238498,238616,238617,238850,238894,239129,239130,239172,239173,239189,239190,239324,239325,239354,239358,240079,240080,240128,240129,240167,240168,241085,241086,241105,241106,241120,241121,241420,241421,245305,245306,245801,245802,245830,245831,245833,245834,245855,245857,246257,246258,246290,246291,247252,247255,247273,247274,247295,247296,247314,247315,247369,247370,247823,247824,247849,247850,247946,247947,248061,248062,248071,248072,249200,249201,250927,250928,251107,251109,257245,257246,257248,257249,257664,257666,257805,257806,257817,257818,257955,257958,257980,257997,258037,258043,258044,260078,260085,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);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:35931466:59ae1441926f0d1d87554a1dae546de8caea147e:35935562:fc510f6e6aebf168d2e3d81f41e6dbb04eaf48c2",
            "-", fc510f6e6aebf168d2e3d81f41e6dbb04eaf48c2, 35935562,
            59ae1441926f0d1d87554a1dae546de8caea147e, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_a");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_a");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_a");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_a");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_a");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_a");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_a");
package_extract_file("firmware-update/bluetooth.img", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_a");
package_extract_file("firmware-update/modem.img", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_a");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_a");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_a");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_a");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_b");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_b");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_b");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_b");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_b");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_b");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_b");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_b");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_b");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_b");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_b");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_b");
show_progress(0.600000, 400);
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);
