prebid.js 7.10.0 → 7.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (366) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +16 -10
  2. package/.github/codeql/codeql-config.yml +4 -0
  3. package/.github/workflows/codeql-analysis.yml +73 -0
  4. package/.github/workflows/issue_tracker.yml +1 -1
  5. package/README.md +0 -2
  6. package/babelConfig.js +10 -4
  7. package/dist/33acrossBidAdapter.js +1 -1
  8. package/dist/acuityAdsBidAdapter.js +1 -0
  9. package/dist/adagioBidAdapter.js +1 -1
  10. package/dist/adbookpspBidAdapter.js +1 -1
  11. package/dist/adgenerationBidAdapter.js +1 -1
  12. package/dist/adkernelBidAdapter.js +1 -1
  13. package/dist/adrelevantisBidAdapter.js +1 -1
  14. package/dist/adriverBidAdapter.js +1 -1
  15. package/dist/adriverIdSystem.js +1 -1
  16. package/dist/adtelligentBidAdapter.js +1 -1
  17. package/dist/adtrgtmeBidAdapter.js +1 -0
  18. package/dist/adxcgBidAdapter.js +1 -1
  19. package/dist/adyoulikeBidAdapter.js +1 -1
  20. package/dist/ajaBidAdapter.js +1 -1
  21. package/dist/alkimiBidAdapter.js +1 -1
  22. package/dist/amxBidAdapter.js +1 -1
  23. package/dist/amxIdSystem.js +1 -1
  24. package/dist/aniviewBidAdapter.js +1 -1
  25. package/dist/aolBidAdapter.js +1 -1
  26. package/dist/appierAnalyticsAdapter.js +1 -1
  27. package/dist/appnexusBidAdapter.js +1 -1
  28. package/dist/asoBidAdapter.js +1 -1
  29. package/dist/audiencerunBidAdapter.js +1 -1
  30. package/dist/axonixBidAdapter.js +1 -1
  31. package/dist/beopBidAdapter.js +1 -1
  32. package/dist/betweenBidAdapter.js +1 -1
  33. package/dist/bidglassBidAdapter.js +1 -1
  34. package/dist/bidwatchAnalyticsAdapter.js +1 -1
  35. package/dist/big-richmediaBidAdapter.js +1 -1
  36. package/dist/bluebillywigBidAdapter.js +1 -1
  37. package/dist/brandmetricsRtdProvider.js +1 -1
  38. package/dist/bridgewellBidAdapter.js +1 -1
  39. package/dist/brightMountainMediaBidAdapter.js +1 -1
  40. package/dist/browsiRtdProvider.js +1 -1
  41. package/dist/cleanioRtdProvider.js +1 -1
  42. package/dist/concertBidAdapter.js +1 -1
  43. package/dist/connectadBidAdapter.js +1 -1
  44. package/dist/consentManagement.js +1 -1
  45. package/dist/consentManagementUsp.js +1 -1
  46. package/dist/consumableBidAdapter.js +1 -1
  47. package/dist/conversantBidAdapter.js +1 -1
  48. package/dist/cpmstarBidAdapter.js +1 -1
  49. package/dist/craftBidAdapter.js +1 -1
  50. package/dist/criteoBidAdapter.js +1 -1
  51. package/dist/currency.js +1 -1
  52. package/dist/datawrkzBidAdapter.js +1 -0
  53. package/dist/debugging-standalone.js +1 -1
  54. package/dist/dfpAdServerVideo.js +1 -1
  55. package/dist/dgkeywordRtdProvider.js +1 -1
  56. package/dist/displayioBidAdapter.js +1 -3
  57. package/dist/dspxBidAdapter.js +1 -1
  58. package/dist/enrichmentFpdModule.js +1 -1
  59. package/dist/eplanningBidAdapter.js +1 -1
  60. package/dist/finativeBidAdapter.js +1 -1
  61. package/dist/glimpseBidAdapter.js +1 -1
  62. package/dist/gmosspBidAdapter.js +1 -1
  63. package/dist/goldbachBidAdapter.js +1 -1
  64. package/dist/gridBidAdapter.js +1 -1
  65. package/dist/gridNMBidAdapter.js +1 -1
  66. package/dist/gumgumBidAdapter.js +1 -1
  67. package/dist/h12mediaBidAdapter.js +1 -1
  68. package/dist/id5IdSystem.js +1 -1
  69. package/dist/imRtdProvider.js +1 -1
  70. package/dist/impactifyBidAdapter.js +1 -1
  71. package/dist/improvedigitalBidAdapter.js +1 -1
  72. package/dist/inmarBidAdapter.js +1 -1
  73. package/dist/insticatorBidAdapter.js +1 -1
  74. package/dist/ixBidAdapter.js +1 -1
  75. package/dist/jixieBidAdapter.js +1 -1
  76. package/dist/justpremiumBidAdapter.js +1 -1
  77. package/dist/kargoBidAdapter.js +1 -1
  78. package/dist/konduitAnalyticsAdapter.js +1 -1
  79. package/dist/kueezBidAdapter.js +1 -1
  80. package/dist/lassoBidAdapter.js +1 -1
  81. package/dist/lifestreetBidAdapter.js +1 -0
  82. package/dist/limelightDigitalBidAdapter.js +1 -1
  83. package/dist/liveyieldAnalyticsAdapter.js +1 -1
  84. package/dist/logicadBidAdapter.js +1 -1
  85. package/dist/loglyliftBidAdapter.js +1 -1
  86. package/dist/mabidderBidAdapter.js +1 -0
  87. package/dist/malltvAnalyticsAdapter.js +1 -1
  88. package/dist/marsmediaBidAdapter.js +1 -1
  89. package/dist/mediafuseBidAdapter.js +1 -1
  90. package/dist/mediagoBidAdapter.js +1 -0
  91. package/dist/mediakeysBidAdapter.js +1 -1
  92. package/dist/mediasquareBidAdapter.js +1 -1
  93. package/dist/mgidBidAdapter.js +1 -1
  94. package/dist/minutemediaBidAdapter.js +1 -1
  95. package/dist/nextMillenniumBidAdapter.js +1 -1
  96. package/dist/not-for-prod/prebid.js +153 -147
  97. package/dist/oguryBidAdapter.js +1 -1
  98. package/dist/oneKeyIdSystem.js +1 -0
  99. package/dist/oneKeyRtdProvider.js +1 -0
  100. package/dist/onetagBidAdapter.js +1 -1
  101. package/dist/ooloAnalyticsAdapter.js +1 -1
  102. package/dist/openxAnalyticsAdapter.js +1 -1
  103. package/dist/outbrainBidAdapter.js +1 -1
  104. package/dist/parrableIdSystem.js +1 -1
  105. package/dist/permutiveRtdProvider.js +1 -1
  106. package/dist/pixfutureBidAdapter.js +1 -1
  107. package/dist/prebid-core.js +2 -2
  108. package/dist/publinkIdSystem.js +1 -1
  109. package/dist/pubmaticAnalyticsAdapter.js +1 -1
  110. package/dist/pubmaticBidAdapter.js +1 -1
  111. package/dist/pubwiseAnalyticsAdapter.js +1 -1
  112. package/dist/pxyzBidAdapter.js +1 -1
  113. package/dist/quantcastBidAdapter.js +1 -1
  114. package/dist/rasBidAdapter.js +1 -1
  115. package/dist/readpeakBidAdapter.js +1 -1
  116. package/dist/relaidoBidAdapter.js +1 -1
  117. package/dist/rhythmoneBidAdapter.js +1 -1
  118. package/dist/riseBidAdapter.js +1 -1
  119. package/dist/rtbhouseBidAdapter.js +1 -1
  120. package/dist/rubiconAnalyticsAdapter.js +1 -1
  121. package/dist/rubiconBidAdapter.js +1 -1
  122. package/dist/seedingAllianceBidAdapter.js +1 -1
  123. package/dist/seedtagBidAdapter.js +1 -1
  124. package/dist/sharethroughAnalyticsAdapter.js +1 -1
  125. package/dist/sharethroughBidAdapter.js +1 -1
  126. package/dist/shinezBidAdapter.js +1 -1
  127. package/dist/smaatoBidAdapter.js +1 -1
  128. package/dist/smartadserverBidAdapter.js +1 -1
  129. package/dist/smartxBidAdapter.js +1 -1
  130. package/dist/smilewantedBidAdapter.js +1 -1
  131. package/dist/sonobiBidAdapter.js +1 -1
  132. package/dist/sovrnAnalyticsAdapter.js +1 -1
  133. package/dist/sovrnBidAdapter.js +1 -1
  134. package/dist/sspBCBidAdapter.js +1 -1
  135. package/dist/sublimeBidAdapter.js +1 -1
  136. package/dist/synacormediaBidAdapter.js +1 -1
  137. package/dist/tappxBidAdapter.js +1 -1
  138. package/dist/targetVideoBidAdapter.js +1 -1
  139. package/dist/teadsBidAdapter.js +1 -1
  140. package/dist/trionBidAdapter.js +1 -1
  141. package/dist/tripleliftBidAdapter.js +1 -1
  142. package/dist/trustpidSystem.js +1 -1
  143. package/dist/ttdBidAdapter.js +1 -1
  144. package/dist/ucfunnelAnalyticsAdapter.js +1 -1
  145. package/dist/underdogmediaBidAdapter.js +1 -1
  146. package/dist/undertoneBidAdapter.js +1 -1
  147. package/dist/userId.js +1 -1
  148. package/dist/vidazooBidAdapter.js +1 -1
  149. package/dist/videobyteBidAdapter.js +1 -1
  150. package/dist/viewability.js +1 -1
  151. package/dist/visxBidAdapter.js +1 -1
  152. package/dist/vuukleBidAdapter.js +1 -1
  153. package/dist/widespaceBidAdapter.js +1 -1
  154. package/dist/winrBidAdapter.js +1 -1
  155. package/dist/yahoosspBidAdapter.js +1 -1
  156. package/dist/yieldmoBidAdapter.js +1 -1
  157. package/dist/yieldoneAnalyticsAdapter.js +1 -1
  158. package/dist/zeta_global_sspBidAdapter.js +1 -1
  159. package/integrationExamples/gpt/permutiveRtdProvider_example.html +1 -1
  160. package/karma.conf.maker.js +2 -13
  161. package/modules/.submodules.json +2 -0
  162. package/modules/acuityAdsBidAdapter.js +207 -0
  163. package/modules/acuityAdsBidAdapter.md +79 -0
  164. package/modules/adagioBidAdapter.js +2 -3
  165. package/modules/adgenerationBidAdapter.js +2 -2
  166. package/modules/adkernelBidAdapter.js +28 -12
  167. package/modules/admixerBidAdapter.js +1 -1
  168. package/modules/adnowBidAdapter.js +1 -1
  169. package/modules/adpod.js +1 -1
  170. package/modules/adrelevantisBidAdapter.js +2 -2
  171. package/modules/adriverBidAdapter.js +5 -12
  172. package/modules/adriverIdSystem.js +2 -1
  173. package/modules/adtargetBidAdapter.js +1 -1
  174. package/modules/adtelligentBidAdapter.js +6 -2
  175. package/modules/adtrgtmeBidAdapter.js +333 -0
  176. package/modules/adtrgtmeBidAdapter.md +69 -0
  177. package/modules/adtrueBidAdapter.js +1 -1
  178. package/modules/adxpremiumAnalyticsAdapter.js +1 -1
  179. package/modules/adyoulikeBidAdapter.js +1 -1
  180. package/modules/alkimiBidAdapter.js +2 -1
  181. package/modules/aniviewBidAdapter.js +1 -1
  182. package/modules/appnexusBidAdapter.js +13 -93
  183. package/modules/apstreamBidAdapter.js +2 -2
  184. package/modules/beopBidAdapter.js +4 -4
  185. package/modules/betweenBidAdapter.js +4 -4
  186. package/modules/bidwatchAnalyticsAdapter.js +112 -59
  187. package/modules/bizzclickBidAdapter.js +1 -1
  188. package/modules/brightMountainMediaBidAdapter.js +1 -1
  189. package/modules/browsiRtdProvider.js +24 -10
  190. package/modules/cleanmedianetBidAdapter.js +1 -1
  191. package/modules/consentManagement.js +1 -1
  192. package/modules/consentManagementUsp.js +1 -1
  193. package/modules/consumableBidAdapter.js +43 -3
  194. package/modules/cpmstarBidAdapter.js +23 -13
  195. package/modules/criteoBidAdapter.js +19 -13
  196. package/modules/currency.js +1 -0
  197. package/modules/cwireBidAdapter.js +1 -1
  198. package/modules/datablocksBidAdapter.js +1 -1
  199. package/modules/datawrkzBidAdapter.js +633 -0
  200. package/modules/datawrkzBidAdapter.md +160 -0
  201. package/modules/dfpAdServerVideo.js +2 -2
  202. package/modules/dgkeywordRtdProvider.js +10 -1
  203. package/modules/displayioBidAdapter.js +92 -97
  204. package/modules/dspxBidAdapter.js +1 -1
  205. package/modules/e_volutionBidAdapter.js +3 -3
  206. package/modules/ebdrBidAdapter.js +1 -1
  207. package/modules/emx_digitalBidAdapter.js +1 -1
  208. package/modules/enrichmentFpdModule.js +11 -0
  209. package/modules/fabrickIdSystem.js +2 -2
  210. package/modules/gamoshiBidAdapter.js +1 -1
  211. package/modules/getintentBidAdapter.js +1 -1
  212. package/modules/gjirafaBidAdapter.js +2 -2
  213. package/modules/goldbachBidAdapter.js +8 -8
  214. package/modules/gothamadsBidAdapter.js +2 -2
  215. package/modules/gumgumBidAdapter.js +3 -3
  216. package/modules/h12mediaBidAdapter.js +1 -1
  217. package/modules/id5AnalyticsAdapter.js +1 -1
  218. package/modules/id5IdSystem.js +160 -111
  219. package/modules/id5IdSystem.md +16 -14
  220. package/modules/imRtdProvider.js +20 -7
  221. package/modules/imRtdProvider.md +3 -1
  222. package/modules/impactifyBidAdapter.js +1 -1
  223. package/modules/improvedigitalBidAdapter.js +50 -28
  224. package/modules/inskinBidAdapter.js +1 -1
  225. package/modules/insticatorBidAdapter.js +1 -1
  226. package/modules/integr8BidAdapter.js +2 -2
  227. package/modules/intentIqIdSystem.js +2 -2
  228. package/modules/interactiveOffersBidAdapter.js +1 -1
  229. package/modules/iqmBidAdapter.js +1 -1
  230. package/modules/ixBidAdapter.js +21 -328
  231. package/modules/ixBidAdapter.md +1 -19
  232. package/modules/kargoBidAdapter.js +4 -5
  233. package/modules/krushmediaBidAdapter.js +2 -2
  234. package/modules/lassoBidAdapter.js +3 -3
  235. package/modules/lifestreetBidAdapter.js +143 -0
  236. package/modules/limelightDigitalBidAdapter.js +2 -1
  237. package/modules/livewrappedAnalyticsAdapter.js +3 -3
  238. package/modules/lkqdBidAdapter.js +3 -3
  239. package/modules/loganBidAdapter.js +2 -2
  240. package/modules/luponmediaBidAdapter.js +3 -3
  241. package/modules/mabidderBidAdapter.js +60 -0
  242. package/modules/mabidderBidAdapter.md +31 -0
  243. package/modules/malltvBidAdapter.js +2 -2
  244. package/modules/mediagoBidAdapter.js +462 -0
  245. package/modules/mediagoBidAdapter.md +34 -0
  246. package/modules/mediakeysBidAdapter.js +2 -2
  247. package/modules/mgidBidAdapter.js +2 -2
  248. package/modules/nextMillenniumBidAdapter.js +25 -6
  249. package/modules/nobidBidAdapter.js +2 -2
  250. package/modules/novatiqIdSystem.js +1 -1
  251. package/modules/oneKeyIdSystem.js +78 -0
  252. package/modules/oneKeyIdSystem.md +109 -0
  253. package/modules/oneKeyRtdProvider.js +98 -0
  254. package/modules/oneKeyRtdProvider.md +127 -0
  255. package/modules/open8BidAdapter.js +1 -1
  256. package/modules/openwebBidAdapter.js +1 -1
  257. package/modules/openxAnalyticsAdapter.js +5 -744
  258. package/modules/openxAnalyticsAdapter.md +4 -0
  259. package/modules/openxBidAdapter.js +3 -3
  260. package/modules/permutiveRtdProvider.js +55 -8
  261. package/modules/pixfutureBidAdapter.js +1 -1
  262. package/modules/prebidmanagerAnalyticsAdapter.js +1 -1
  263. package/modules/priceFloors.js +1 -1
  264. package/modules/pubmaticAnalyticsAdapter.js +1 -1
  265. package/modules/pubmaticBidAdapter.js +19 -1
  266. package/modules/pubwiseAnalyticsAdapter.js +1 -1
  267. package/modules/pubwiseBidAdapter.js +3 -3
  268. package/modules/pubxBidAdapter.js +1 -1
  269. package/modules/pubxaiAnalyticsAdapter.js +2 -2
  270. package/modules/quantcastIdSystem.js +1 -1
  271. package/modules/radsBidAdapter.js +1 -1
  272. package/modules/rasBidAdapter.js +8 -0
  273. package/modules/rasBidAdapter.md +14 -13
  274. package/modules/revcontentBidAdapter.js +1 -1
  275. package/modules/richaudienceBidAdapter.js +1 -1
  276. package/modules/rtbhouseBidAdapter.js +25 -1
  277. package/modules/schain.js +1 -1
  278. package/modules/seedtagBidAdapter.md +25 -56
  279. package/modules/showheroes-bsBidAdapter.js +1 -1
  280. package/modules/sizeMappingV2.js +1 -1
  281. package/modules/smaatoBidAdapter.js +2 -2
  282. package/modules/sonobiAnalyticsAdapter.js +1 -1
  283. package/modules/sonobiBidAdapter.js +4 -3
  284. package/modules/staqAnalyticsAdapter.js +1 -1
  285. package/modules/tappxBidAdapter.js +11 -2
  286. package/modules/targetVideoBidAdapter.js +1 -1
  287. package/modules/theAdxBidAdapter.js +2 -2
  288. package/modules/tpmnBidAdapter.js +1 -1
  289. package/modules/trionBidAdapter.js +2 -2
  290. package/modules/tripleliftBidAdapter.js +20 -1
  291. package/modules/trustpidSystem.js +6 -42
  292. package/modules/trustpidSystem.md +10 -10
  293. package/modules/underdogmediaBidAdapter.js +1 -1
  294. package/modules/userId/eids.js +26 -0
  295. package/modules/userId/userId.md +2 -2
  296. package/modules/vdoaiBidAdapter.js +1 -1
  297. package/modules/vidazooBidAdapter.js +7 -5
  298. package/modules/vidoomyBidAdapter.js +1 -1
  299. package/modules/viewability.js +14 -14
  300. package/modules/winrBidAdapter.js +1 -1
  301. package/modules/yahoosspBidAdapter.js +3 -3
  302. package/modules/yandexBidAdapter.js +1 -1
  303. package/modules/yieldmoBidAdapter.js +3 -3
  304. package/modules/yieldoneBidAdapter.js +2 -2
  305. package/modules/zeta_global_sspBidAdapter.js +24 -21
  306. package/package.json +3 -3
  307. package/src/Renderer.js +1 -1
  308. package/src/adloader.js +2 -1
  309. package/src/adserver.js +0 -56
  310. package/src/auction.js +60 -16
  311. package/src/bidfactory.js +1 -1
  312. package/src/native.js +75 -60
  313. package/src/refererDetection.js +12 -1
  314. package/src/sizeMapping.js +5 -7
  315. package/src/targeting.js +1 -1
  316. package/src/userSync.js +1 -1
  317. package/src/utils/promise.js +3 -1
  318. package/src/utils.js +27 -0
  319. package/src/video.js +5 -4
  320. package/src/videoCache.js +8 -2
  321. package/test/pages/instream.html +2 -2
  322. package/test/spec/modules/acuityAdsBidAdapter_spec.js +398 -0
  323. package/test/spec/modules/adagioBidAdapter_spec.js +2 -0
  324. package/test/spec/modules/adkernelBidAdapter_spec.js +11 -2
  325. package/test/spec/modules/adriverBidAdapter_spec.js +6 -13
  326. package/test/spec/modules/adriverIdSystem_spec.js +3 -8
  327. package/test/spec/modules/adtelligentBidAdapter_spec.js +2 -0
  328. package/test/spec/modules/adtrgtmeBidAdapter_spec.js +802 -0
  329. package/test/spec/modules/alkimiBidAdapter_spec.js +2 -1
  330. package/test/spec/modules/appnexusBidAdapter_spec.js +1 -0
  331. package/test/spec/modules/beopBidAdapter_spec.js +11 -0
  332. package/test/spec/modules/betweenBidAdapter_spec.js +17 -0
  333. package/test/spec/modules/bidwatchAnalyticsAdapter_spec.js +28 -12
  334. package/test/spec/modules/big-richmediaBidAdapter_spec.js +1 -0
  335. package/test/spec/modules/browsiRtdProvider_spec.js +40 -1
  336. package/test/spec/modules/consumableBidAdapter_spec.js +158 -0
  337. package/test/spec/modules/cpmstarBidAdapter_spec.js +1 -1
  338. package/test/spec/modules/criteoBidAdapter_spec.js +35 -26
  339. package/test/spec/modules/currency_spec.js +22 -0
  340. package/test/spec/modules/datawrkzBidAdapter_spec.js +656 -0
  341. package/test/spec/modules/dgkeywordRtdProvider_spec.js +1 -1
  342. package/test/spec/modules/displayioBidAdapter_spec.js +16 -52
  343. package/test/spec/modules/enrichmentFpdModule_spec.js +16 -1
  344. package/test/spec/modules/fpdModule_spec.js +2 -1
  345. package/test/spec/modules/id5IdSystem_spec.js +529 -172
  346. package/test/spec/modules/imRtdProvider_spec.js +10 -5
  347. package/test/spec/modules/improvedigitalBidAdapter_spec.js +9 -13
  348. package/test/spec/modules/ixBidAdapter_spec.js +216 -123
  349. package/test/spec/modules/kargoBidAdapter_spec.js +11 -2
  350. package/test/spec/modules/lifestreetBidAdapter_spec.js +232 -0
  351. package/test/spec/modules/limelightDigitalBidAdapter_spec.js +59 -7
  352. package/test/spec/modules/mabidderBidAdapter_spec.js +125 -0
  353. package/test/spec/modules/mediagoBidAdapter_spec.js +97 -0
  354. package/test/spec/modules/nextMillenniumBidAdapter_spec.js +2 -7
  355. package/test/spec/modules/oneKeyIdSystem_spec.js +107 -0
  356. package/test/spec/modules/oneKeyRtdProvider_spec.js +152 -0
  357. package/test/spec/modules/openxAnalyticsAdapter_spec.js +6 -638
  358. package/test/spec/modules/permutiveRtdProvider_spec.js +152 -2
  359. package/test/spec/modules/pubmaticBidAdapter_spec.js +69 -4
  360. package/test/spec/modules/rasBidAdapter_spec.js +2 -0
  361. package/test/spec/modules/tripleliftBidAdapter_spec.js +18 -0
  362. package/test/spec/modules/trustpidSystem_spec.js +27 -45
  363. package/test/spec/modules/vidazooBidAdapter_spec.js +36 -23
  364. package/test/spec/modules/zeta_global_sspBidAdapter_spec.js +59 -0
  365. package/test/spec/native_spec.js +257 -2
  366. package/test/spec/videoCache_spec.js +37 -7
