getprop("ro.product.device") == "vayu" || abort("E3004: This package is for \"vayu\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/vayu_id/vayu:11/RKQ1.200826.002/V12.5.2.0.RJUIDXM:user/release-keys");
ui_print("Target: Xiaomi/vayu_id/vayu:11/RKQ1.200826.002/V12.5.4.0.RJUIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/vayu_id/vayu:11/RKQ1.200826.002/V12.5.2.0.RJUIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/vayu_id/vayu:11/RKQ1.200826.002/V12.5.4.0.RJUIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/vayu_id/vayu:11/RKQ1.200826.002/V12.5.2.0.RJUIDXM:user/release-keys or Xiaomi/vayu_id/vayu:11/RKQ1.200826.002/V12.5.4.0.RJUIDXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:a8f7fb185dacfaefed074becaa0aeb3e41a77543"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9da070aea450a038983bd8caff023438e58f6595")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:a8f7fb185dacfaefed074becaa0aeb3e41a77543"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9da070aea450a038983bd8caff023438e58f6595"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "1150,1,32,43,53,55,59,87,88,21341,21342,21372,21373,27537,27538,28966,28967,32768,32786,56678,56679,57984,57985,59106,59107,60837,60838,61673,61674,62881,62882,63033,63034,63958,63959,65536,65552,68339,68340,69325,69326,70691,70692,71141,71142,73311,73312,73573,73574,73666,73667,73917,73918,74134,74136,74274,74278,74286,74287,74299,74303,74307,74308,75757,75763,75797,75798,75804,75810,75811,75812,75817,75823,75824,75825,77923,77924,78548,78552,78592,78593,79574,79575,80232,80234,82165,82167,82175,82176,82198,82199,82203,82204,82641,82642,82766,82767,82798,82804,82805,82806,83130,83134,83142,83143,83263,83269,83270,84624,89201,89205,89244,89245,89259,89265,89266,89267,89274,89280,89281,89282,91250,91251,93346,93350,93397,93398,94486,94490,94511,94512,94641,94645,94651,94652,94785,94789,94796,94797,98304,98322,100669,100673,100765,100766,100793,100794,100799,100800,101048,101049,101119,101123,101128,101129,101354,101358,101365,101366,101896,101902,101903,101904,103774,103778,103823,103824,103828,103834,103835,103836,103867,103873,103874,103875,105565,105569,105593,105594,105618,105619,105621,105622,105623,105624,105625,105626,105656,105657,108982,108986,109017,109018,111077,111081,111107,111108,111137,111138,111143,111149,111150,111151,111352,111356,111496,111497,113302,113306,113348,113349,115882,115883,116240,116241,116274,116278,116295,116296,116301,116302,116992,116996,117012,117013,119004,119008,119048,119049,119210,119214,119218,119219,119630,119634,119647,119648,119685,119686,122384,122385,128503,128507,128594,128595,129809,129810,129954,129955,130120,130124,130151,130152,131072,131088,132955,132956,133904,133908,133939,133940,133966,133967,138856,138860,138886,138887,141339,141340,141991,141995,142025,142026,142051,142052,143845,143849,143887,143888,143929,143935,143941,148285,148306,148307,151568,151569,153609,153613,153642,153643,154770,154776,154799,154800,154977,154978,156894,156898,156928,156929,157266,157267,157443,157447,157462,157463,159056,159060,159085,159086,163840,163858,180843,180844,184998,184999,188069,188073,188241,188242,188354,188750,188764,188765,194267,194268,196608,196624,198800,198804,198872,198873,198913,198914,200626,200627,201659,201663,201688,201689,201703,201704,201707,201713,201718,201719,201724,201730,201731,201732,205396,205400,205458,205459,205461,205465,205466,205467,205511,205519,205520,205521,207385,207391,207432,207433,207834,207840,207850,207851,207882,207888,207889,207890,207933,207939,207940,207941,210738,210739,211755,211759,211806,211807,211966,211967,212049,212053,212057,212058,212069,212075,212076,212077,212644,212648,212663,212664,213887,213891,213908,213909,213917,213918,214233,214310,221774,221775,221783,221789,221790,221791,222417,222421,222436,222437,224107,224111,224128,224129,225183,225184,226769,226773,226801,226802,227692,227696,227722,227723,227730,227736,227737,227738,227743,227747,227752,227753,227757,227758,227782,227788,227789,227790,229376,229394,231056,231060,231108,231109,231112,231118,231119,231120,231468,231472,231484,231485,232864,232870,232889,232890,234371,234375,234402,234403,235465,235469,236572,236573,241404,241405,242440,242441,243568,243569,245257,245261,245344,245345,245381,245385,247924,247928,247942,247943,248471,248475,248482,248483,251280,251281,251635,251636,252350,252368,252439,252440,252982,252991,253321,253322,256615,256616,259193,259198,259199,259200,259201,259202,259203,259204,259205,259206,259207,259208,259209,259210,259211,259212,259213,259214,259215,259216,259217,259218,259219,259220,259221,259222,259223,259224,259225,259226,259227,259228,259229,259230,259231,259232,259233,259234,259235,259236,259237,259238,259239,259240,259241,259242,259243,259244,259245,259246,259247,259248,259249,259250,259251,259252,259253,259254,259255,259256,259257,259258,259259,259260,259261,259262,259263,259264,259265,259266,259267,259268,259269,259270,259271,259272,259273,259274,259275,259276,259277,259278,259279,259280,259281,259282,259283,259284,259285,259286,259287,259288,259289,259290,259291,259292,259293,259294,259295,259296,259297,259298,259299,259300,259301,259302,259303,259304,259305,259306,259307,259308,259309,259310,259311,259312,259313,259314,259315,259316,259317,259318,259319,259320,259321,259322,259323,259324,259325,259326,259327,259328,259329,259330,259331,259332,259333,259334,259335,259336,259337,259338,259339,259340,259341,259342,259343,259344,259345,259346,259347,259348,259349,259350,259351,259352,259353,259354,259355,259356,259357,259358,259359,259360,259361,259362,259363,259364,259365,259366,259367,259368,259369,259370,259371,259372,259373,259374,259375,259376,259377,259378,259379,259380,259381,259382,259383,259384,259385,259386,259387,259388,259389,259390,259391,259392,259393,259394,259395,259396,259397,259398,259399,259400,259401,259402,259403,259404,259405,259406,259407,259408,259409,259410,259411,259412,259413,259414,259415,259416,259417,259418,259419,259420,259421,259422,259423,259424,259425,259426,259427,259428,259429,259430,259431,259432,259433,259434,259435,259436,259437,259438,259439,259440,259441,259442,259443,259444,259445,259446,259447,259448,259449,259450,259451,259452,259453,259454,259455,259456,259457,259458,259459,259460,259461,259462,259463,259464,259465,259466,259467,259468,259469,259470,259471,259472,259473,259474,259475,259476,259477,259478,259479,259480,259481,259482,259483,259484,259485,259486,259487,259488,259489,259490,259491,259492,259493,259494,259495,259496,259497,259498,259499,259500,259501,259502,259503,259504,259505,259506,259507,259508,259509,259510,259511,259512,259513,259514,259515,259516,259517,259518,259519,259520,259521,259522,259523,259524,259525,259526,259527,259528,259529,259530,259531,259532,259533,259534,259535,259536,259537,259538,259539,259540,259541,259542,259543,259544,259545,259546,259547,259548,259549,259550,259551,259552,259553,259554,259555,259556,259557,259558,259559,259560,259561,259562,259563,259564,259565,259566,259567,259568,259569,259570,259571,259572,259573,259574,259575,259576,259577,259578,259579,259580,259581,259582,259583,259584,259585,259586,259587,259588,259589,259590,259591,259592,259593,259594,259595,259596,259597,259598,259599,259600,259601,259602,259603,259604,259605,259606,259607,259608,259609,259610,259611,259612,259613,259614,259615,259616,259617,259618,259619,259620,259621,259622,259623,259624,259625,259626,259627,259628,259629,259630,259631,259632,259633,259634,259635,259636,259637,259638,259639,259640,259641,259643,262144,262160,262161,262162,282927,282928,283215,283216,283514,283516,283522,283523,285088,285090,285094,285095,288065,288066,294141,294142,294147,294148,294474,294475,294477,344310,344939,345449,345521,345802,345831,345835,345839,345843,345844,345848,345849,345851,345856,345858,346175,346176,346207,346209,346294,346295,346305,346309,346310,346314,346315,346319,346320,346324,346325,346329,346330,346334,346335,346339,346340,346344,346345,346349,346350,346352,346366,346370,346371,346373,346377,346378,346382,346386,346387,346391,346392,346396,346397,346399,346404,346408,346409,346413,346414,346418,346419,346421,346476,346477,346484,346486,346490,346494,346495,346499,346500,346504,346505,346509,346510,346514,346515,346517,346521,346523,346532,346536,346537,346541,346542,346546,346547,346549,346614,346615,346623,346627,346628,346630,346634,346638,346639,346641,346642,346646,346647,346649,346655,346659,346660,346664,346665,346669,346670,346672,346677,346681,346682,346686,346687,346689,346693,346697,346698,346702,346703,346707,346708,346712,346713,346717,346718,346722,346723,346725,346729,346731,346735,346754,347127,347128,347155,347157,347261,347262,347272,347309,347312,347318,347323,347324,347326,347340,347343,347353,347368,347369,347374,347380,347445,347446,347452,347454,347457,347484,347487,347501,347577,347578,347584,720028,720896,720902,720912,720918,722234,733680,733833,733834") == "69f091a75fd188586ddd3063c3d3133647fe2aa7" || 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"), "1150,1,32,43,53,55,59,87,88,21341,21342,21372,21373,27537,27538,28966,28967,32768,32786,56678,56679,57984,57985,59106,59107,60837,60838,61673,61674,62881,62882,63033,63034,63958,63959,65536,65552,68339,68340,69325,69326,70691,70692,71141,71142,73311,73312,73573,73574,73666,73667,73917,73918,74134,74136,74274,74278,74286,74287,74299,74303,74307,74308,75757,75763,75797,75798,75804,75810,75811,75812,75817,75823,75824,75825,77923,77924,78548,78552,78592,78593,79574,79575,80232,80234,82165,82167,82175,82176,82198,82199,82203,82204,82641,82642,82766,82767,82798,82804,82805,82806,83130,83134,83142,83143,83263,83269,83270,84624,89201,89205,89244,89245,89259,89265,89266,89267,89274,89280,89281,89282,91250,91251,93346,93350,93397,93398,94486,94490,94511,94512,94641,94645,94651,94652,94785,94789,94796,94797,98304,98322,100669,100673,100765,100766,100793,100794,100799,100800,101048,101049,101119,101123,101128,101129,101354,101358,101365,101366,101896,101902,101903,101904,103774,103778,103823,103824,103828,103834,103835,103836,103867,103873,103874,103875,105565,105569,105593,105594,105618,105619,105621,105622,105623,105624,105625,105626,105656,105657,108982,108986,109017,109018,111077,111081,111107,111108,111137,111138,111143,111149,111150,111151,111352,111356,111496,111497,113302,113306,113348,113349,115882,115883,116240,116241,116274,116278,116295,116296,116301,116302,116992,116996,117012,117013,119004,119008,119048,119049,119210,119214,119218,119219,119630,119634,119647,119648,119685,119686,122384,122385,128503,128507,128594,128595,129809,129810,129954,129955,130120,130124,130151,130152,131072,131088,132955,132956,133904,133908,133939,133940,133966,133967,138856,138860,138886,138887,141339,141340,141991,141995,142025,142026,142051,142052,143845,143849,143887,143888,143929,143935,143941,148285,148306,148307,151568,151569,153609,153613,153642,153643,154770,154776,154799,154800,154977,154978,156894,156898,156928,156929,157266,157267,157443,157447,157462,157463,159056,159060,159085,159086,163840,163858,180843,180844,184998,184999,188069,188073,188241,188242,188354,188750,188764,188765,194267,194268,196608,196624,198800,198804,198872,198873,198913,198914,200626,200627,201659,201663,201688,201689,201703,201704,201707,201713,201718,201719,201724,201730,201731,201732,205396,205400,205458,205459,205461,205465,205466,205467,205511,205519,205520,205521,207385,207391,207432,207433,207834,207840,207850,207851,207882,207888,207889,207890,207933,207939,207940,207941,210738,210739,211755,211759,211806,211807,211966,211967,212049,212053,212057,212058,212069,212075,212076,212077,212644,212648,212663,212664,213887,213891,213908,213909,213917,213918,214233,214310,221774,221775,221783,221789,221790,221791,222417,222421,222436,222437,224107,224111,224128,224129,225183,225184,226769,226773,226801,226802,227692,227696,227722,227723,227730,227736,227737,227738,227743,227747,227752,227753,227757,227758,227782,227788,227789,227790,229376,229394,231056,231060,231108,231109,231112,231118,231119,231120,231468,231472,231484,231485,232864,232870,232889,232890,234371,234375,234402,234403,235465,235469,236572,236573,241404,241405,242440,242441,243568,243569,245257,245261,245344,245345,245381,245385,247924,247928,247942,247943,248471,248475,248482,248483,251280,251281,251635,251636,252350,252368,252439,252440,252982,252991,253321,253322,256615,256616,259193,259198,259199,259200,259201,259202,259203,259204,259205,259206,259207,259208,259209,259210,259211,259212,259213,259214,259215,259216,259217,259218,259219,259220,259221,259222,259223,259224,259225,259226,259227,259228,259229,259230,259231,259232,259233,259234,259235,259236,259237,259238,259239,259240,259241,259242,259243,259244,259245,259246,259247,259248,259249,259250,259251,259252,259253,259254,259255,259256,259257,259258,259259,259260,259261,259262,259263,259264,259265,259266,259267,259268,259269,259270,259271,259272,259273,259274,259275,259276,259277,259278,259279,259280,259281,259282,259283,259284,259285,259286,259287,259288,259289,259290,259291,259292,259293,259294,259295,259296,259297,259298,259299,259300,259301,259302,259303,259304,259305,259306,259307,259308,259309,259310,259311,259312,259313,259314,259315,259316,259317,259318,259319,259320,259321,259322,259323,259324,259325,259326,259327,259328,259329,259330,259331,259332,259333,259334,259335,259336,259337,259338,259339,259340,259341,259342,259343,259344,259345,259346,259347,259348,259349,259350,259351,259352,259353,259354,259355,259356,259357,259358,259359,259360,259361,259362,259363,259364,259365,259366,259367,259368,259369,259370,259371,259372,259373,259374,259375,259376,259377,259378,259379,259380,259381,259382,259383,259384,259385,259386,259387,259388,259389,259390,259391,259392,259393,259394,259395,259396,259397,259398,259399,259400,259401,259402,259403,259404,259405,259406,259407,259408,259409,259410,259411,259412,259413,259414,259415,259416,259417,259418,259419,259420,259421,259422,259423,259424,259425,259426,259427,259428,259429,259430,259431,259432,259433,259434,259435,259436,259437,259438,259439,259440,259441,259442,259443,259444,259445,259446,259447,259448,259449,259450,259451,259452,259453,259454,259455,259456,259457,259458,259459,259460,259461,259462,259463,259464,259465,259466,259467,259468,259469,259470,259471,259472,259473,259474,259475,259476,259477,259478,259479,259480,259481,259482,259483,259484,259485,259486,259487,259488,259489,259490,259491,259492,259493,259494,259495,259496,259497,259498,259499,259500,259501,259502,259503,259504,259505,259506,259507,259508,259509,259510,259511,259512,259513,259514,259515,259516,259517,259518,259519,259520,259521,259522,259523,259524,259525,259526,259527,259528,259529,259530,259531,259532,259533,259534,259535,259536,259537,259538,259539,259540,259541,259542,259543,259544,259545,259546,259547,259548,259549,259550,259551,259552,259553,259554,259555,259556,259557,259558,259559,259560,259561,259562,259563,259564,259565,259566,259567,259568,259569,259570,259571,259572,259573,259574,259575,259576,259577,259578,259579,259580,259581,259582,259583,259584,259585,259586,259587,259588,259589,259590,259591,259592,259593,259594,259595,259596,259597,259598,259599,259600,259601,259602,259603,259604,259605,259606,259607,259608,259609,259610,259611,259612,259613,259614,259615,259616,259617,259618,259619,259620,259621,259622,259623,259624,259625,259626,259627,259628,259629,259630,259631,259632,259633,259634,259635,259636,259637,259638,259639,259640,259641,259643,262144,262160,262161,262162,282927,282928,283215,283216,283514,283516,283522,283523,285088,285090,285094,285095,288065,288066,294141,294142,294147,294148,294474,294475,294477,344310,344939,345449,345521,345802,345831,345835,345839,345843,345844,345848,345849,345851,345856,345858,346175,346176,346207,346209,346294,346295,346305,346309,346310,346314,346315,346319,346320,346324,346325,346329,346330,346334,346335,346339,346340,346344,346345,346349,346350,346352,346366,346370,346371,346373,346377,346378,346382,346386,346387,346391,346392,346396,346397,346399,346404,346408,346409,346413,346414,346418,346419,346421,346476,346477,346484,346486,346490,346494,346495,346499,346500,346504,346505,346509,346510,346514,346515,346517,346521,346523,346532,346536,346537,346541,346542,346546,346547,346549,346614,346615,346623,346627,346628,346630,346634,346638,346639,346641,346642,346646,346647,346649,346655,346659,346660,346664,346665,346669,346670,346672,346677,346681,346682,346686,346687,346689,346693,346697,346698,346702,346703,346707,346708,346712,346713,346717,346718,346722,346723,346725,346729,346731,346735,346754,347127,347128,347155,347157,347261,347262,347272,347309,347312,347318,347323,347324,347326,347340,347343,347353,347368,347369,347374,347380,347445,347446,347452,347454,347457,347484,347487,347501,347577,347578,347584,720028,720896,720902,720912,720918,722234,733680,733833,733834") && 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"), "466,1,196,508,515,525,529,534,535,613,621,627,628,872,876,881,882,884,888,890,891,894,898,902,903,906,907,916,920,924,931,944,945,1617,1668,1753,1754,3116,3921,4166,4167,4603,4604,12739,12740,12800,12801,13752,13754,13755,13756,13758,13761,13762,13763,13765,13767,13768,13769,13771,13773,13774,13775,13777,13779,13780,13781,13783,13785,13786,13787,13789,13791,13796,13798,13801,13803,13806,13808,13816,13818,13821,13823,13824,13825,13827,13829,13830,13831,13834,13836,13837,13838,13840,13842,13843,13844,13846,13848,13849,13850,13852,13854,13855,13856,13858,13860,13861,13862,13871,13872,13891,13892,13893,13894,13898,13899,13900,13901,13904,13905,13906,13907,13910,13911,13912,13913,13916,13917,13918,13919,13923,13924,13925,13926,13929,13930,13931,13932,13936,13937,13941,13942,13946,13947,13951,13952,13956,13957,13958,13959,13968,13969,13970,13971,13974,13975,13976,13977,13980,13981,13982,13983,13986,13987,13988,13989,13991,13993,14285,14286,14401,14402,15337,15347,21519,21520,28550,28551,28573,28574,28675,28676,28677,28678,29176,29178,29183,29185,29191,29193,29198,29200,29259,29261,29481,29482,30712,30714,30760,30761,30844,30845,30846,30847,30911,30912,31276,31278,31771,31772,31837,31838,32768,32771,53587,53588,53592,53594,53611,53612,53647,53648,53657,53658,53660,53661,53711,53712,53715,53716,53722,53728,53767,53768,53978,53979,54004,54005,54037,54038,54145,54146,54180,54181,54320,54321,54334,54335,54444,54445,54447,54449,54451,54452,54511,54512,54514,54515,54575,54576,54578,54579,54640,54641,54643,54644,54708,54709,54711,54712,54776,54777,54779,54780,54843,54844,54910,54911,54913,54914,54978,54979,55047,55048,55050,55051,55112,55113,55115,55116,55180,55181,55183,55184,55245,55246,55248,55249,55313,55314,55317,55318,55379,55380,55382,55383,55447,55448,55450,55451,55515,55516,55518,55519,55583,55584,55586,55587,55651,55652,55654,55655,55722,55723,55724,55725,55791,55792,55793,55794,55799,55800,55803,55804,55864,55865,55867,55868,55931,55932,55998,55999,56001,56002,56066,56067,56135,56136,56138,56139,56200,56201,56203,56204,56268,56269,56271,56272,56333,56334,56336,56337,56401,56402,56405,56406,56467,56468,56470,56471,56535,56536,56538,56539,56603,56604,56606,56607,56671,56672,56674,56675,56739,56740,56742,56743,56810,56811,56812,56813,56879,56880,56881,56882,57045,57046,57057,57058,57521,57523,57569,57570,57685,57686,61234,61235,64230,64231,64322,64323,64324,64325,64369,64370,64794,64795,64851,64852,65191,65193,65194,65196,65197,65199,65207,65209,65210,65211,65221,65222,65223,65224,65226,65230,65359,65369,65536,65537,66107,66108,66180,66181,66185,98307,98812,131073,131578,163843,164348,196609,197114,229379,229884,262145,262650,294915,295420,327681,328186,345144,360448,360449,386991,393125,393215,393216") == "e032e802bf3165394ebd1375cc62bc977a305f1a" || 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"), "466,1,196,508,515,525,529,534,535,613,621,627,628,872,876,881,882,884,888,890,891,894,898,902,903,906,907,916,920,924,931,944,945,1617,1668,1753,1754,3116,3921,4166,4167,4603,4604,12739,12740,12800,12801,13752,13754,13755,13756,13758,13761,13762,13763,13765,13767,13768,13769,13771,13773,13774,13775,13777,13779,13780,13781,13783,13785,13786,13787,13789,13791,13796,13798,13801,13803,13806,13808,13816,13818,13821,13823,13824,13825,13827,13829,13830,13831,13834,13836,13837,13838,13840,13842,13843,13844,13846,13848,13849,13850,13852,13854,13855,13856,13858,13860,13861,13862,13871,13872,13891,13892,13893,13894,13898,13899,13900,13901,13904,13905,13906,13907,13910,13911,13912,13913,13916,13917,13918,13919,13923,13924,13925,13926,13929,13930,13931,13932,13936,13937,13941,13942,13946,13947,13951,13952,13956,13957,13958,13959,13968,13969,13970,13971,13974,13975,13976,13977,13980,13981,13982,13983,13986,13987,13988,13989,13991,13993,14285,14286,14401,14402,15337,15347,21519,21520,28550,28551,28573,28574,28675,28676,28677,28678,29176,29178,29183,29185,29191,29193,29198,29200,29259,29261,29481,29482,30712,30714,30760,30761,30844,30845,30846,30847,30911,30912,31276,31278,31771,31772,31837,31838,32768,32771,53587,53588,53592,53594,53611,53612,53647,53648,53657,53658,53660,53661,53711,53712,53715,53716,53722,53728,53767,53768,53978,53979,54004,54005,54037,54038,54145,54146,54180,54181,54320,54321,54334,54335,54444,54445,54447,54449,54451,54452,54511,54512,54514,54515,54575,54576,54578,54579,54640,54641,54643,54644,54708,54709,54711,54712,54776,54777,54779,54780,54843,54844,54910,54911,54913,54914,54978,54979,55047,55048,55050,55051,55112,55113,55115,55116,55180,55181,55183,55184,55245,55246,55248,55249,55313,55314,55317,55318,55379,55380,55382,55383,55447,55448,55450,55451,55515,55516,55518,55519,55583,55584,55586,55587,55651,55652,55654,55655,55722,55723,55724,55725,55791,55792,55793,55794,55799,55800,55803,55804,55864,55865,55867,55868,55931,55932,55998,55999,56001,56002,56066,56067,56135,56136,56138,56139,56200,56201,56203,56204,56268,56269,56271,56272,56333,56334,56336,56337,56401,56402,56405,56406,56467,56468,56470,56471,56535,56536,56538,56539,56603,56604,56606,56607,56671,56672,56674,56675,56739,56740,56742,56743,56810,56811,56812,56813,56879,56880,56881,56882,57045,57046,57057,57058,57521,57523,57569,57570,57685,57686,61234,61235,64230,64231,64322,64323,64324,64325,64369,64370,64794,64795,64851,64852,65191,65193,65194,65196,65197,65199,65207,65209,65210,65211,65221,65222,65223,65224,65226,65230,65359,65369,65536,65537,66107,66108,66180,66181,66185,98307,98812,131073,131578,163843,164348,196609,197114,229379,229884,262145,262650,294915,295420,327681,328186,345144,360448,360449,386991,393125,393215,393216") && 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"), "348,1,15,3973,3974,4140,4141,6003,6007,6105,6106,8739,8742,8750,8751,8791,8792,16704,16705,23736,23740,23757,23760,24212,24216,25558,25559,26234,26238,27204,27205,27567,27571,28090,28091,28103,28107,28111,28112,29952,29956,29998,29999,31389,31390,32768,32776,39153,39154,40263,40264,49169,49170,53349,53352,54256,54258,57131,57132,65536,65542,66979,66980,76524,76531,78006,78007,78012,78013,78141,78147,78148,78149,78161,78167,78168,78169,81232,81234,94047,94048,94115,94116,96181,96183,98304,98312,111679,111680,111728,111729,112268,112269,114128,114129,118949,118950,118954,118955,118958,118959,122004,122005,127405,127406,131072,131078,131318,131319,131328,131329,131338,131339,131503,131505,132196,132197,132204,132205,132211,132212,136549,136550,136775,136777,136787,136789,136835,136837,136847,136849,136858,136859,138677,138678,138681,138684,140347,140348,140777,140778,147202,147203,149806,149807,157152,157153,160205,160206,160328,160329,160335,160336,160786,160787,163840,163848,164180,164181,168657,168658,170348,170349,170355,170357,173096,173097,184123,184127,185934,185935,186509,186513,187533,187534,190771,190772,193341,193342,193345,193346,196437,196438,196608,196614,199116,199117,199280,199281,199282,199283,199285,199286,199300,199301,199304,199306,199307,199309,199327,199328,199339,199340,199378,199382,199386,199390,199391,199403,199818,199819,200190,200191,201676,201677,201766,201768,201770,201771,201773,201774,201776,201777,201779,201780,201782,201783,201785,201786,201796,201797,201801,201802,201807,201808,201813,201814,201818,201819,201824,201825,201852,201853,201873,201874,201880,201881,201901,201902,201918,201919,202630,202632,209830,209833,211782,211783,213639,213640,215720,215721,217645,217647,219364,219365,219380,219381,220438,220439,229310,229312,229376,229413,229414,229415,231762,231765,231813,231814,232069,232071,232458,232460,233856,233858,234063,234067,234072,234073,234216,234218,235619,235621,235665,238387,241565,241566,245818,245820,245832,245833,245885,245887,246047,246050,246061,246063,246075,246077,246115,246116,247612,247614,248659,248660,249150,249152,260011,260012,262144,262177,284079,284080,284101,284102,284617,284618,284788,284789,285029,285030,285768,285769,286315,286316,287472,287474,288619,288620,291196,291199,294533,294534,294912,294920,301888,306674,306748,306749") == "cf77c14440b04e3a37b23d23269234223777e95a" || 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"), "348,1,15,3973,3974,4140,4141,6003,6007,6105,6106,8739,8742,8750,8751,8791,8792,16704,16705,23736,23740,23757,23760,24212,24216,25558,25559,26234,26238,27204,27205,27567,27571,28090,28091,28103,28107,28111,28112,29952,29956,29998,29999,31389,31390,32768,32776,39153,39154,40263,40264,49169,49170,53349,53352,54256,54258,57131,57132,65536,65542,66979,66980,76524,76531,78006,78007,78012,78013,78141,78147,78148,78149,78161,78167,78168,78169,81232,81234,94047,94048,94115,94116,96181,96183,98304,98312,111679,111680,111728,111729,112268,112269,114128,114129,118949,118950,118954,118955,118958,118959,122004,122005,127405,127406,131072,131078,131318,131319,131328,131329,131338,131339,131503,131505,132196,132197,132204,132205,132211,132212,136549,136550,136775,136777,136787,136789,136835,136837,136847,136849,136858,136859,138677,138678,138681,138684,140347,140348,140777,140778,147202,147203,149806,149807,157152,157153,160205,160206,160328,160329,160335,160336,160786,160787,163840,163848,164180,164181,168657,168658,170348,170349,170355,170357,173096,173097,184123,184127,185934,185935,186509,186513,187533,187534,190771,190772,193341,193342,193345,193346,196437,196438,196608,196614,199116,199117,199280,199281,199282,199283,199285,199286,199300,199301,199304,199306,199307,199309,199327,199328,199339,199340,199378,199382,199386,199390,199391,199403,199818,199819,200190,200191,201676,201677,201766,201768,201770,201771,201773,201774,201776,201777,201779,201780,201782,201783,201785,201786,201796,201797,201801,201802,201807,201808,201813,201814,201818,201819,201824,201825,201852,201853,201873,201874,201880,201881,201901,201902,201918,201919,202630,202632,209830,209833,211782,211783,213639,213640,215720,215721,217645,217647,219364,219365,219380,219381,220438,220439,229310,229312,229376,229413,229414,229415,231762,231765,231813,231814,232069,232071,232458,232460,233856,233858,234063,234067,234072,234073,234216,234218,235619,235621,235665,238387,241565,241566,245818,245820,245832,245833,245885,245887,246047,246050,246061,246063,246075,246077,246115,246116,247612,247614,248659,248660,249150,249152,260011,260012,262144,262177,284079,284080,284101,284102,284617,284618,284788,284789,285029,285030,285768,285769,286315,286316,287472,287474,288619,288620,291196,291199,294533,294534,294912,294920,301888,306674,306748,306749") && 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"), "14,1,13,14,17,25,27,34,255,257,258,262,271,287,288") == "ec51a391e6e7747336595504d79aa30246a42fd3" || 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"), "14,1,13,14,17,25,27,34,255,257,258,262,271,287,288") && 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"), "266,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,150,234,240,244,245,251,257,258,259,487,491,500,501,531,537,538,539,733,737,741,742,745,749,754,755,758,759,765,771,772,773,795,801,802,803,1538,1542,1560,1561,1565,1571,1572,1573,1575,1576,1587,1593,1594,1595,1605,1606,1611,1615,1619,1620,1624,1630,1634,1635,1642,1648,1649,1650,1662,1668,1669,1670,1672,1679,1685,1692,1697,1704,1734,1741,1760,1767,1785,1790,1807,1814,1830,1831,1899,1918,2040,2042,2052,2053,2065,2066,2067,2068,2069,2070,2079,2080,2103,2104,2150,2155,2158,2161,2164,2167,2170,2172,2176,2177,2181,2184,2668,2670,2674,2678,2683,2685,2690,2694,2695,2699,2700,2704,2705,2709,2710,2714,2715,2719,2720,2724,2725,2727,2734,2738,2739,2743,2744,2748,2749,2753,2754,2758,2759,2763,2764,2768,2769,2771,2772,2776,2777,2781,2782,2786,2787,2791,2792,2796,2797,2801,2802,2806,2807,2809,2813,2817,2818,2820,2821,2823,2824,2828,2829,2833,2834,2836,2837,2841,2842,2846,2847,2851,2852,2856,2857,2859,2860,2864,2865,2867,2871,2884,2889,2919,2922,3029,5432,5433,5567,6245,6498,6499,8218,8603,8623,8624,9164,9165,9215,9216,9525,9526,14707,14708,14780,14781,14789,14790,14851,14852,14925,14926,14930,14931,14984,14985,14995,14996,15029,15030,15049,15050,15102,15103,15248,15249,15324,15325,15471,15472,21409,98324,98327,102418,102726,104358,104393,104394") == "6c4b15c56012e0a0fd903f9f7fe8941fffa4e52d" || 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"), "266,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,150,234,240,244,245,251,257,258,259,487,491,500,501,531,537,538,539,733,737,741,742,745,749,754,755,758,759,765,771,772,773,795,801,802,803,1538,1542,1560,1561,1565,1571,1572,1573,1575,1576,1587,1593,1594,1595,1605,1606,1611,1615,1619,1620,1624,1630,1634,1635,1642,1648,1649,1650,1662,1668,1669,1670,1672,1679,1685,1692,1697,1704,1734,1741,1760,1767,1785,1790,1807,1814,1830,1831,1899,1918,2040,2042,2052,2053,2065,2066,2067,2068,2069,2070,2079,2080,2103,2104,2150,2155,2158,2161,2164,2167,2170,2172,2176,2177,2181,2184,2668,2670,2674,2678,2683,2685,2690,2694,2695,2699,2700,2704,2705,2709,2710,2714,2715,2719,2720,2724,2725,2727,2734,2738,2739,2743,2744,2748,2749,2753,2754,2758,2759,2763,2764,2768,2769,2771,2772,2776,2777,2781,2782,2786,2787,2791,2792,2796,2797,2801,2802,2806,2807,2809,2813,2817,2818,2820,2821,2823,2824,2828,2829,2833,2834,2836,2837,2841,2842,2846,2847,2851,2852,2856,2857,2859,2860,2864,2865,2867,2871,2884,2889,2919,2922,3029,5432,5433,5567,6245,6498,6499,8218,8603,8623,8624,9164,9165,9215,9216,9525,9526,14707,14708,14780,14781,14789,14790,14851,14852,14925,14926,14930,14931,14984,14985,14995,14996,15029,15030,15049,15050,15102,15103,15248,15249,15324,15325,15471,15472,21409,98324,98327,102418,102726,104358,104393,104394") && 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/km41.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/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/km41.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition system

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

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

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

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