@@ -0,0 +1,633 @@
1
+ import { deepAccess, getBidIdParameter, isArray, getUniqueIdentifierStr, contains } from '../src/utils.js';
2
+ import { config } from '../src/config.js';
3
+ import { Renderer } from '../src/Renderer.js';
4
+ import { registerBidder } from '../src/adapters/bidderFactory.js';
5
+ import { createBid } from '../src/bidfactory.js';
6
+ import { BANNER, NATIVE, VIDEO } from '../src/mediaTypes.js';
7
+ import CONSTANTS from '../src/constants.json';
8
+ import { OUTSTREAM, INSTREAM } from '../src/video.js';
9
+
10
+ const BIDDER_CODE = 'datawrkz';
11
+ const ALIASES = [];
12
+ const ENDPOINT_URL = 'https://at.datawrkz.com/exchange/openrtb23/';
13
+ const RENDERER_URL = 'https://js.datawrkz.com/prebid/osRenderer.min.js';
14
+ const OUTSTREAM_TYPES = ['inline', 'slider_top_left', 'slider_top_right', 'slider_bottom_left', 'slider_bottom_right', 'interstitial_close', 'listicle']
15
+ const OUTSTREAM_MIMES = ['video/mp4']
16
+ const SUPPORTED_AD_TYPES = [BANNER, NATIVE, VIDEO];
17
+
18
+ export const spec = {
19
+ code: BIDDER_CODE,
20
+ aliases: ALIASES,
21
+ supportedMediaTypes: SUPPORTED_AD_TYPES,
22
+ /**
23
+ * Determines whether or not the given bid request is valid.
24
+ *
25
+ * @param {object} bid The bid to validate.
26
+ * @return boolean True if this is a valid bid, and false otherwise.
27
+ */
28
+ isBidRequestValid: function(bid) {
29
+ return !!(bid.params && bid.params.site_id && (deepAccess(bid, 'mediaTypes.video.context') != 'adpod'));
30
+ },
31
+
32
+ /**
33
+ * Make a server request from the list of BidRequests.
34
+ *
35
+ * @param {BidRequest[]} bidRequests A non-empty list of bid requests which should be sent to the Server.
36
+ * @return ServerRequest Info describing the request to the server.
37
+ */
38
+ buildRequests: function(validBidRequests, bidderRequest) {
39
+ let requests = [];
40
+
41
+ if (validBidRequests.length > 0) {
42
+ validBidRequests.forEach(bidRequest => {
43
+ if (!bidRequest.mediaTypes) return;
44
+ if (bidRequest.mediaTypes.banner && ((bidRequest.mediaTypes.banner.sizes && bidRequest.mediaTypes.banner.sizes.length != 0) ||
45
+ (bidRequest.sizes))) {
46
+ requests.push(buildBannerRequest(bidRequest, bidderRequest));
47
+ } else if (bidRequest.mediaTypes.native) {
48
+ requests.push(buildNativeRequest(bidRequest, bidderRequest));
49
+ } else if (bidRequest.mediaTypes.video) {
50
+ requests.push(buildVideoRequest(bidRequest, bidderRequest));
51
+ }
52
+ });
53
+ }
54
+ return requests;
55
+ },
56
+
57
+ /**
58
+ * Unpack the response from the server into a list of bids.
59
+ *
60
+ * @param {*} serverResponse A successful response from the server.
61
+ * @return {Bid[]} An array of bids which were nested inside the server.
62
+ */
63
+ interpretResponse: function(serverResponse, request) {
64
+ var bidResponses = [];
65
+ let bidRequest = request.bidRequest
66
+ let bidResponse = serverResponse.body;
67
+
68
+ // valid object?
69
+ if ((!bidResponse || !bidResponse.id) || (!bidResponse.seatbid || bidResponse.seatbid.length === 0 ||
70
+ !bidResponse.seatbid[0].bid || bidResponse.seatbid[0].bid.length === 0)) {
71
+ return [];
72
+ }
73
+
74
+ if (getMediaTypeOfResponse(bidRequest) == BANNER) {
75
+ bidResponses = buildBannerResponse(bidRequest, bidResponse);
76
+ } else if (getMediaTypeOfResponse(bidRequest) == NATIVE) {
77
+ bidResponses = buildNativeResponse(bidRequest, bidResponse);
78
+ } else if (getMediaTypeOfResponse(bidRequest) == VIDEO) {
79
+ bidResponses = buildVideoResponse(bidRequest, bidResponse);
80
+ }
81
+ return bidResponses;
82
+ },
83
+ }
84
+
85
+ /* Generate bid request for banner adunit */
86
+ function buildBannerRequest(bidRequest, bidderRequest) {
87
+ let bidFloor = Number(getBidIdParameter('bidfloor', bidRequest.params));
88
+
89
+ let adW = 0;
90
+ let adH = 0;
91
+
92
+ let bannerSizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes');
93
+ let bidSizes = isArray(bannerSizes) ? bannerSizes : bidRequest.sizes;
94
+ if (isArray(bidSizes)) {
95
+ if (bidSizes.length === 2 && typeof bidSizes[0] === 'number' && typeof bidSizes[1] === 'number') {
96
+ adW = parseInt(bidSizes[0]);
97
+ adH = parseInt(bidSizes[1]);
98
+ } else {
99
+ adW = parseInt(bidSizes[0][0]);
100
+ adH = parseInt(bidSizes[0][1]);
101
+ }
102
+ }
103
+
104
+ var deals = [];
105
+ if (bidRequest.params.deals && bidRequest.params.deals.length > 0) {
106
+ deals = bidRequest.params.deals;
107
+ }
108
+
109
+ const imp = [{
110
+ id: bidRequest.bidId,
111
+ banner: {
112
+ w: adW,
113
+ h: adH
114
+ },
115
+ bidfloor: bidFloor,
116
+ pmp: {
117
+ deals: deals
118
+ }
119
+ }];
120
+
121
+ bidRequest.requestedMediaType = BANNER;
122
+ const scriptUrl = generateScriptUrl(bidRequest);
123
+ const payloadString = generatePayload(imp, bidderRequest);
124
+
125
+ return {
126
+ method: 'POST',
127
+ url: scriptUrl,
128
+ data: payloadString,
129
+ bidRequest
130
+ };
131
+ }
132
+
133
+ /* Generate bid request for native adunit */
134
+ function buildNativeRequest(bidRequest, bidderRequest) {
135
+ let counter = 0;
136
+ let assets = [];
137
+
138
+ let bidFloor = Number(getBidIdParameter('bidfloor', bidRequest.params));
139
+
140
+ let title = deepAccess(bidRequest, 'mediaTypes.native.title');
141
+ if (title && title.len) {
142
+ assets.push(generateNativeTitleObj(title, ++counter));
143
+ }
144
+ let image = deepAccess(bidRequest, 'mediaTypes.native.image');
145
+ if (image) {
146
+ assets.push(generateNativeImgObj(image, 'image', ++counter));
147
+ }
148
+ let icon = deepAccess(bidRequest, 'mediaTypes.native.icon');
149
+ if (icon) {
150
+ assets.push(generateNativeImgObj(icon, 'icon', ++counter));
151
+ }
152
+ let sponsoredBy = deepAccess(bidRequest, 'mediaTypes.native.sponsoredBy');
153
+ if (sponsoredBy) {
154
+ assets.push(generateNativeDataObj(sponsoredBy, 'sponsored', ++counter));
155
+ }
156
+ let cta = deepAccess(bidRequest, 'mediaTypes.native.cta');
157
+ if (cta) {
158
+ assets.push(generateNativeDataObj(cta, 'cta', ++counter));
159
+ }
160
+ let body = deepAccess(bidRequest, 'mediaTypes.native.body');
161
+ if (body) {
162
+ assets.push(generateNativeDataObj(body, 'desc', ++counter));
163
+ }
164
+
165
+ let request = JSON.stringify({assets: assets});
166
+ const native = {
167
+ request: request
168
+ };
169
+
170
+ var deals = [];
171
+ if (bidRequest.params.deals && bidRequest.params.deals.length > 0) {
172
+ deals = bidRequest.params.deals;
173
+ }
174
+
175
+ const imp = [{
176
+ id: bidRequest.bidId,
177
+ native: native,
178
+ bidfloor: bidFloor,
179
+ pmp: {
180
+ deals: deals
181
+ }
182
+ }];
183
+
184
+ bidRequest.requestedMediaType = NATIVE;
185
+ bidRequest.assets = assets;
186
+ const scriptUrl = generateScriptUrl(bidRequest);
187
+ const payloadString = generatePayload(imp, bidderRequest);
188
+
189
+ return {
190
+ method: 'POST',
191
+ url: scriptUrl,
192
+ data: payloadString,
193
+ bidRequest
194
+ };
195
+ }
196
+
197
+ /* Generate bid request for video adunit */
198
+ function buildVideoRequest(bidRequest, bidderRequest) {
199
+ let bidFloor = Number(getBidIdParameter('bidfloor', bidRequest.params));
200
+
201
+ let sizeObj = getVideoAdUnitSize(bidRequest);
202
+
203
+ const video = {
204
+ w: sizeObj.adW,
205
+ h: sizeObj.adH,
206
+ api: deepAccess(bidRequest, 'mediaTypes.video.api'),
207
+ mimes: deepAccess(bidRequest, 'mediaTypes.video.mimes'),
208
+ protocols: deepAccess(bidRequest, 'mediaTypes.video.protocols'),
209
+ playbackmethod: deepAccess(bidRequest, 'mediaTypes.video.playbackmethod'),
210
+ minduration: deepAccess(bidRequest, 'mediaTypes.video.minduration'),
211
+ maxduration: deepAccess(bidRequest, 'mediaTypes.video.maxduration'),
212
+ startdelay: deepAccess(bidRequest, 'mediaTypes.video.startdelay'),
213
+ minbitrate: deepAccess(bidRequest, 'mediaTypes.video.minbitrate'),
214
+ maxbitrate: deepAccess(bidRequest, 'mediaTypes.video.maxbitrate'),
215
+ delivery: deepAccess(bidRequest, 'mediaTypes.video.delivery'),
216
+ linearity: deepAccess(bidRequest, 'mediaTypes.video.linearity'),
217
+ placement: deepAccess(bidRequest, 'mediaTypes.video.placement'),
218
+ skip: deepAccess(bidRequest, 'mediaTypes.video.skip'),
219
+ skipafter: deepAccess(bidRequest, 'mediaTypes.video.skipafter')
220
+ };
221
+
222
+ let context = deepAccess(bidRequest, 'mediaTypes.video.context');
223
+ if (context == 'outstream' && !bidRequest.renderer) video.mimes = OUTSTREAM_MIMES;
224
+
225
+ var imp = [];
226
+ var deals = [];
227
+ if (bidRequest.params.deals && bidRequest.params.deals.length > 0) {
228
+ deals = bidRequest.params.deals;
229
+ }
230
+
231
+ if (context != 'adpod') {
232
+ imp.push({
233
+ id: bidRequest.bidId,
234
+ video: video,
235
+ bidfloor: bidFloor,
236
+ pmp: {
237
+ deals: deals
238
+ }
239
+ });
240
+ }
241
+ bidRequest.requestedMediaType = VIDEO;
242
+ const scriptUrl = generateScriptUrl(bidRequest);
243
+ const payloadString = generatePayload(imp, bidderRequest);
244
+
245
+ return {
246
+ method: 'POST',
247
+ url: scriptUrl,
248
+ data: payloadString,
249
+ bidRequest
250
+ };
251
+ }
252
+
253
+ /* Convert video player size to bid request compatible format */
254
+ function getVideoAdUnitSize(bidRequest) {
255
+ var adH = 0;
256
+ var adW = 0;
257
+ let playerSize = deepAccess(bidRequest, 'mediaTypes.video.playerSize');
258
+ if (isArray(playerSize)) {
259
+ if (playerSize.length === 2 && typeof playerSize[0] === 'number' && typeof playerSize[1] === 'number') {
260
+ adW = parseInt(playerSize[0]);
261
+ adH = parseInt(playerSize[1]);
262
+ } else {
263
+ adW = parseInt(playerSize[0][0]);
264
+ adH = parseInt(playerSize[0][1]);
265
+ }
266
+ }
267
+ return {adH: adH, adW: adW}
268
+ }
269
+
270
+ /* Get mediatype of the adunit from request */
271
+ function getMediaTypeOfResponse(bidRequest) {
272
+ if (bidRequest.requestedMediaType == BANNER) return BANNER;
273
+ else if (bidRequest.requestedMediaType == NATIVE) return NATIVE;
274
+ else if (bidRequest.requestedMediaType == VIDEO) return VIDEO;
275
+ else return '';
276
+ }
277
+
278
+ /* Generate endpoint url */
279
+ function generateScriptUrl(bidRequest) {
280
+ let queryParams = 'hb=1';
281
+ let siteId = getBidIdParameter('site_id', bidRequest.params);
282
+ return ENDPOINT_URL + siteId + '?' + queryParams;
283
+ }
284
+
285
+ /* Generate request payload for the adunit */
286
+ function generatePayload(imp, bidderRequest) {
287
+ let domain = window.location.host;
288
+ let page = window.location.host + window.location.pathname + location.search + location.hash;
289
+
290
+ const site = {
291
+ domain: domain,
292
+ page: page,
293
+ publisher: {}
294
+ };
295
+
296
+ let regs = {ext: {}};
297
+
298
+ if (bidderRequest.uspConsent) {
299
+ regs.ext.us_privacy = bidderRequest.uspConsent;
300
+ }
301
+ if (bidderRequest.gdprConsent && typeof bidderRequest.gdprConsent.gdprApplies === 'boolean') {
302
+ regs.ext.gdpr = bidderRequest.gdprConsent.gdprApplies ? '1' : '0';
303
+ }
304
+
305
+ if (config.getConfig('coppa') === true) {
306
+ regs.coppa = '1';
307
+ }
308
+
309
+ const device = {
310
+ ua: window.navigator.userAgent
311
+ };
312
+
313
+ const payload = {
314
+ id: getUniqueIdentifierStr(),
315
+ imp: imp,
316
+ site: site,
317
+ device: device,
318
+ regs: regs
319
+ };
320
+
321
+ return JSON.stringify(payload);
322
+ }
323
+
324
+ /* Generate image asset object */
325
+ function generateNativeImgObj(obj, type, id) {
326
+ let adW = 0;
327
+ let adH = 0;
328
+ let bidSizes = obj.sizes;
329
+
330
+ var typeId;
331
+ if (type == 'icon') typeId = 1;
332
+ else if (type == 'image') typeId = 3;
333
+
334
+ if (isArray(bidSizes)) {
335
+ if (bidSizes.length === 2 && typeof bidSizes[0] === 'number' && typeof bidSizes[1] === 'number') {
336
+ adW = parseInt(bidSizes[0]);
337
+ adH = parseInt(bidSizes[1]);
338
+ } else {
339
+ adW = parseInt(bidSizes[0][0]);
340
+ adH = parseInt(bidSizes[0][1]);
341
+ }
342
+ }
343
+
344
+ let required = obj.required ? 1 : 0;
345
+ let image = {
346
+ type: parseInt(typeId),
347
+ w: adW,
348
+ h: adH
349
+ };
350
+ return {
351
+ id: id,
352
+ required: required,
353
+ img: image
354
+ };
355
+ }
356
+
357
+ /* Generate title asset object */
358
+ function generateNativeTitleObj(obj, id) {
359
+ let required = obj.required ? 1 : 0;
360
+ let title = {
361
+ len: obj.len
362
+ };
363
+ return {
364
+ id: id,
365
+ required: required,
366
+ title: title
367
+ };
368
+ }
369
+
370
+ /* Generate data asset object */
371
+ function generateNativeDataObj(obj, type, id) {
372
+ var typeId;
373
+ switch (type) {
374
+ case 'sponsored': typeId = 1;
375
+ break;
376
+ case 'desc' : typeId = 2;
377
+ break;
378
+ case 'cta' : typeId = 12;
379
+ break;
380
+ }
381
+
382
+ let required = obj.required ? 1 : 0;
383
+ let data = {
384
+ type: typeId
385
+ };
386
+ if (typeId == 2 && obj.len) {
387
+ data.len = parseInt(obj.len);
388
+ }
389
+ return {
390
+ id: id,
391
+ required: required,
392
+ data: data
393
+ };
394
+ }
395
+
396
+ /* Convert banner bid response to compatible format */
397
+ function buildBannerResponse(bidRequest, bidResponse) {
398
+ const bidResponses = [];
399
+ bidResponse.seatbid[0].bid.forEach(function (bidderBid) {
400
+ let responseCPM;
401
+ let placementCode = '';
402
+
403
+ if (bidRequest) {
404
+ let bidResponse = createBid(1);
405
+ placementCode = bidRequest.placementCode;
406
+ bidRequest.status = CONSTANTS.STATUS.GOOD;
407
+ responseCPM = parseFloat(bidderBid.price);
408
+ if (responseCPM === 0 || isNaN(responseCPM)) {
409
+ let bid = createBid(2);
410
+ bid.requestId = bidRequest.bidId;
411
+ bid.bidderCode = bidRequest.bidder;
412
+ bidResponses.push(bid);
413
+ return;
414
+ }
415
+ let bidSizes = (deepAccess(bidRequest, 'mediaTypes.banner.sizes')) ? deepAccess(bidRequest, 'mediaTypes.banner.sizes') : bidRequest.sizes;
416
+ bidResponse.requestId = bidRequest.bidId;
417
+ bidResponse.transactionId = bidRequest.transactionId;
418
+ bidResponse.placementCode = placementCode;
419
+ bidResponse.cpm = responseCPM;
420
+ bidResponse.size = bidSizes;
421
+ bidResponse.width = parseInt(bidderBid.w);
422
+ bidResponse.height = parseInt(bidderBid.h);
423
+ let responseAd = bidderBid.adm;
424
+ let responseNurl = '<img src="' + bidderBid.nurl + '" height="0px" width="0px">';
425
+ bidResponse.ad = decodeURIComponent(responseAd + responseNurl);
426
+ bidResponse.creativeId = bidderBid.id;
427
+ bidResponse.bidderCode = bidRequest.bidder;
428
+ bidResponse.ttl = 300;
429
+ bidResponse.netRevenue = true;
430
+ bidResponse.currency = 'USD';
431
+ bidResponse.mediaType = BANNER;
432
+ bidResponses.push(bidResponse);
433
+ }
434
+ });
435
+ return bidResponses;
436
+ }
437
+
438
+ /* Convert native bid response to compatible format */
439
+ function buildNativeResponse(bidRequest, response) {
440
+ const bidResponses = [];
441
+ response.seatbid[0].bid.forEach(function (bidderBid) {
442
+ let responseCPM;
443
+ let placementCode = '';
444
+
445
+ if (bidRequest) {
446
+ let bidResponse = createBid(1);
447
+ placementCode = bidRequest.placementCode;
448
+ bidRequest.status = CONSTANTS.STATUS.GOOD;
449
+ responseCPM = parseFloat(bidderBid.price);
450
+ if (responseCPM === 0 || isNaN(responseCPM)) {
451
+ let bid = createBid(2);
452
+ bid.requestId = bidRequest.bidId;
453
+ bid.bidderCode = bidRequest.bidder;
454
+ bidResponses.push(bid);
455
+ return;
456
+ }
457
+ bidResponse.requestId = bidRequest.bidId;
458
+ bidResponse.transactionId = bidRequest.transactionId;
459
+ bidResponse.placementCode = placementCode;
460
+ bidResponse.cpm = responseCPM;
461
+
462
+ let nativeResponse = JSON.parse(bidderBid.adm).native;
463
+
464
+ const native = {
465
+ clickUrl: nativeResponse.link.url,
466
+ impressionTrackers: nativeResponse.imptrackers
467
+ };
468
+
469
+ nativeResponse.assets.forEach(function(asset) {
470
+ let keyVal = getNativeAssestObj(asset, bidRequest.assets);
471
+ native[keyVal.key] = keyVal.value;
472
+ });
473
+
474
+ bidResponse.creativeId = bidderBid.id;
475
+ bidResponse.bidderCode = bidRequest.bidder;
476
+ bidResponse.ttl = 300;
477
+ if (bidRequest.sizes) { bidResponse.size = bidRequest.sizes; }
478
+ bidResponse.netRevenue = true;
479
+ bidResponse.currency = 'USD';
480
+ bidResponse.native = native;
481
+ bidResponse.mediaType = NATIVE;
482
+ bidResponses.push(bidResponse);
483
+ }
484
+ });
485
+ return bidResponses;
486
+ }
487
+
488
+ /* Convert video bid response to compatible format */
489
+ function buildVideoResponse(bidRequest, response) {
490
+ const bidResponses = [];
491
+ response.seatbid[0].bid.forEach(function (bidderBid) {
492
+ let responseCPM;
493
+ let placementCode = '';
494
+
495
+ if (bidRequest) {
496
+ let bidResponse = createBid(1);
497
+ placementCode = bidRequest.placementCode;
498
+ bidRequest.status = CONSTANTS.STATUS.GOOD;
499
+ responseCPM = parseFloat(bidderBid.price);
500
+ if (responseCPM === 0 || isNaN(responseCPM)) {
501
+ let bid = createBid(2);
502
+ bid.requestId = bidRequest.bidId;
503
+ bid.bidderCode = bidRequest.bidder;
504
+ bidResponses.push(bid);
505
+ return;
506
+ }
507
+ let context = bidRequest.mediaTypes.video.context;
508
+
509
+ bidResponse.requestId = bidRequest.bidId;
510
+ bidResponse.transactionId = bidRequest.transactionId;
511
+ bidResponse.placementCode = placementCode;
512
+ bidResponse.cpm = responseCPM;
513
+
514
+ let vastXml = decodeURIComponent(bidderBid.adm);
515
+
516
+ bidResponse.creativeId = bidderBid.id;
517
+ bidResponse.bidderCode = bidRequest.bidder;
518
+ bidResponse.ttl = 300;
519
+ bidResponse.netRevenue = true;
520
+ bidResponse.currency = 'USD';
521
+ var ext = bidderBid.ext;
522
+ var vastUrl = '';
523
+ if (ext) {
524
+ vastUrl = ext.vast_url;
525
+ }
526
+ var adUnitCode = bidRequest.adUnitCode;
527
+ var sizeObj = getVideoAdUnitSize(bidRequest);
528
+
529
+ bidResponse.height = sizeObj.adH;
530
+ bidResponse.width = sizeObj.adW;
531
+
532
+ switch (context) {
533
+ case OUTSTREAM:
534
+ var outstreamType = contains(OUTSTREAM_TYPES, bidRequest.params.outstreamType) ? bidRequest.params.outstreamType : '';
535
+ bidResponse.outstreamType = outstreamType;
536
+ bidResponse.ad = vastXml;
537
+ if (!bidRequest.renderer) {
538
+ const renderer = Renderer.install({
539
+ id: bidderBid.id,
540
+ url: RENDERER_URL,
541
+ config: bidRequest.params.outstreamConfig || {},
542
+ loaded: false,
543
+ adUnitCode
544
+ });
545
+ renderer.setRender(outstreamRender);
546
+ bidResponse.renderer = renderer;
547
+ } else { bidResponse.adResponse = vastXml; }
548
+ break;
549
+ case INSTREAM:
550
+ bidResponse.vastUrl = vastUrl;
551
+ bidResponse.adserverTargeting = setTargeting(vastUrl);
552
+ break;
553
+ }
554
+ bidResponse.mediaType = VIDEO;
555
+ bidResponses.push(bidResponse);
556
+ }
557
+ });
558
+ return bidResponses;
559
+ }
560
+
561
+ /* Generate renderer for outstream ad unit */
562
+ function outstreamRender(bid) {
563
+ bid.renderer.push(() => {
564
+ window.osRenderer({
565
+ adResponse: bid.ad,
566
+ height: bid.height,
567
+ width: bid.width,
568
+ targetId: bid.adUnitCode, // target div id to render video
569
+ outstreamType: bid.outstreamType,
570
+ options: bid.renderer.getConfig(),
571
+ });
572
+ });
573
+ }
574
+
575
+ /* Set targeting params used for instream video that is required to generate cache url */
576
+ function setTargeting(query) {
577
+ var targeting = {};
578
+ var hash;
579
+ var hashes = query.slice(query.indexOf('?') + 1).split('&');
580
+ for (var i = 0; i < hashes.length; i++) {
581
+ hash = hashes[i].split('=');
582
+ targeting['hb_' + hash[0]] = hash[1];
583
+ }
584
+ return targeting;
585
+ }
586
+
587
+ /* Get image type with respect to the id */
588
+ function getAssetImageType(id, assets) {
589
+ for (var i = 0; i < assets.length; i++) {
590
+ if (assets[i].id == id) {
591
+ if (assets[i].img.type == 1) { return 'icon'; } else if (assets[i].img.type == 3) { return 'image'; }
592
+ }
593
+ }
594
+ return '';
595
+ }
596
+
597
+ /* Get type of data asset with respect to the id */
598
+ function getAssetDataType(id, assets) {
599
+ for (var i = 0; i < assets.length; i++) {
600
+ if (assets[i].id == id) {
601
+ if (assets[i].data.type == 1) { return 'sponsored'; } else if (assets[i].data.type == 2) { return 'desc'; } else if (assets[i].data.type == 12) { return 'cta'; }
602
+ }
603
+ }
604
+ return '';
605
+ }
606
+
607
+ /* Convert response assests to compatible format */
608
+ function getNativeAssestObj(obj, assets) {
609
+ if (obj.title) {
610
+ return {
611
+ key: 'title',
612
+ value: obj.title.text
613
+ }
614
+ }
615
+ if (obj.data) {
616
+ return {
617
+ key: getAssetDataType(obj.id, assets),
618
+ value: obj.data.value
619
+ }
620
+ }
621
+ if (obj.img) {
622
+ return {
623
+ key: getAssetImageType(obj.id, assets),
624
+ value: {
625
+ url: obj.img.url,
626
+ height: obj.img.h,
627
+ width: obj.img.w
628
+ }
629
+ }
630
+ }
631
+ }
632
+
633
+ registerBidder(spec);