@optable/web-sdk 0.38.0 → 0.40.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.
- package/README.md +51 -2
- package/browser/dist/sdk.js +1 -1
- package/lib/dist/build.json +1 -1
- package/lib/dist/config.d.ts +12 -1
- package/lib/dist/config.js +1 -0
- package/lib/dist/core/events/cache-refresh.js +2 -1
- package/lib/dist/core/regs/consent.js +3 -0
- package/lib/dist/core/regs/gpp/cmpapi.d.ts +3 -1
- package/lib/dist/core/regs/gpp/cmpapi.js +65 -0
- package/lib/dist/core/regs/tcf/cmpapi.d.ts +3 -1
- package/lib/dist/core/regs/tcf/cmpapi.js +65 -1
- package/lib/dist/edge/targeting.d.ts +10 -4
- package/lib/dist/edge/targeting.js +38 -3
- package/lib/dist/sdk.d.ts +4 -6
- package/lib/dist/sdk.js +18 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -218,6 +218,45 @@ sdk
|
|
|
218
218
|
.catch((err) => console.warn(`Targeting API Error: ${err.message}`));
|
|
219
219
|
```
|
|
220
220
|
|
|
221
|
+
The `targeting()` function accepts different parameter formats:
|
|
222
|
+
|
|
223
|
+
#### Single Identifier (Default)
|
|
224
|
+
|
|
225
|
+
```javascript
|
|
226
|
+
// Uses the default passport identifier
|
|
227
|
+
sdk.targeting();
|
|
228
|
+
|
|
229
|
+
// Uses a specific identifier
|
|
230
|
+
sdk.targeting("some_identifier");
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
#### Multiple Identifiers
|
|
234
|
+
|
|
235
|
+
To target multiple identifiers, use the object parameter format:
|
|
236
|
+
|
|
237
|
+
```javascript
|
|
238
|
+
// Target multiple identifiers
|
|
239
|
+
sdk
|
|
240
|
+
.targeting({ ids: ["identifier1", "identifier2", "identifier3"] })
|
|
241
|
+
.then((response) => {
|
|
242
|
+
console.log(`Multi-targeting response: ${response}`);
|
|
243
|
+
})
|
|
244
|
+
.catch((err) => console.warn(`Targeting API Error: ${err.message}`));
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
#### TypeScript Types
|
|
248
|
+
|
|
249
|
+
The targeting function accepts the following parameter types:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
type TargetingRequest = string | { ids?: string[] };
|
|
253
|
+
|
|
254
|
+
// Examples:
|
|
255
|
+
sdk.targeting(); // Uses default "__passport__"
|
|
256
|
+
sdk.targeting("some_id"); // Single identifier
|
|
257
|
+
sdk.targeting({ ids: ["id1", "id2"] }); // Multiple identifiers
|
|
258
|
+
```
|
|
259
|
+
|
|
221
260
|
On success, the resulting targeting data is typically sent as part of a subsequent ad call. Therefore we recommend that you either call targeting() before each ad call, or in parallel periodically, caching the resulting targeting data which you then provide in ad calls.
|
|
222
261
|
|
|
223
262
|
#### Caching Targeting Data
|
|
@@ -830,10 +869,19 @@ const rules: NodeTargetingRule[] = [
|
|
|
830
869
|
},
|
|
831
870
|
{
|
|
832
871
|
targetingFn: async () => window.optable.node_sdk_instance_two.targeting("__ip__"),
|
|
833
|
-
matcher: "third_party_vendor"
|
|
872
|
+
matcher: "third_party_vendor",
|
|
834
873
|
mm: 5, // inference
|
|
835
874
|
priority: 2, // Lower Priority (Optional)
|
|
836
875
|
},
|
|
876
|
+
{
|
|
877
|
+
// Example with multiple identifiers
|
|
878
|
+
targetingFn: async () =>
|
|
879
|
+
window.optable.node_sdk_instance_three.targeting({
|
|
880
|
+
ids: ["identifier1", "identifier2"],
|
|
881
|
+
}),
|
|
882
|
+
matcher: "another_vendor",
|
|
883
|
+
mm: 5, // inference
|
|
884
|
+
},
|
|
837
885
|
];
|
|
838
886
|
```
|
|
839
887
|
|
|
@@ -866,7 +914,8 @@ type MultiNodeTargetingResponse = {
|
|
|
866
914
|
```typescript
|
|
867
915
|
type NodeTargetingRule = {
|
|
868
916
|
// Targeting function to resolve. e.g. window.optable.node_sdk_instance.targeting('__ip__')
|
|
869
|
-
|
|
917
|
+
// For multiple identifiers, use: window.optable.node_sdk_instance.targeting({ ids: ["id1", "id2"] })
|
|
918
|
+
targetingFn: () => Optable.TargetingFn(targetingArg: string | { ids?: string[] });
|
|
870
919
|
// Technology provider domain
|
|
871
920
|
matcher: string;
|
|
872
921
|
// Match method (mm) based on IAB v26 standards.
|
package/browser/dist/sdk.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/*! For license information please see sdk.js.LICENSE.txt */
|
|
2
|
-
(()=>{var t={312:(t,e,r)=>{var i;!function(){"use strict";var e="input is invalid type",n="object"==typeof window,s=n?window:{};s.JS_SHA256_NO_WINDOW&&(n=!1);var o=!n&&"object"==typeof self,a=!s.JS_SHA256_NO_NODE_JS&&"object"==typeof process&&process.versions&&process.versions.node;a?s=r.g:o&&(s=self);var c=!s.JS_SHA256_NO_COMMON_JS&&t.exports,u=r.amdO,h=!s.JS_SHA256_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,d="0123456789abcdef".split(""),p=[-2147483648,8388608,32768,128],g=[24,16,8,0],l=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],f=["hex","array","digest","arrayBuffer"],m=[];!s.JS_SHA256_NO_NODE_JS&&Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),!h||!s.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(t){return"object"==typeof t&&t.buffer&&t.buffer.constructor===ArrayBuffer});var y=function(t,e){return function(r){return new b(e,!0).update(r)[t]()}},w=function(t){var e=y("hex",t);a&&(e=A(e,t)),e.create=function(){return new b(t)},e.update=function(t){return e.create().update(t)};for(var r=0;r<f.length;++r){var i=f[r];e[i]=y(i,t)}return e},A=function(t,i){var n,o=r(394),a=r(903).Buffer,c=i?"sha224":"sha256";return n=a.from&&!s.JS_SHA256_NO_BUFFER_FROM?a.from:function(t){return new a(t)},function(r){if("string"==typeof r)return o.createHash(c).update(r,"utf8").digest("hex");if(null==r)throw new Error(e);return r.constructor===ArrayBuffer&&(r=new Uint8Array(r)),Array.isArray(r)||ArrayBuffer.isView(r)||r.constructor===a?o.createHash(c).update(n(r)).digest("hex"):t(r)}},v=function(t,e){return function(r,i){return new P(r,e,!0).update(i)[t]()}},S=function(t){var e=v("hex",t);e.create=function(e){return new P(e,t)},e.update=function(t,r){return e.create(t).update(r)};for(var r=0;r<f.length;++r){var i=f[r];e[i]=v(i,t)}return e};function b(t,e){e?(m[0]=m[16]=m[1]=m[2]=m[3]=m[4]=m[5]=m[6]=m[7]=m[8]=m[9]=m[10]=m[11]=m[12]=m[13]=m[14]=m[15]=0,this.blocks=m):this.blocks=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t?(this.h0=3238371032,this.h1=914150663,this.h2=812702999,this.h3=4144912697,this.h4=4290775857,this.h5=1750603025,this.h6=1694076839,this.h7=3204075428):(this.h0=1779033703,this.h1=3144134277,this.h2=1013904242,this.h3=2773480762,this.h4=1359893119,this.h5=2600822924,this.h6=528734635,this.h7=1541459225),this.block=this.start=this.bytes=this.hBytes=0,this.finalized=this.hashed=!1,this.first=!0,this.is224=t}function P(t,r,i){var n,s=typeof t;if("string"===s){var o,a=[],c=t.length,u=0;for(n=0;n<c;++n)(o=t.charCodeAt(n))<128?a[u++]=o:o<2048?(a[u++]=192|o>>>6,a[u++]=128|63&o):o<55296||o>=57344?(a[u++]=224|o>>>12,a[u++]=128|o>>>6&63,a[u++]=128|63&o):(o=65536+((1023&o)<<10|1023&t.charCodeAt(++n)),a[u++]=240|o>>>18,a[u++]=128|o>>>12&63,a[u++]=128|o>>>6&63,a[u++]=128|63&o);t=a}else{if("object"!==s)throw new Error(e);if(null===t)throw new Error(e);if(h&&t.constructor===ArrayBuffer)t=new Uint8Array(t);else if(!(Array.isArray(t)||h&&ArrayBuffer.isView(t)))throw new Error(e)}t.length>64&&(t=new b(r,!0).update(t).array());var d=[],p=[];for(n=0;n<64;++n){var g=t[n]||0;d[n]=92^g,p[n]=54^g}b.call(this,r,i),this.update(p),this.oKeyPad=d,this.inner=!0,this.sharedMemory=i}b.prototype.update=function(t){if(!this.finalized){var r,i=typeof t;if("string"!==i){if("object"!==i)throw new Error(e);if(null===t)throw new Error(e);if(h&&t.constructor===ArrayBuffer)t=new Uint8Array(t);else if(!(Array.isArray(t)||h&&ArrayBuffer.isView(t)))throw new Error(e);r=!0}for(var n,s,o=0,a=t.length,c=this.blocks;o<a;){if(this.hashed&&(this.hashed=!1,c[0]=this.block,this.block=c[16]=c[1]=c[2]=c[3]=c[4]=c[5]=c[6]=c[7]=c[8]=c[9]=c[10]=c[11]=c[12]=c[13]=c[14]=c[15]=0),r)for(s=this.start;o<a&&s<64;++o)c[s>>>2]|=t[o]<<g[3&s++];else for(s=this.start;o<a&&s<64;++o)(n=t.charCodeAt(o))<128?c[s>>>2]|=n<<g[3&s++]:n<2048?(c[s>>>2]|=(192|n>>>6)<<g[3&s++],c[s>>>2]|=(128|63&n)<<g[3&s++]):n<55296||n>=57344?(c[s>>>2]|=(224|n>>>12)<<g[3&s++],c[s>>>2]|=(128|n>>>6&63)<<g[3&s++],c[s>>>2]|=(128|63&n)<<g[3&s++]):(n=65536+((1023&n)<<10|1023&t.charCodeAt(++o)),c[s>>>2]|=(240|n>>>18)<<g[3&s++],c[s>>>2]|=(128|n>>>12&63)<<g[3&s++],c[s>>>2]|=(128|n>>>6&63)<<g[3&s++],c[s>>>2]|=(128|63&n)<<g[3&s++]);this.lastByteIndex=s,this.bytes+=s-this.start,s>=64?(this.block=c[16],this.start=s-64,this.hash(),this.hashed=!0):this.start=s}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296|0,this.bytes=this.bytes%4294967296),this}},b.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex;t[16]=this.block,t[e>>>2]|=p[3&e],this.block=t[16],e>=56&&(this.hashed||this.hash(),t[0]=this.block,t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.hBytes<<3|this.bytes>>>29,t[15]=this.bytes<<3,this.hash()}},b.prototype.hash=function(){var t,e,r,i,n,s,o,a,c,u=this.h0,h=this.h1,d=this.h2,p=this.h3,g=this.h4,f=this.h5,m=this.h6,y=this.h7,w=this.blocks;for(t=16;t<64;++t)e=((n=w[t-15])>>>7|n<<25)^(n>>>18|n<<14)^n>>>3,r=((n=w[t-2])>>>17|n<<15)^(n>>>19|n<<13)^n>>>10,w[t]=w[t-16]+e+w[t-7]+r|0;for(c=h&d,t=0;t<64;t+=4)this.first?(this.is224?(s=300032,y=(n=w[0]-1413257819)-150054599|0,p=n+24177077|0):(s=704751109,y=(n=w[0]-210244248)-1521486534|0,p=n+143694565|0),this.first=!1):(e=(u>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10),i=(s=u&h)^u&d^c,y=p+(n=y+(r=(g>>>6|g<<26)^(g>>>11|g<<21)^(g>>>25|g<<7))+(g&f^~g&m)+l[t]+w[t])|0,p=n+(e+i)|0),e=(p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10),i=(o=p&u)^p&h^s,m=d+(n=m+(r=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7))+(y&g^~y&f)+l[t+1]+w[t+1])|0,e=((d=n+(e+i)|0)>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10),i=(a=d&p)^d&u^o,f=h+(n=f+(r=(m>>>6|m<<26)^(m>>>11|m<<21)^(m>>>25|m<<7))+(m&y^~m&g)+l[t+2]+w[t+2])|0,e=((h=n+(e+i)|0)>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10),i=(c=h&d)^h&p^a,g=u+(n=g+(r=(f>>>6|f<<26)^(f>>>11|f<<21)^(f>>>25|f<<7))+(f&m^~f&y)+l[t+3]+w[t+3])|0,u=n+(e+i)|0,this.chromeBugWorkAround=!0;this.h0=this.h0+u|0,this.h1=this.h1+h|0,this.h2=this.h2+d|0,this.h3=this.h3+p|0,this.h4=this.h4+g|0,this.h5=this.h5+f|0,this.h6=this.h6+m|0,this.h7=this.h7+y|0},b.prototype.hex=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,i=this.h3,n=this.h4,s=this.h5,o=this.h6,a=this.h7,c=d[t>>>28&15]+d[t>>>24&15]+d[t>>>20&15]+d[t>>>16&15]+d[t>>>12&15]+d[t>>>8&15]+d[t>>>4&15]+d[15&t]+d[e>>>28&15]+d[e>>>24&15]+d[e>>>20&15]+d[e>>>16&15]+d[e>>>12&15]+d[e>>>8&15]+d[e>>>4&15]+d[15&e]+d[r>>>28&15]+d[r>>>24&15]+d[r>>>20&15]+d[r>>>16&15]+d[r>>>12&15]+d[r>>>8&15]+d[r>>>4&15]+d[15&r]+d[i>>>28&15]+d[i>>>24&15]+d[i>>>20&15]+d[i>>>16&15]+d[i>>>12&15]+d[i>>>8&15]+d[i>>>4&15]+d[15&i]+d[n>>>28&15]+d[n>>>24&15]+d[n>>>20&15]+d[n>>>16&15]+d[n>>>12&15]+d[n>>>8&15]+d[n>>>4&15]+d[15&n]+d[s>>>28&15]+d[s>>>24&15]+d[s>>>20&15]+d[s>>>16&15]+d[s>>>12&15]+d[s>>>8&15]+d[s>>>4&15]+d[15&s]+d[o>>>28&15]+d[o>>>24&15]+d[o>>>20&15]+d[o>>>16&15]+d[o>>>12&15]+d[o>>>8&15]+d[o>>>4&15]+d[15&o];return this.is224||(c+=d[a>>>28&15]+d[a>>>24&15]+d[a>>>20&15]+d[a>>>16&15]+d[a>>>12&15]+d[a>>>8&15]+d[a>>>4&15]+d[15&a]),c},b.prototype.toString=b.prototype.hex,b.prototype.digest=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,i=this.h3,n=this.h4,s=this.h5,o=this.h6,a=this.h7,c=[t>>>24&255,t>>>16&255,t>>>8&255,255&t,e>>>24&255,e>>>16&255,e>>>8&255,255&e,r>>>24&255,r>>>16&255,r>>>8&255,255&r,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o>>>24&255,o>>>16&255,o>>>8&255,255&o];return this.is224||c.push(a>>>24&255,a>>>16&255,a>>>8&255,255&a),c},b.prototype.array=b.prototype.digest,b.prototype.arrayBuffer=function(){this.finalize();var t=new ArrayBuffer(this.is224?28:32),e=new DataView(t);return e.setUint32(0,this.h0),e.setUint32(4,this.h1),e.setUint32(8,this.h2),e.setUint32(12,this.h3),e.setUint32(16,this.h4),e.setUint32(20,this.h5),e.setUint32(24,this.h6),this.is224||e.setUint32(28,this.h7),t},P.prototype=new b,P.prototype.finalize=function(){if(b.prototype.finalize.call(this),this.inner){this.inner=!1;var t=this.array();b.call(this,this.is224,this.sharedMemory),this.update(this.oKeyPad),this.update(t),b.prototype.finalize.call(this)}};var E=w();E.sha256=E,E.sha224=w(!0),E.sha256.hmac=S(),E.sha224.hmac=S(!0),c?t.exports=E:(s.sha256=E.sha256,s.sha224=E.sha224,u&&(void 0===(i=function(){return E}.call(E,r,E,t))||(t.exports=i)))}()},903:()=>{},394:()=>{}},e={};function r(i){var n=e[i];if(void 0!==n)return n.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}r.amdO={},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),(()=>{"use strict";const t={r:"v0.38.0"};function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}function i(t,r,i){return(r=function(t){var r=function(t){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var i=r.call(t,"string");if("object"!=e(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==e(r)?r:r+""}(r))in t?Object.defineProperty(t,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[r]=i,t}async function n(t){const e=await S("/config",t,{method:"GET",headers:{Accept:"application/json"}});return new v(t).setSite(e),e}const s={"Europe/Vienna":"gdpr","Europe/Brussels":"gdpr","Europe/Sofia":"gdpr","Europe/Zagreb":"gdpr","Asia/Nicosia":"gdpr","Europe/Nicosia":"gdpr","Europe/Prague":"gdpr","Europe/Copenhagen":"gdpr","Europe/Tallinn":"gdpr","Europe/Helsinki":"gdpr","Europe/Paris":"gdpr","Europe/Berlin":"gdpr","Europe/Athens":"gdpr","Europe/Budapest":"gdpr","Atlantic/Reykjavik":"gdpr","Europe/Dublin":"gdpr","Europe/Rome":"gdpr","Europe/Riga":"gdpr","Europe/Vaduz":"gdpr","Europe/Vilnius":"gdpr","Europe/Luxembourg":"gdpr","Europe/Malta":"gdpr","Europe/Oslo":"gdpr","Europe/Warsaw":"gdpr","Europe/Lisbon":"gdpr","Europe/Bucharest":"gdpr","Europe/Bratislava":"gdpr","Europe/Ljubljana":"gdpr","Europe/Madrid":"gdpr","Europe/Stockholm":"gdpr","Europe/Amsterdam":"gdpr","Atlantic/Azores":"gdpr","Atlantic/Canary":"gdpr","America/Cayenne":"gdpr","America/Guadeloupe":"gdpr","Atlantic/Madeira":"gdpr","America/Martinique":"gdpr","Indian/Mayotte":"gdpr","Indian/Reunion":"gdpr","America/Marigot":"gdpr","Europe/Zurich":"gdpr","Europe/London":"gdpr","America/Toronto":"can","America/Adak":"us","America/Anchorage":"us","America/Atka":"us","America/Boise":"us","America/Chicago":"us","America/Denver":"us","America/Detroit":"us","America/Indiana/Indianapolis":"us","America/Indiana/Knox":"us","America/Indiana/Marengo":"us","America/Indiana/Petersburg":"us","America/Indiana/Tell_City":"us","America/Indiana/Vevay":"us","America/Indiana/Vincennes":"us","America/Indiana/Winamac":"us","America/Indianapolis":"us","America/Juneau":"us","America/Kentucky/Louisville":"us","America/Kentucky/Monticello":"us","America/Knox_IN":"us","America/Los_Angeles":"us","America/Louisville":"us","America/Menominee":"us","America/Metlakatla":"us","America/New_York":"us","America/Nome":"us","America/North_Dakota/Beulah":"us","America/North_Dakota/Center":"us","America/North_Dakota/New_Salem":"us","America/Phoenix":"us","America/Shiprock":"us","America/Sitka":"us","America/Yakutat":"us","Pacific/Honolulu":"us"},o="tcfcav1",a="tcfeuv2",c=[2],u=[5],h=[7,8,10,12,17,13,18,14,19,20,21,15,22,16,11,9];function d(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=function(t,e){const{gdprApplies:r,gppSectionIDs:i,gdprData:n}=e;if(void 0!==r)return r?"gdpr":"gdpr"===t?null:t;if(void 0!==n&&"gdpr"===t)return"gdpr";if(void 0===i||1===i.length&&0===i[0])return t;if(1===i.length&&-1===i[0])return null;if(i.some((t=>c.includes(t))))return"gdpr";if(i.some((t=>u.includes(t))))return"can";if(i.some((t=>h.includes(t))))return"us";switch(t){case"gdpr":if(!i.some((t=>c.includes(t))))return null;break;case"can":if(!i.some((t=>u.includes(t))))return null;break;case"us":if(!i.some((t=>h.includes(t))))return null}return t}(t,e),n={reg:i,gpp:e.gppString,gppSectionIDs:e.gppSectionIDs,gdpr:e.gdprString,gdprApplies:e.gdprApplies,deviceAccess:!1,createProfilesForAdvertising:!1,useProfilesForAdvertising:!1,measureAdvertisingPerformance:!1};switch(i){case"gdpr":e.gdprData?(n.deviceAccess=g(e.gdprData,1,r.tcfeuVendorID),n.createProfilesForAdvertising=g(e.gdprData,3,r.tcfeuVendorID),n.useProfilesForAdvertising=g(e.gdprData,4,r.tcfeuVendorID),n.measureAdvertisingPerformance=g(e.gdprData,7,r.tcfeuVendorID)):e.gppData&&(n.deviceAccess=f(e.gppData,1,r.tcfeuVendorID),n.createProfilesForAdvertising=f(e.gppData,3,r.tcfeuVendorID),n.useProfilesForAdvertising=f(e.gppData,4,r.tcfeuVendorID),n.measureAdvertisingPerformance=f(e.gppData,7,r.tcfeuVendorID));break;case"can":n.deviceAccess=!0,e.gppData&&(n.createProfilesForAdvertising=l(e.gppData,3,r.tcfcaVendorID),n.useProfilesForAdvertising=l(e.gppData,4,r.tcfcaVendorID),n.measureAdvertisingPerformance=l(e.gppData,7,r.tcfcaVendorID));break;default:n.deviceAccess=!0,n.createProfilesForAdvertising=!0,n.useProfilesForAdvertising=!0,n.measureAdvertisingPerformance=!0}return n}function p(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r={},i=d(t,r,e);return"function"==typeof window.__tcfapi&&window.__tcfapi?.("addEventListener",2,((n,s)=>{s&&("tcloaded"===n.eventStatus||"useractioncomplete"===n.eventStatus)&&(n=>{r.gdprString=n.tcString,r.gdprApplies=n.gdprApplies,r.gdprData=n,Object.assign(i,d(t,r,e))})(n)})),"function"==typeof window.__gpp&&window.__gpp?.("addEventListener",((n,s)=>{s&&"signalStatus"===n.eventName&&"ready"===n.data&&(n=>{r.gppString=n.gppString,r.gppSectionIDs=n.applicableSections,r.gppData=n,Object.assign(i,d(t,r,e))})(n.pingData)})),i}function g(t,e,r){return r?!!t.purpose?.consents?.[e]&&!!t.vendor?.consents?.[r]:!!t.publisher?.consents?.[e]}function l(t,e,r){const i=e>1,n=t.parsedSections?.[o]||[];if("number"==typeof r){const t=n.find((t=>"Version"in t));if(!t)return!1;let s=t.PurposesExpressConsent.includes(e)&&t.VendorExpressConsent.includes(r);return i&&(s||=t.PurposesImpliedConsent.includes(e)&&t.VendorImpliedConsent.includes(r)),s}const s=n.find((t=>"SubsectionType"in t&&3===t.SubsectionType));if(!s)return!1;let a=s.PubPurposesExpressConsent.includes(e);return i&&(a||=s.PubPurposesImpliedConsent.includes(e)),a}function f(t,e,r){const i=e>1,n=t.parsedSections?.[a]||[];if("number"==typeof r){const t=n.find((t=>"Version"in t));if(!t)return!1;let s=t.PurposeConsent.includes(e)&&t.VendorConsent.includes(r);return i&&(s||=t.PurposesLITransparency.includes(e)&&t.VendorLegitimateInterest.includes(r)),s}const s=n.find((t=>"SegmentType"in t&&3===t.SegmentType));if(!s)return!1;let o=s.PubPurposesConsent.includes(e);return i&&(o||=s.PubPurposesLITransparency.includes(e)),o}class m{constructor(t){i(this,"consent",void 0),this.consent=t}getItem(t){return this.consent.deviceAccess?window.localStorage.getItem(t):null}setItem(t,e){this.consent.deviceAccess&&window.localStorage.setItem(t,e)}removeItem(t){this.consent.deviceAccess&&window.localStorage.removeItem(t)}}const y="_optable_pairId";function w(t){const e=new Uint16Array(t.length);for(let r=0;r<e.length;r++)e[r]=t.charCodeAt(r);return btoa(String.fromCharCode(...new Uint8Array(e.buffer)))}function A(t){return t.node?w(`${t.host}/${t.node}`):w(`${t.host}`)}class v{constructor(t){this.config=t,i(this,"passportKeys",void 0),i(this,"targetingKeys",void 0),i(this,"siteKeys",void 0),i(this,"pairKeys",void 0),i(this,"storage",void 0),this.passportKeys=function(t){const e=[],r=[],i=`OPTABLE_PASSPORT_${A(t)}`;return e.push(i),r.push(i),t.legacyHostCache?(r.push(`OPTABLE_PASSPORT_${w(`${t.legacyHostCache}`)}`),r.push(`OPTABLE_PASS_${w(`${t.legacyHostCache}/${t.site}`)}`)):r.push(`OPTABLE_PASS_${w(`${t.host}/${t.site}`)}`),{write:e,read:r}}(t),this.targetingKeys=function(t){const e=`OPTABLE_TARGETING_${A(t)}`;return{write:[e,t.optableCacheTargeting],read:[e]}}(t),this.siteKeys=function(t){const e=`OPTABLE_SITE_${A(t)}`;return{write:[e],read:[e]}}(t),this.pairKeys={write:[y],read:[y]},this.storage=new m(this.config.consent)}getPassport(){return this.readStorageKeys(this.passportKeys)}setPassport(t){this.writeToStorageKeys(this.passportKeys,t)}getTargeting(){const t=this.readStorageKeys(this.targetingKeys);return t?JSON.parse(t):null}setTargeting(t){t&&(this.writeToStorageKeys(this.targetingKeys,JSON.stringify(t)),this.setPairIDs(t))}getSite(){const t=this.readStorageKeys(this.siteKeys);return t?JSON.parse(t):null}setSite(t){t&&this.writeToStorageKeys(this.siteKeys,JSON.stringify(t))}setPairIDs(t){const e=t.ortb2?.user?.eids?.filter((t=>"pair-protocol.com"===t.source)),r=e?.flatMap((t=>t.uids));if(!r)return;const i=new Set(r.map((t=>t.id)));this.writeToStorageKeys(this.pairKeys,btoa(JSON.stringify({envelope:[...i]})))}getPairIDs(){const t=this.readStorageKeys(this.pairKeys);return t?JSON.parse(atob(t))?.envelope:null}readStorageKeys(t){for(const e of t.read){const t=this.storage.getItem(e);if(t)return t}return null}writeToStorageKeys(t,e){if(e)for(const r of t.write)this.storage.setItem(r,e)}clearStorageKeys(t){for(const e of[...t.read,...t.write])this.storage.removeItem(e)}clearPassport(){this.clearStorageKeys(this.passportKeys)}clearTargeting(){this.clearStorageKeys(this.targetingKeys)}clearSite(){this.clearStorageKeys(this.siteKeys)}}async function S(e,r,i){const n=await globalThis.fetch(function(e,r,i){const{host:n,cookies:s}=r,o=new URL(e,`https://${n}`);if(o.searchParams.set("osdk",`web-${t.r}`),o.searchParams.set("sid",r.sessionID),r.skipEnrichment&&o.searchParams.set("skip_enrichment",`${r.skipEnrichment}`),r.node&&o.searchParams.set("t",r.node),r.site&&o.searchParams.set("o",r.site),void 0!==r.consent.gpp&&o.searchParams.set("gpp",r.consent.gpp),void 0!==r.consent.gppSectionIDs&&o.searchParams.set("gpp_sid",r.consent.gppSectionIDs.join(",")),void 0!==r.consent.gdpr&&o.searchParams.set("gdpr_consent",r.consent.gdpr),void 0!==r.consent.gdprApplies&&o.searchParams.set("gdpr",Number(r.consent.gdprApplies).toString()),r.readOnly&&o.searchParams.set("ro","true"),s)o.searchParams.set("cookies","yes");else{const t=new v(r).getPassport();o.searchParams.set("cookies","no"),o.searchParams.set("passport",t||"")}const a={...i};return a.credentials=r.consent.deviceAccess?"include":"omit",r.mockedIP&&(a.headers=new Headers(a.headers),a.headers.set("X-Forwarded-For",r.mockedIP)),new Request(o.toString(),a)}(e,r,i)),s=n.headers.get("Content-Type"),o=s?.startsWith("application/json")?await n.json():await n.text();if(!n.ok)throw new Error(o.error);return o.passport&&(new v(r).setPassport(o.passport),delete o.passport),o}var b,P,E,I=((P=I||{})[P.Banner=1]="Banner",P[P.Video=2]="Video",P[P.Audio=3]="Audio",P[P.Native=4]="Native",P),T={},C={},_={};(E=b||(b={})).Placement=C,E.Media=_,E.Context=T;const k={cookies:!0,initPassport:!0,readOnly:!1,experiments:[],consent:{reg:null,deviceAccess:!0,createProfilesForAdvertising:!0,useProfilesForAdvertising:!0,measureAdvertisingPerformance:!0}};function D(){const t=new Uint8Array(16);return crypto.getRandomValues(t),btoa(String.fromCharCode(...t)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function O(t){return{user:{data:(t?.audience??[]).map((t=>({name:t.provider,segment:t.ids,ext:{segtax:t.rtb_segtax}}))),ext:{eids:(t?.user??[]).map((t=>({source:t.provider,uids:t.ids.map((t=>{let{id:e}=t;return{id:e,atype:3}}))})))}}}}function x(t){const e={};if(!t)return e;for(const r of t.audience??[])r.keyspace&&(r.keyspace in e||(e[r.keyspace]=[]),e[r.keyspace].push(...r.ids.map((t=>t.id))));return e}var K=r(312);class B{constructor(t){i(this,"dcn",void 0),i(this,"init",void 0),this.dcn=function(t){const e={host:t.host,site:t.site,optableCacheTargeting:t.optableCacheTargeting??"optable-cache:targeting",cookies:t.cookies??k.cookies,initPassport:t.initPassport??k.initPassport,consent:k.consent,readOnly:t.readOnly??k.readOnly,node:t.node,legacyHostCache:t.legacyHostCache,experiments:t.experiments??k.experiments,mockedIP:t.mockedIP,sessionID:t.sessionID??D(),skipEnrichment:t.skipEnrichment,initTargeting:t.initTargeting};return t.consent?.static?e.consent=t.consent.static:t.consent?.cmpapi&&(e.consent=p(function(){const t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=s[t];return"can"===e?["fr","fr-CA"].some((t=>navigator.languages.includes(t)))?"can":null:e??null}(),t.consent.cmpapi)),e}(t),this.init=this.initialize()}async initialize(){this.dcn.initPassport&&await n(this.dcn).catch((()=>{})),this.dcn.initTargeting&&this.targeting().catch((()=>{}))}async identify(){await this.init;for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return function(t,e){return S("/identify",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}(this.dcn,e.filter((t=>t)))}async uid2Token(t){return await this.init,function(t,e){return S("/uid2/token",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}(this.dcn,t)}async targeting(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"__passport__";const e="string"==typeof t?[t]:t?.ids||[];if(e.length>1&&!this.dcn.experiments.includes("targeting-cascade"))throw"Targeting multiple IDs is only available with the 'targeting-cascade' experiment enabled.";return await this.init,async function(t,e){const r="/v2/targeting?"+new URLSearchParams(e.map((t=>["id",t]))).toString(),i=await S(r,t,{method:"GET",headers:{Accept:"application/json"}});return i&&(new v(t).setTargeting(i),function(t,e){const r=e.ortb2?.user?.eids?.map((t=>t.matcher));window.dispatchEvent(new CustomEvent("optable-targeting:change",{detail:{instance:t.node||t.host,resolved:!!e.ortb2?.user?.eids?.length,ortb2:e.ortb2,provenance:new Set(r)}}))}(t,i)),i}(this.dcn,e)}targetingFromCache(){return t=this.dcn,new v(t).getTargeting();var t}async site(){return n(this.dcn)}siteFromCache(){return t=this.dcn,new v(t).getSite();var t}targetingClearCache(){var t;t=this.dcn,new v(t).clearTargeting()}async prebidORTB2(){return O(await this.targeting())}prebidORTB2FromCache(){return O(this.targetingFromCache())}async targetingKeyValues(){return x(await this.targeting())}targetingKeyValuesFromCache(){return x(this.targetingFromCache())}async witness(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return await this.init,function(t,e,r){const i={event:e,properties:r};return S("/witness",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}(this.dcn,t,e)}async profile(t){return await this.init,function(t,e){const r={traits:e};return S("/profile",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)})}(this.dcn,t)}async tokenize(t){return await this.init,function(t,e){let r="/v1/tokenize";t.experiments.includes("tokenize-v2")&&(r="/v2/tokenize");let i={id:e};return S(r,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}(this.dcn,t)}async resolve(t){return await this.init,async function(t,e){const r=new URLSearchParams;"string"==typeof e&&r.append("id",e);const i="/v1/resolve?"+r.toString();return function(t){const e={clusters:[],lmpid:""};if("object"!=typeof t||null===t)return e;if("lmpid"in t&&"string"==typeof t?.lmpid&&(e.lmpid=t.lmpid),!("clusters"in t)||!Array.isArray(t?.clusters))return e;for(const r of t.clusters){const t={ids:[],traits:[]};if(Array.isArray(r?.ids))for(const e of r.ids)"string"==typeof e&&t.ids.push(e);if(Array.isArray(r?.traits))for(const e of r.traits)"string"==typeof e?.key&&"string"==typeof e?.value&&t.traits.push({key:e.key,value:e.value});(t.ids.length>0||t.traits.length>0)&&e.clusters.push(t)}return e}(await S(i,t,{method:"GET",headers:{Accept:"application/json"}}))}(this.dcn,t)}static eid(t){return t?"e:"+K.sha256.hex(t.toLowerCase().trim()):""}static sha256(t){return t?K.sha256.hex(t):""}static cid(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r="c:";if("string"!=typeof t)throw new Error("Invalid ppid");if("number"!=typeof e||isNaN(e)||e<0||e>19)throw new Error("Invalid variant");return e>0&&(r=`c${e}:`),t?r+t.trim():""}static TargetingKeyValues(t){return x(t)}static PrebidORTB2(t){return O(t)}}i(B,"version",t.r);const N=B;function V(t){return{advertiserId:t.advertiserId?.toString(),campaignId:t.campaignId?.toString(),creativeId:t.creativeId?.toString(),isEmpty:t.isEmpty?.toString(),lineItemId:t.lineItemId?.toString(),serviceName:t.serviceName?.toString(),size:t.size?.toString(),slotElementId:t.slot?.getSlotElementId(),sourceAgnosticCreativeId:t.sourceAgnosticCreativeId?.toString(),sourceAgnosticLineItemId:t.sourceAgnosticLineItemId?.toString()}}N.prototype.installGPTEventListeners=function(){const t=this;t.installGPTEventListeners=function(){},window.googletag=window.googletag||{cmd:[]};const e=window.googletag;e.cmd.push((function(){e.pubads().addEventListener("slotRenderEnded",(function(e){t.witness("googletag.events.slotRenderEnded",V(e))})),e.pubads().addEventListener("impressionViewable",(function(e){t.witness("googletag.events.impressionViewable",V(e))}))}))},N.prototype.installGPTSecureSignals=function(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];window.googletag=window.googletag||{cmd:[]};const i=window.googletag;e&&e.length>0&&i.cmd.push((()=>{e.forEach((t=>{let{provider:e,id:r}=t;i.secureSignalProviders.push({id:e,collectorFunction:()=>Promise.resolve(r)})}))}))};const F=/^[a-f0-9]{64}$/i;N.prototype.tryIdentifyFromParams=function(t,e){const r=new RegExp(`^${t||"oeid"}$`,"i"),i=new URLSearchParams(window.location.search);let n="";for(const[t,e]of i)if(r.test(t)){n=e;break}""!=n&&(e||function(t){return F.test(t)}(n))&&this.identify((e||"e")+":"+n.toLowerCase())},N.prototype.auctionConfig=async function(){await this.init;let t=this.siteFromCache();return t||(t=await this.site()),t.auctionConfig??null},N.prototype.installGPTAuctionConfigs=async function(t){this.installGPTAuctionConfigs=function(){return Promise.resolve()};const e=await this.auctionConfig();if(!e)return;window.googletag=window.googletag||{cmd:[]};const r=window.googletag;r.cmd.push((function(){let i=r.pubads().getSlots();t&&(i=i.filter(t));for(const t of i){const r=t.getSizes(),i=[];for(const t of r)"fluid"!==t&&i.push({configKey:e.seller+"-"+t.getWidth()+"x"+t.getHeight(),auctionConfig:{...e,requestedSize:{width:t.getWidth()+"px",height:t.getHeight()+"px"}}});t.setConfig({componentAuction:i})}}))},N.prototype.runAdAuction=async function(t,e){if(!("runAdAuction"in navigator))throw"run-ad-auction not supported";const r=document.getElementById(t);if(!r)throw"spot not found";const i=function(t){const e=window.getComputedStyle(t,null);return{width:e.getPropertyValue("width"),height:e.getPropertyValue("height")}}(r),n=await this.auctionConfig();if(!n)return!1;const s={...n,requestedSize:i,resolveToConfig:!0},o=e?.iframe??!1;o&&(s.resolveToConfig=!1);const a=await navigator.runAdAuction(s);if(!a)return r.replaceChildren(),!1;if(o){const t=document.createElement("iframe");t.src=a,t.style.border="none",t.style.width=i.width,t.style.height=i.height,r.replaceChildren(t)}else{const t=document.createElement("fencedframe");t.config=a,t.style.border="none",r.replaceChildren(t)}return!0},N.prototype.joinAdInterestGroups=async function(){if(!("joinAdInterestGroup"in navigator))throw"join-ad-interest-group not supported";if(!(this.dcn.consent.deviceAccess&&this.dcn.consent.createProfilesForAdvertising&&this.dcn.consent.measureAdvertisingPerformance))throw"consent not granted for joining interest groups";await this.init;let t=this.siteFromCache();if(t||(t=await this.site()),!t.interestGroupPixel)throw"origin not enabled for protected audience apis";const e=new URL(t.interestGroupPixel),r=document.createElement("iframe");r.src=e.toString(),r.allow="join-ad-interest-group "+e.origin,r.style.display="none";const i=new Promise(((t,e)=>{window.addEventListener("message",(i=>{i.source===r.contentWindow&&("success"!==i.data.result?e():t())}))}));return document.body.appendChild(r),i},N.prototype.getTopics=async function(){if(!("browsingTopics"in document))throw"browsing-topics not supported";if(!this.dcn.consent.deviceAccess)throw"consent not granted for reading browsing topics";await this.init;let t=this.siteFromCache();if(t||(t=await this.site()),!t.getTopicsURL)throw"origin not enabled for topics api";const e=new URL(t.getTopicsURL),r=document.createElement("iframe");r.src=e.toString(),r.allow="browsing-topics "+e.origin,r.style.display="none";const i=new Promise(((t,e)=>{window.addEventListener("message",(i=>{i.source===r.contentWindow&&(i.data.error?e(new Error(i.data.error.toString())):t(i.data.result))}))}));return document.body.appendChild(r),i},N.prototype.ingestTopics=function(){this.getTopics().then((t=>{if(!t.length)return;const e=t.reduce(((t,e)=>{const r=`topics_v${e.taxonomyVersion}`;return t[r]?t[r]+=",":t[r]="",t[r]+=String(e.topic),t}),{});this.profile(e)})).catch((()=>{}))},window.optable=window.optable||{},window.optable.SDK=N,window.optable.cmd=new class{constructor(t){if(this.cmds=t,Array.isArray(this.cmds))for(const t of this.cmds)"function"==typeof t&&t()}push(t){t()}}(window.optable.cmd||[]),window.optable.utils={resolveMultiNodeTargeting:async function(t){return t?t.some((t=>t.priority))?async function(t){const e=new Set,r={user:{data:[],eids:[]}},i=new Map,n=new Map;const s=t.map((t=>{let{targetingFn:e,matcher:s,mm:o,priority:a}=t;return e().then((t=>function(t,e,s){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;const a=Math.max(0,o),{data:c=[],eids:u=[]}=t.ortb2?.user??{};r.user.data.push(...c),u.filter((t=>t.uids.length)).forEach((t=>{let{ext:r,...o}=t;const c=o.matcher??e,u=i.get(a)??[];c&&i.set(a,[...u,c]);const h=n.get(a)??[];n.set(a,[...h,{...o,matcher:o.matcher??e,mm:o.mm??s}])}))}(t,s,o,a)))}));await Promise.allSettled(s);const o=Array.from(n.keys()).sort(((t,e)=>t-e)).filter((t=>n.get(t)?.length)).shift();if(o){const t=i.get(o)||[];r.user.eids.push(...n.get(o)||[]),t.forEach((t=>e.add(t)))}return{ortb2:r,eidSources:e}}(t):async function(t){const e=new Set,r={user:{data:[],eids:[]}};const i=t.map((t=>{let{targetingFn:i,matcher:n,mm:s}=t;return i().then((t=>function(t,i,n){const{data:s=[],eids:o=[]}=t.ortb2?.user??{};r.user.data.push(...s),o.filter((t=>t.uids.length)).forEach((t=>{let{ext:s,...o}=t;const a=o.matcher??i;a&&e.add(a),r.user.eids.push({...o,mm:o.mm??n,matcher:o.matcher??i})}))}(t,n,s)))}));return await Promise.allSettled(i),{ortb2:r,eidSources:e}}(t):Promise.reject("No targeting rules provided")}},window.optable.instance_config&&(window.optable.instance=new N(window.optable.instance_config))})()})();
|
|
2
|
+
(()=>{var t={312:(t,e,r)=>{var i;!function(){"use strict";var e="input is invalid type",n="object"==typeof window,s=n?window:{};s.JS_SHA256_NO_WINDOW&&(n=!1);var o=!n&&"object"==typeof self,a=!s.JS_SHA256_NO_NODE_JS&&"object"==typeof process&&process.versions&&process.versions.node;a?s=r.g:o&&(s=self);var c=!s.JS_SHA256_NO_COMMON_JS&&t.exports,d=r.amdO,u=!s.JS_SHA256_NO_ARRAY_BUFFER&&"undefined"!=typeof ArrayBuffer,h="0123456789abcdef".split(""),p=[-2147483648,8388608,32768,128],l=[24,16,8,0],g=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],f=["hex","array","digest","arrayBuffer"],m=[];!s.JS_SHA256_NO_NODE_JS&&Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),!u||!s.JS_SHA256_NO_ARRAY_BUFFER_IS_VIEW&&ArrayBuffer.isView||(ArrayBuffer.isView=function(t){return"object"==typeof t&&t.buffer&&t.buffer.constructor===ArrayBuffer});var y=function(t,e){return function(r){return new b(e,!0).update(r)[t]()}},w=function(t){var e=y("hex",t);a&&(e=v(e,t)),e.create=function(){return new b(t)},e.update=function(t){return e.create().update(t)};for(var r=0;r<f.length;++r){var i=f[r];e[i]=y(i,t)}return e},v=function(t,i){var n,o=r(394),a=r(903).Buffer,c=i?"sha224":"sha256";return n=a.from&&!s.JS_SHA256_NO_BUFFER_FROM?a.from:function(t){return new a(t)},function(r){if("string"==typeof r)return o.createHash(c).update(r,"utf8").digest("hex");if(null==r)throw new Error(e);return r.constructor===ArrayBuffer&&(r=new Uint8Array(r)),Array.isArray(r)||ArrayBuffer.isView(r)||r.constructor===a?o.createHash(c).update(n(r)).digest("hex"):t(r)}},A=function(t,e){return function(r,i){return new P(r,e,!0).update(i)[t]()}},S=function(t){var e=A("hex",t);e.create=function(e){return new P(e,t)},e.update=function(t,r){return e.create(t).update(r)};for(var r=0;r<f.length;++r){var i=f[r];e[i]=A(i,t)}return e};function b(t,e){e?(m[0]=m[16]=m[1]=m[2]=m[3]=m[4]=m[5]=m[6]=m[7]=m[8]=m[9]=m[10]=m[11]=m[12]=m[13]=m[14]=m[15]=0,this.blocks=m):this.blocks=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],t?(this.h0=3238371032,this.h1=914150663,this.h2=812702999,this.h3=4144912697,this.h4=4290775857,this.h5=1750603025,this.h6=1694076839,this.h7=3204075428):(this.h0=1779033703,this.h1=3144134277,this.h2=1013904242,this.h3=2773480762,this.h4=1359893119,this.h5=2600822924,this.h6=528734635,this.h7=1541459225),this.block=this.start=this.bytes=this.hBytes=0,this.finalized=this.hashed=!1,this.first=!0,this.is224=t}function P(t,r,i){var n,s=typeof t;if("string"===s){var o,a=[],c=t.length,d=0;for(n=0;n<c;++n)(o=t.charCodeAt(n))<128?a[d++]=o:o<2048?(a[d++]=192|o>>>6,a[d++]=128|63&o):o<55296||o>=57344?(a[d++]=224|o>>>12,a[d++]=128|o>>>6&63,a[d++]=128|63&o):(o=65536+((1023&o)<<10|1023&t.charCodeAt(++n)),a[d++]=240|o>>>18,a[d++]=128|o>>>12&63,a[d++]=128|o>>>6&63,a[d++]=128|63&o);t=a}else{if("object"!==s)throw new Error(e);if(null===t)throw new Error(e);if(u&&t.constructor===ArrayBuffer)t=new Uint8Array(t);else if(!(Array.isArray(t)||u&&ArrayBuffer.isView(t)))throw new Error(e)}t.length>64&&(t=new b(r,!0).update(t).array());var h=[],p=[];for(n=0;n<64;++n){var l=t[n]||0;h[n]=92^l,p[n]=54^l}b.call(this,r,i),this.update(p),this.oKeyPad=h,this.inner=!0,this.sharedMemory=i}b.prototype.update=function(t){if(!this.finalized){var r,i=typeof t;if("string"!==i){if("object"!==i)throw new Error(e);if(null===t)throw new Error(e);if(u&&t.constructor===ArrayBuffer)t=new Uint8Array(t);else if(!(Array.isArray(t)||u&&ArrayBuffer.isView(t)))throw new Error(e);r=!0}for(var n,s,o=0,a=t.length,c=this.blocks;o<a;){if(this.hashed&&(this.hashed=!1,c[0]=this.block,this.block=c[16]=c[1]=c[2]=c[3]=c[4]=c[5]=c[6]=c[7]=c[8]=c[9]=c[10]=c[11]=c[12]=c[13]=c[14]=c[15]=0),r)for(s=this.start;o<a&&s<64;++o)c[s>>>2]|=t[o]<<l[3&s++];else for(s=this.start;o<a&&s<64;++o)(n=t.charCodeAt(o))<128?c[s>>>2]|=n<<l[3&s++]:n<2048?(c[s>>>2]|=(192|n>>>6)<<l[3&s++],c[s>>>2]|=(128|63&n)<<l[3&s++]):n<55296||n>=57344?(c[s>>>2]|=(224|n>>>12)<<l[3&s++],c[s>>>2]|=(128|n>>>6&63)<<l[3&s++],c[s>>>2]|=(128|63&n)<<l[3&s++]):(n=65536+((1023&n)<<10|1023&t.charCodeAt(++o)),c[s>>>2]|=(240|n>>>18)<<l[3&s++],c[s>>>2]|=(128|n>>>12&63)<<l[3&s++],c[s>>>2]|=(128|n>>>6&63)<<l[3&s++],c[s>>>2]|=(128|63&n)<<l[3&s++]);this.lastByteIndex=s,this.bytes+=s-this.start,s>=64?(this.block=c[16],this.start=s-64,this.hash(),this.hashed=!0):this.start=s}return this.bytes>4294967295&&(this.hBytes+=this.bytes/4294967296|0,this.bytes=this.bytes%4294967296),this}},b.prototype.finalize=function(){if(!this.finalized){this.finalized=!0;var t=this.blocks,e=this.lastByteIndex;t[16]=this.block,t[e>>>2]|=p[3&e],this.block=t[16],e>=56&&(this.hashed||this.hash(),t[0]=this.block,t[16]=t[1]=t[2]=t[3]=t[4]=t[5]=t[6]=t[7]=t[8]=t[9]=t[10]=t[11]=t[12]=t[13]=t[14]=t[15]=0),t[14]=this.hBytes<<3|this.bytes>>>29,t[15]=this.bytes<<3,this.hash()}},b.prototype.hash=function(){var t,e,r,i,n,s,o,a,c,d=this.h0,u=this.h1,h=this.h2,p=this.h3,l=this.h4,f=this.h5,m=this.h6,y=this.h7,w=this.blocks;for(t=16;t<64;++t)e=((n=w[t-15])>>>7|n<<25)^(n>>>18|n<<14)^n>>>3,r=((n=w[t-2])>>>17|n<<15)^(n>>>19|n<<13)^n>>>10,w[t]=w[t-16]+e+w[t-7]+r|0;for(c=u&h,t=0;t<64;t+=4)this.first?(this.is224?(s=300032,y=(n=w[0]-1413257819)-150054599|0,p=n+24177077|0):(s=704751109,y=(n=w[0]-210244248)-1521486534|0,p=n+143694565|0),this.first=!1):(e=(d>>>2|d<<30)^(d>>>13|d<<19)^(d>>>22|d<<10),i=(s=d&u)^d&h^c,y=p+(n=y+(r=(l>>>6|l<<26)^(l>>>11|l<<21)^(l>>>25|l<<7))+(l&f^~l&m)+g[t]+w[t])|0,p=n+(e+i)|0),e=(p>>>2|p<<30)^(p>>>13|p<<19)^(p>>>22|p<<10),i=(o=p&d)^p&u^s,m=h+(n=m+(r=(y>>>6|y<<26)^(y>>>11|y<<21)^(y>>>25|y<<7))+(y&l^~y&f)+g[t+1]+w[t+1])|0,e=((h=n+(e+i)|0)>>>2|h<<30)^(h>>>13|h<<19)^(h>>>22|h<<10),i=(a=h&p)^h&d^o,f=u+(n=f+(r=(m>>>6|m<<26)^(m>>>11|m<<21)^(m>>>25|m<<7))+(m&y^~m&l)+g[t+2]+w[t+2])|0,e=((u=n+(e+i)|0)>>>2|u<<30)^(u>>>13|u<<19)^(u>>>22|u<<10),i=(c=u&h)^u&p^a,l=d+(n=l+(r=(f>>>6|f<<26)^(f>>>11|f<<21)^(f>>>25|f<<7))+(f&m^~f&y)+g[t+3]+w[t+3])|0,d=n+(e+i)|0,this.chromeBugWorkAround=!0;this.h0=this.h0+d|0,this.h1=this.h1+u|0,this.h2=this.h2+h|0,this.h3=this.h3+p|0,this.h4=this.h4+l|0,this.h5=this.h5+f|0,this.h6=this.h6+m|0,this.h7=this.h7+y|0},b.prototype.hex=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,i=this.h3,n=this.h4,s=this.h5,o=this.h6,a=this.h7,c=h[t>>>28&15]+h[t>>>24&15]+h[t>>>20&15]+h[t>>>16&15]+h[t>>>12&15]+h[t>>>8&15]+h[t>>>4&15]+h[15&t]+h[e>>>28&15]+h[e>>>24&15]+h[e>>>20&15]+h[e>>>16&15]+h[e>>>12&15]+h[e>>>8&15]+h[e>>>4&15]+h[15&e]+h[r>>>28&15]+h[r>>>24&15]+h[r>>>20&15]+h[r>>>16&15]+h[r>>>12&15]+h[r>>>8&15]+h[r>>>4&15]+h[15&r]+h[i>>>28&15]+h[i>>>24&15]+h[i>>>20&15]+h[i>>>16&15]+h[i>>>12&15]+h[i>>>8&15]+h[i>>>4&15]+h[15&i]+h[n>>>28&15]+h[n>>>24&15]+h[n>>>20&15]+h[n>>>16&15]+h[n>>>12&15]+h[n>>>8&15]+h[n>>>4&15]+h[15&n]+h[s>>>28&15]+h[s>>>24&15]+h[s>>>20&15]+h[s>>>16&15]+h[s>>>12&15]+h[s>>>8&15]+h[s>>>4&15]+h[15&s]+h[o>>>28&15]+h[o>>>24&15]+h[o>>>20&15]+h[o>>>16&15]+h[o>>>12&15]+h[o>>>8&15]+h[o>>>4&15]+h[15&o];return this.is224||(c+=h[a>>>28&15]+h[a>>>24&15]+h[a>>>20&15]+h[a>>>16&15]+h[a>>>12&15]+h[a>>>8&15]+h[a>>>4&15]+h[15&a]),c},b.prototype.toString=b.prototype.hex,b.prototype.digest=function(){this.finalize();var t=this.h0,e=this.h1,r=this.h2,i=this.h3,n=this.h4,s=this.h5,o=this.h6,a=this.h7,c=[t>>>24&255,t>>>16&255,t>>>8&255,255&t,e>>>24&255,e>>>16&255,e>>>8&255,255&e,r>>>24&255,r>>>16&255,r>>>8&255,255&r,i>>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,s>>>24&255,s>>>16&255,s>>>8&255,255&s,o>>>24&255,o>>>16&255,o>>>8&255,255&o];return this.is224||c.push(a>>>24&255,a>>>16&255,a>>>8&255,255&a),c},b.prototype.array=b.prototype.digest,b.prototype.arrayBuffer=function(){this.finalize();var t=new ArrayBuffer(this.is224?28:32),e=new DataView(t);return e.setUint32(0,this.h0),e.setUint32(4,this.h1),e.setUint32(8,this.h2),e.setUint32(12,this.h3),e.setUint32(16,this.h4),e.setUint32(20,this.h5),e.setUint32(24,this.h6),this.is224||e.setUint32(28,this.h7),t},P.prototype=new b,P.prototype.finalize=function(){if(b.prototype.finalize.call(this),this.inner){this.inner=!1;var t=this.array();b.call(this,this.is224,this.sharedMemory),this.update(this.oKeyPad),this.update(t),b.prototype.finalize.call(this)}};var E=w();E.sha256=E,E.sha224=w(!0),E.sha256.hmac=S(),E.sha224.hmac=S(!0),c?t.exports=E:(s.sha256=E.sha256,s.sha224=E.sha224,d&&(void 0===(i=function(){return E}.call(E,r,E,t))||(t.exports=i)))}()},903:()=>{},394:()=>{}},e={};function r(i){var n=e[i];if(void 0!==n)return n.exports;var s=e[i]={exports:{}};return t[i](s,s.exports,r),s.exports}r.amdO={},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),(()=>{"use strict";const t={r:"v0.40.0"};function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},e(t)}function i(t,r,i){return(r=function(t){var r=function(t){if("object"!=e(t)||!t)return t;var r=t[Symbol.toPrimitive];if(void 0!==r){var i=r.call(t,"string");if("object"!=e(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(t)}(t);return"symbol"==e(r)?r:r+""}(r))in t?Object.defineProperty(t,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[r]=i,t}async function n(t){const e=await S("/config",t,{method:"GET",headers:{Accept:"application/json"}});return new A(t).setSite(e),e}const s={"Europe/Vienna":"gdpr","Europe/Brussels":"gdpr","Europe/Sofia":"gdpr","Europe/Zagreb":"gdpr","Asia/Nicosia":"gdpr","Europe/Nicosia":"gdpr","Europe/Prague":"gdpr","Europe/Copenhagen":"gdpr","Europe/Tallinn":"gdpr","Europe/Helsinki":"gdpr","Europe/Paris":"gdpr","Europe/Berlin":"gdpr","Europe/Athens":"gdpr","Europe/Budapest":"gdpr","Atlantic/Reykjavik":"gdpr","Europe/Dublin":"gdpr","Europe/Rome":"gdpr","Europe/Riga":"gdpr","Europe/Vaduz":"gdpr","Europe/Vilnius":"gdpr","Europe/Luxembourg":"gdpr","Europe/Malta":"gdpr","Europe/Oslo":"gdpr","Europe/Warsaw":"gdpr","Europe/Lisbon":"gdpr","Europe/Bucharest":"gdpr","Europe/Bratislava":"gdpr","Europe/Ljubljana":"gdpr","Europe/Madrid":"gdpr","Europe/Stockholm":"gdpr","Europe/Amsterdam":"gdpr","Atlantic/Azores":"gdpr","Atlantic/Canary":"gdpr","America/Cayenne":"gdpr","America/Guadeloupe":"gdpr","Atlantic/Madeira":"gdpr","America/Martinique":"gdpr","Indian/Mayotte":"gdpr","Indian/Reunion":"gdpr","America/Marigot":"gdpr","Europe/Zurich":"gdpr","Europe/London":"gdpr","America/Toronto":"can","America/Adak":"us","America/Anchorage":"us","America/Atka":"us","America/Boise":"us","America/Chicago":"us","America/Denver":"us","America/Detroit":"us","America/Indiana/Indianapolis":"us","America/Indiana/Knox":"us","America/Indiana/Marengo":"us","America/Indiana/Petersburg":"us","America/Indiana/Tell_City":"us","America/Indiana/Vevay":"us","America/Indiana/Vincennes":"us","America/Indiana/Winamac":"us","America/Indianapolis":"us","America/Juneau":"us","America/Kentucky/Louisville":"us","America/Kentucky/Monticello":"us","America/Knox_IN":"us","America/Los_Angeles":"us","America/Louisville":"us","America/Menominee":"us","America/Metlakatla":"us","America/New_York":"us","America/Nome":"us","America/North_Dakota/Beulah":"us","America/North_Dakota/Center":"us","America/North_Dakota/New_Salem":"us","America/Phoenix":"us","America/Shiprock":"us","America/Sitka":"us","America/Yakutat":"us","Pacific/Honolulu":"us"},o="tcfcav1",a="tcfeuv2",c=[2],d=[5],u=[7,8,10,12,17,13,18,14,19,20,21,15,22,16,11,9];function h(t,e){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};const i=function(t,e){const{gdprApplies:r,gppSectionIDs:i,gdprData:n}=e;if(void 0!==r)return r?"gdpr":"gdpr"===t?null:t;if(void 0!==n&&"gdpr"===t)return"gdpr";if(void 0===i||1===i.length&&0===i[0])return t;if(1===i.length&&-1===i[0])return null;if(i.some((t=>c.includes(t))))return"gdpr";if(i.some((t=>d.includes(t))))return"can";if(i.some((t=>u.includes(t))))return"us";switch(t){case"gdpr":if(!i.some((t=>c.includes(t))))return null;break;case"can":if(!i.some((t=>d.includes(t))))return null;break;case"us":if(!i.some((t=>u.includes(t))))return null}return t}(t,e),n={reg:i,gpp:e.gppString,gppSectionIDs:e.gppSectionIDs,gdpr:e.gdprString,gdprApplies:e.gdprApplies,deviceAccess:!1,createProfilesForAdvertising:!1,useProfilesForAdvertising:!1,measureAdvertisingPerformance:!1};switch(i){case"gdpr":e.gdprData?(n.deviceAccess=l(e.gdprData,1,r.tcfeuVendorID),n.createProfilesForAdvertising=l(e.gdprData,3,r.tcfeuVendorID),n.useProfilesForAdvertising=l(e.gdprData,4,r.tcfeuVendorID),n.measureAdvertisingPerformance=l(e.gdprData,7,r.tcfeuVendorID)):e.gppData&&(n.deviceAccess=f(e.gppData,1,r.tcfeuVendorID),n.createProfilesForAdvertising=f(e.gppData,3,r.tcfeuVendorID),n.useProfilesForAdvertising=f(e.gppData,4,r.tcfeuVendorID),n.measureAdvertisingPerformance=f(e.gppData,7,r.tcfeuVendorID));break;case"can":n.deviceAccess=!0,e.gppData&&(n.createProfilesForAdvertising=g(e.gppData,3,r.tcfcaVendorID),n.useProfilesForAdvertising=g(e.gppData,4,r.tcfcaVendorID),n.measureAdvertisingPerformance=g(e.gppData,7,r.tcfcaVendorID));break;default:n.deviceAccess=!0,n.createProfilesForAdvertising=!0,n.useProfilesForAdvertising=!0,n.measureAdvertisingPerformance=!0}return n}function p(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const r={};!function(){if("function"==typeof window.__tcfapi)return;let t;const e={};let r=window;for(;r;){try{if(r.frames.__tcfapiLocator){t=r;break}}catch{}if(r===window.top)break;r=r.parent}t&&(window.__tcfapi=function(r,i,n){const s=Math.random()+"";e[s]=n,t.postMessage({__tcfapiCall:{command:r,version:i,callId:s}},"*")},window.addEventListener("message",(t=>{let r={};try{r="string"==typeof t.data?JSON.parse(t.data):t.data}catch{}const i=r.__tcfapiReturn;i&&"function"==typeof e[i.callId]&&(e[i.callId](i.returnValue,i.success),delete e[i.callId])}),!1))}(),function(){if("function"==typeof window.__gpp)return;let t;const e={};let r=window;for(;r;){try{if(r.frames.__gppLocator){t=r;break}}catch{}if(r===window.top)break;r=r.parent}t&&(window.__gpp=function(r,i){const n=Math.random()+"";e[n]=i,t.postMessage({__gppCall:{command:r,version:"1.1",callId:n}},"*")},window.addEventListener("message",(t=>{let r={};try{r="string"==typeof t.data?JSON.parse(t.data):t.data}catch{}const i=r.__gppReturn;i&&"function"==typeof e[i.callId]&&(e[i.callId](i.returnValue,i.success),delete e[i.callId])}),!1))}();const i=h(t,r,e);return"function"==typeof window.__tcfapi&&window.__tcfapi?.("addEventListener",2,((n,s)=>{s&&("tcloaded"===n.eventStatus||"useractioncomplete"===n.eventStatus)&&(n=>{r.gdprString=n.tcString,r.gdprApplies=n.gdprApplies,r.gdprData=n,Object.assign(i,h(t,r,e))})(n)})),"function"==typeof window.__gpp&&window.__gpp?.("addEventListener",((n,s)=>{s&&"signalStatus"===n.eventName&&"ready"===n.data&&(n=>{r.gppString=n.gppString,r.gppSectionIDs=n.applicableSections,r.gppData=n,Object.assign(i,h(t,r,e))})(n.pingData)})),i}function l(t,e,r){return r?!!t.purpose?.consents?.[e]&&!!t.vendor?.consents?.[r]:!!t.publisher?.consents?.[e]}function g(t,e,r){const i=e>1,n=t.parsedSections?.[o]||[];if("number"==typeof r){const t=n.find((t=>"Version"in t));if(!t)return!1;let s=t.PurposesExpressConsent.includes(e)&&t.VendorExpressConsent.includes(r);return i&&(s||=t.PurposesImpliedConsent.includes(e)&&t.VendorImpliedConsent.includes(r)),s}const s=n.find((t=>"SubsectionType"in t&&3===t.SubsectionType));if(!s)return!1;let a=s.PubPurposesExpressConsent.includes(e);return i&&(a||=s.PubPurposesImpliedConsent.includes(e)),a}function f(t,e,r){const i=e>1,n=t.parsedSections?.[a]||[];if("number"==typeof r){const t=n.find((t=>"Version"in t));if(!t)return!1;let s=t.PurposeConsent.includes(e)&&t.VendorConsent.includes(r);return i&&(s||=t.PurposesLITransparency.includes(e)&&t.VendorLegitimateInterest.includes(r)),s}const s=n.find((t=>"SegmentType"in t&&3===t.SegmentType));if(!s)return!1;let o=s.PubPurposesConsent.includes(e);return i&&(o||=s.PubPurposesLITransparency.includes(e)),o}class m{constructor(t){i(this,"consent",void 0),this.consent=t}getItem(t){return this.consent.deviceAccess?window.localStorage.getItem(t):null}setItem(t,e){this.consent.deviceAccess&&window.localStorage.setItem(t,e)}removeItem(t){this.consent.deviceAccess&&window.localStorage.removeItem(t)}}const y="_optable_pairId";function w(t){const e=new Uint16Array(t.length);for(let r=0;r<e.length;r++)e[r]=t.charCodeAt(r);return btoa(String.fromCharCode(...new Uint8Array(e.buffer)))}function v(t){return t.node?w(`${t.host}/${t.node}`):w(`${t.host}`)}class A{constructor(t){this.config=t,i(this,"passportKeys",void 0),i(this,"targetingKeys",void 0),i(this,"siteKeys",void 0),i(this,"pairKeys",void 0),i(this,"storage",void 0),this.passportKeys=function(t){const e=[],r=[],i=`OPTABLE_PASSPORT_${v(t)}`;return e.push(i),r.push(i),t.legacyHostCache?(r.push(`OPTABLE_PASSPORT_${w(`${t.legacyHostCache}`)}`),r.push(`OPTABLE_PASS_${w(`${t.legacyHostCache}/${t.site}`)}`)):r.push(`OPTABLE_PASS_${w(`${t.host}/${t.site}`)}`),{write:e,read:r}}(t),this.targetingKeys=function(t){const e=`OPTABLE_TARGETING_${v(t)}`;return{write:[e,t.optableCacheTargeting],read:[e]}}(t),this.siteKeys=function(t){const e=`OPTABLE_SITE_${v(t)}`;return{write:[e],read:[e]}}(t),this.pairKeys={write:[y],read:[y]},this.storage=new m(this.config.consent)}getPassport(){return this.readStorageKeys(this.passportKeys)}setPassport(t){this.writeToStorageKeys(this.passportKeys,t)}getTargeting(){const t=this.readStorageKeys(this.targetingKeys);return t?JSON.parse(t):null}setTargeting(t){t&&(this.writeToStorageKeys(this.targetingKeys,JSON.stringify(t)),this.setPairIDs(t))}getSite(){const t=this.readStorageKeys(this.siteKeys);return t?JSON.parse(t):null}setSite(t){t&&this.writeToStorageKeys(this.siteKeys,JSON.stringify(t))}setPairIDs(t){const e=t.ortb2?.user?.eids?.filter((t=>"pair-protocol.com"===t.source)),r=e?.flatMap((t=>t.uids));if(!r)return;const i=new Set(r.map((t=>t.id)));this.writeToStorageKeys(this.pairKeys,btoa(JSON.stringify({envelope:[...i]})))}getPairIDs(){const t=this.readStorageKeys(this.pairKeys);return t?JSON.parse(atob(t))?.envelope:null}readStorageKeys(t){for(const e of t.read){const t=this.storage.getItem(e);if(t)return t}return null}writeToStorageKeys(t,e){if(e)for(const r of t.write)this.storage.setItem(r,e)}clearStorageKeys(t){for(const e of[...t.read,...t.write])this.storage.removeItem(e)}clearPassport(){this.clearStorageKeys(this.passportKeys)}clearTargeting(){this.clearStorageKeys(this.targetingKeys)}clearSite(){this.clearStorageKeys(this.siteKeys)}}async function S(e,r,i){const n=await globalThis.fetch(function(e,r,i){const{host:n,cookies:s}=r,o=new URL(e,`https://${n}`);if(o.searchParams.set("osdk",`web-${t.r}`),o.searchParams.set("sid",r.sessionID),r.skipEnrichment&&o.searchParams.set("skip_enrichment",`${r.skipEnrichment}`),r.node&&o.searchParams.set("t",r.node),r.site&&o.searchParams.set("o",r.site),void 0!==r.consent.gpp&&o.searchParams.set("gpp",r.consent.gpp),void 0!==r.consent.gppSectionIDs&&o.searchParams.set("gpp_sid",r.consent.gppSectionIDs.join(",")),void 0!==r.consent.gdpr&&o.searchParams.set("gdpr_consent",r.consent.gdpr),void 0!==r.consent.gdprApplies&&o.searchParams.set("gdpr",Number(r.consent.gdprApplies).toString()),r.readOnly&&o.searchParams.set("ro","true"),s)o.searchParams.set("cookies","yes");else{const t=new A(r).getPassport();o.searchParams.set("cookies","no"),o.searchParams.set("passport",t||"")}const a={...i};return a.credentials=r.consent.deviceAccess?"include":"omit",r.mockedIP&&(a.headers=new Headers(a.headers),a.headers.set("X-Forwarded-For",r.mockedIP)),new Request(o.toString(),a)}(e,r,i)),s=n.headers.get("Content-Type"),o=s?.startsWith("application/json")?await n.json():await n.text();if(!n.ok)throw new Error(o.error);return o.passport&&(new A(r).setPassport(o.passport),delete o.passport),o}var b,P,E,I=((P=I||{})[P.Banner=1]="Banner",P[P.Video=2]="Video",P[P.Audio=3]="Audio",P[P.Native=4]="Native",P),_={},T={},C={};(E=b||(b={})).Placement=T,E.Media=C,E.Context=_;const k={cookies:!0,initPassport:!0,readOnly:!1,experiments:[],consent:{reg:null,deviceAccess:!0,createProfilesForAdvertising:!0,useProfilesForAdvertising:!0,measureAdvertisingPerformance:!0}};function D(){const t=new Uint8Array(16);return crypto.getRandomValues(t),btoa(String.fromCharCode(...t)).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function O(t){return{user:{data:(t?.audience??[]).map((t=>({name:t.provider,segment:t.ids,ext:{segtax:t.rtb_segtax}}))),ext:{eids:(t?.user??[]).map((t=>({source:t.provider,uids:t.ids.map((t=>{let{id:e}=t;return{id:e,atype:3}}))})))}}}}function x(t){const e={};if(!t)return e;for(const r of t.audience??[])r.keyspace&&(r.keyspace in e||(e[r.keyspace]=[]),e[r.keyspace].push(...r.ids.map((t=>t.id))));return e}var K=r(312);class N{constructor(t){i(this,"dcn",void 0),i(this,"init",void 0),this.dcn=function(t){const e={host:t.host,site:t.site,optableCacheTargeting:t.optableCacheTargeting??"optable-cache:targeting",cookies:t.cookies??k.cookies,initPassport:t.initPassport??k.initPassport,consent:k.consent,readOnly:t.readOnly??k.readOnly,node:t.node,legacyHostCache:t.legacyHostCache,experiments:t.experiments??k.experiments,mockedIP:t.mockedIP,sessionID:t.sessionID??D(),skipEnrichment:t.skipEnrichment,initTargeting:t.initTargeting,abTests:t.abTests};return t.consent?.static?e.consent=t.consent.static:t.consent?.cmpapi&&(e.consent=p(function(){const t=Intl.DateTimeFormat().resolvedOptions().timeZone,e=s[t];return"can"===e?["fr","fr-CA"].some((t=>navigator.languages.includes(t)))?"can":null:e??null}(),t.consent.cmpapi)),e}(t),this.init=this.initialize()}async initialize(){this.dcn.initPassport&&await n(this.dcn).catch((()=>{})),this.dcn.initTargeting&&this.targeting().catch((()=>{}))}async identify(){await this.init;for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];return function(t,e){return S("/identify",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}(this.dcn,e.filter((t=>t)))}async uid2Token(t){return await this.init,function(t,e){return S("/uid2/token",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})}(this.dcn,t)}async targeting(){const t=function(t){if("string"==typeof t)return{ids:[t],hids:[]};if(null!==(e=t)&&"object"==typeof e&&!Array.isArray(e))return{ids:t?.ids??[],hids:t?.hids??[]};var e;throw"Invalid request type for targeting. Expected string or object."}(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"__passport__");if(t.ids.length>1&&!this.dcn.experiments.includes("targeting-cascade"))throw"Targeting multiple IDs is only available with the 'targeting-cascade' experiment enabled.";return await this.init,async function(t,e){const r=new URLSearchParams;e.ids.forEach((t=>r.append("id",t))),e.hids.forEach((t=>r.append("hid",t)));const i=function(t){if(!t||0===t.length)return null;if(t.reduce(((t,e)=>t+e.trafficPercentage),0)>100)return console.error("AB Test Config Error: Traffic Percentage Sum Exceeds 100%"),null;const e=Math.floor(100*Math.random());let r=0;for(const i of t)if(r+=i.trafficPercentage,e<r)return i;return null}(t.abTests);i&&(r.append("ab_test_id",i.id),i.matcher_override)&&[...i.matcher_override].sort(((t,e)=>t.rank-e.rank)).forEach((t=>{r.append("matcher_override",t.id)}));const n="/v2/targeting?"+r.toString(),s=await S(n,t,{method:"GET",headers:{Accept:"application/json"}});return s&&(new A(t).setTargeting(s),function(t,e){const r=e.ortb2?.user?.eids?.map((t=>t.matcher));window.dispatchEvent(new CustomEvent("optable-targeting:change",{detail:{instance:t.node||t.host,resolved:!!e.ortb2?.user?.eids?.length,resolvedIDs:e.resolved_ids??[],ortb2:e.ortb2,provenance:new Set(r)}}))}(t,s)),s}(this.dcn,t)}targetingFromCache(){return t=this.dcn,new A(t).getTargeting();var t}async site(){return n(this.dcn)}siteFromCache(){return t=this.dcn,new A(t).getSite();var t}targetingClearCache(){var t;t=this.dcn,new A(t).clearTargeting()}async prebidORTB2(){return O(await this.targeting())}prebidORTB2FromCache(){return O(this.targetingFromCache())}async targetingKeyValues(){return x(await this.targeting())}targetingKeyValuesFromCache(){return x(this.targetingFromCache())}async witness(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return await this.init,function(t,e,r){const i={event:e,properties:r};return S("/witness",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}(this.dcn,t,e)}async profile(t){return await this.init,function(t,e){const r={traits:e};return S("/profile",t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r)})}(this.dcn,t)}async tokenize(t){return await this.init,function(t,e){let r="/v1/tokenize";t.experiments.includes("tokenize-v2")&&(r="/v2/tokenize");let i={id:e};return S(r,t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}(this.dcn,t)}async resolve(t){return await this.init,async function(t,e){const r=new URLSearchParams;"string"==typeof e&&r.append("id",e);const i="/v1/resolve?"+r.toString();return function(t){const e={clusters:[],lmpid:""};if("object"!=typeof t||null===t)return e;if("lmpid"in t&&"string"==typeof t?.lmpid&&(e.lmpid=t.lmpid),!("clusters"in t)||!Array.isArray(t?.clusters))return e;for(const r of t.clusters){const t={ids:[],traits:[]};if(Array.isArray(r?.ids))for(const e of r.ids)"string"==typeof e&&t.ids.push(e);if(Array.isArray(r?.traits))for(const e of r.traits)"string"==typeof e?.key&&"string"==typeof e?.value&&t.traits.push({key:e.key,value:e.value});(t.ids.length>0||t.traits.length>0)&&e.clusters.push(t)}return e}(await S(i,t,{method:"GET",headers:{Accept:"application/json"}}))}(this.dcn,t)}static eid(t){return t?"e:"+K.sha256.hex(t.toLowerCase().trim()):""}static sha256(t){return t?K.sha256.hex(t):""}static cid(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,r="c:";if("string"!=typeof t)throw new Error("Invalid ppid");if("number"!=typeof e||isNaN(e)||e<0||e>19)throw new Error("Invalid variant");return e>0&&(r=`c${e}:`),t?r+t.trim():""}static TargetingKeyValues(t){return x(t)}static PrebidORTB2(t){return O(t)}}i(N,"version",t.r);const B=N;function V(t){return{advertiserId:t.advertiserId?.toString(),campaignId:t.campaignId?.toString(),creativeId:t.creativeId?.toString(),isEmpty:t.isEmpty?.toString(),lineItemId:t.lineItemId?.toString(),serviceName:t.serviceName?.toString(),size:t.size?.toString(),slotElementId:t.slot?.getSlotElementId(),sourceAgnosticCreativeId:t.sourceAgnosticCreativeId?.toString(),sourceAgnosticLineItemId:t.sourceAgnosticLineItemId?.toString()}}B.prototype.installGPTEventListeners=function(){const t=this;t.installGPTEventListeners=function(){},window.googletag=window.googletag||{cmd:[]};const e=window.googletag;e.cmd.push((function(){e.pubads().addEventListener("slotRenderEnded",(function(e){t.witness("googletag.events.slotRenderEnded",V(e))})),e.pubads().addEventListener("impressionViewable",(function(e){t.witness("googletag.events.impressionViewable",V(e))}))}))},B.prototype.installGPTSecureSignals=function(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];window.googletag=window.googletag||{cmd:[]};const i=window.googletag;e&&e.length>0&&i.cmd.push((()=>{e.forEach((t=>{let{provider:e,id:r}=t;i.secureSignalProviders.push({id:e,collectorFunction:()=>Promise.resolve(r)})}))}))};const L=/^[a-f0-9]{64}$/i;B.prototype.tryIdentifyFromParams=function(t,e){const r=new RegExp(`^${t||"oeid"}$`,"i"),i=new URLSearchParams(window.location.search);let n="";for(const[t,e]of i)if(r.test(t)){n=e;break}""!=n&&(e||function(t){return L.test(t)}(n))&&this.identify((e||"e")+":"+n.toLowerCase())},B.prototype.auctionConfig=async function(){await this.init;let t=this.siteFromCache();return t||(t=await this.site()),t.auctionConfig??null},B.prototype.installGPTAuctionConfigs=async function(t){this.installGPTAuctionConfigs=function(){return Promise.resolve()};const e=await this.auctionConfig();if(!e)return;window.googletag=window.googletag||{cmd:[]};const r=window.googletag;r.cmd.push((function(){let i=r.pubads().getSlots();t&&(i=i.filter(t));for(const t of i){const r=t.getSizes(),i=[];for(const t of r)"fluid"!==t&&i.push({configKey:e.seller+"-"+t.getWidth()+"x"+t.getHeight(),auctionConfig:{...e,requestedSize:{width:t.getWidth()+"px",height:t.getHeight()+"px"}}});t.setConfig({componentAuction:i})}}))},B.prototype.runAdAuction=async function(t,e){if(!("runAdAuction"in navigator))throw"run-ad-auction not supported";const r=document.getElementById(t);if(!r)throw"spot not found";const i=function(t){const e=window.getComputedStyle(t,null);return{width:e.getPropertyValue("width"),height:e.getPropertyValue("height")}}(r),n=await this.auctionConfig();if(!n)return!1;const s={...n,requestedSize:i,resolveToConfig:!0},o=e?.iframe??!1;o&&(s.resolveToConfig=!1);const a=await navigator.runAdAuction(s);if(!a)return r.replaceChildren(),!1;if(o){const t=document.createElement("iframe");t.src=a,t.style.border="none",t.style.width=i.width,t.style.height=i.height,r.replaceChildren(t)}else{const t=document.createElement("fencedframe");t.config=a,t.style.border="none",r.replaceChildren(t)}return!0},B.prototype.joinAdInterestGroups=async function(){if(!("joinAdInterestGroup"in navigator))throw"join-ad-interest-group not supported";if(!(this.dcn.consent.deviceAccess&&this.dcn.consent.createProfilesForAdvertising&&this.dcn.consent.measureAdvertisingPerformance))throw"consent not granted for joining interest groups";await this.init;let t=this.siteFromCache();if(t||(t=await this.site()),!t.interestGroupPixel)throw"origin not enabled for protected audience apis";const e=new URL(t.interestGroupPixel),r=document.createElement("iframe");r.src=e.toString(),r.allow="join-ad-interest-group "+e.origin,r.style.display="none";const i=new Promise(((t,e)=>{window.addEventListener("message",(i=>{i.source===r.contentWindow&&("success"!==i.data.result?e():t())}))}));return document.body.appendChild(r),i},B.prototype.getTopics=async function(){if(!("browsingTopics"in document))throw"browsing-topics not supported";if(!this.dcn.consent.deviceAccess)throw"consent not granted for reading browsing topics";await this.init;let t=this.siteFromCache();if(t||(t=await this.site()),!t.getTopicsURL)throw"origin not enabled for topics api";const e=new URL(t.getTopicsURL),r=document.createElement("iframe");r.src=e.toString(),r.allow="browsing-topics "+e.origin,r.style.display="none";const i=new Promise(((t,e)=>{window.addEventListener("message",(i=>{i.source===r.contentWindow&&(i.data.error?e(new Error(i.data.error.toString())):t(i.data.result))}))}));return document.body.appendChild(r),i},B.prototype.ingestTopics=function(){this.getTopics().then((t=>{if(!t.length)return;const e=t.reduce(((t,e)=>{const r=`topics_v${e.taxonomyVersion}`;return t[r]?t[r]+=",":t[r]="",t[r]+=String(e.topic),t}),{});this.profile(e)})).catch((()=>{}))},window.optable=window.optable||{},window.optable.SDK=B,window.optable.cmd=new class{constructor(t){if(this.cmds=t,Array.isArray(this.cmds))for(const t of this.cmds)"function"==typeof t&&t()}push(t){t()}}(window.optable.cmd||[]),window.optable.utils={resolveMultiNodeTargeting:async function(t){return t?t.some((t=>t.priority))?async function(t){const e=new Set,r={user:{data:[],eids:[]}},i=new Map,n=new Map;const s=t.map((t=>{let{targetingFn:e,matcher:s,mm:o,priority:a}=t;return e().then((t=>function(t,e,s){let o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;const a=Math.max(0,o),{data:c=[],eids:d=[]}=t.ortb2?.user??{};r.user.data.push(...c),d.filter((t=>t.uids.length)).forEach((t=>{let{ext:r,...o}=t;const c=o.matcher??e,d=i.get(a)??[];c&&i.set(a,[...d,c]);const u=n.get(a)??[];n.set(a,[...u,{...o,matcher:o.matcher??e,mm:o.mm??s}])}))}(t,s,o,a)))}));await Promise.allSettled(s);const o=Array.from(n.keys()).sort(((t,e)=>t-e)).filter((t=>n.get(t)?.length)).shift();if(o){const t=i.get(o)||[];r.user.eids.push(...n.get(o)||[]),t.forEach((t=>e.add(t)))}return{ortb2:r,eidSources:e}}(t):async function(t){const e=new Set,r={user:{data:[],eids:[]}};const i=t.map((t=>{let{targetingFn:i,matcher:n,mm:s}=t;return i().then((t=>function(t,i,n){const{data:s=[],eids:o=[]}=t.ortb2?.user??{};r.user.data.push(...s),o.filter((t=>t.uids.length)).forEach((t=>{let{ext:s,...o}=t;const a=o.matcher??i;a&&e.add(a),r.user.eids.push({...o,mm:o.mm??n,matcher:o.matcher??i})}))}(t,n,s)))}));return await Promise.allSettled(i),{ortb2:r,eidSources:e}}(t):Promise.reject("No targeting rules provided")}},window.optable.instance_config&&(window.optable.instance=new B(window.optable.instance_config))})()})();
|
package/lib/dist/build.json
CHANGED
package/lib/dist/config.d.ts
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import type { CMPApiConfig, Consent } from "./core/regs/consent";
|
|
2
2
|
type Experiment = "tokenize-v2" | "targeting-cascade";
|
|
3
|
+
type MatcherOverride = {
|
|
4
|
+
id: string;
|
|
5
|
+
rank: number;
|
|
6
|
+
};
|
|
7
|
+
type ABTestConfig = {
|
|
8
|
+
id: string;
|
|
9
|
+
trafficPercentage: number;
|
|
10
|
+
matcher_override?: MatcherOverride[];
|
|
11
|
+
};
|
|
3
12
|
type InitConsent = {
|
|
4
13
|
cmpapi?: CMPApiConfig;
|
|
5
14
|
static?: Consent;
|
|
@@ -19,6 +28,7 @@ type InitConfig = {
|
|
|
19
28
|
skipEnrichment?: boolean;
|
|
20
29
|
initTargeting?: boolean;
|
|
21
30
|
optableCacheTargeting?: string;
|
|
31
|
+
abTests?: ABTestConfig[];
|
|
22
32
|
};
|
|
23
33
|
type ResolvedConfig = {
|
|
24
34
|
site: string;
|
|
@@ -35,6 +45,7 @@ type ResolvedConfig = {
|
|
|
35
45
|
sessionID: string;
|
|
36
46
|
skipEnrichment?: boolean;
|
|
37
47
|
initTargeting?: boolean;
|
|
48
|
+
abTests?: ABTestConfig[];
|
|
38
49
|
};
|
|
39
50
|
declare const DCN_DEFAULTS: {
|
|
40
51
|
cookies: boolean;
|
|
@@ -51,5 +62,5 @@ declare const DCN_DEFAULTS: {
|
|
|
51
62
|
};
|
|
52
63
|
declare function getConfig(init: InitConfig): ResolvedConfig;
|
|
53
64
|
declare function generateSessionID(): string;
|
|
54
|
-
export type { InitConsent, CMPApiConfig, InitConfig, ResolvedConfig };
|
|
65
|
+
export type { InitConsent, CMPApiConfig, InitConfig, ResolvedConfig, ABTestConfig, MatcherOverride };
|
|
55
66
|
export { getConfig, DCN_DEFAULTS, generateSessionID };
|
package/lib/dist/config.js
CHANGED
|
@@ -29,6 +29,7 @@ function getConfig(init) {
|
|
|
29
29
|
sessionID: (_f = init.sessionID) !== null && _f !== void 0 ? _f : generateSessionID(),
|
|
30
30
|
skipEnrichment: init.skipEnrichment,
|
|
31
31
|
initTargeting: init.initTargeting,
|
|
32
|
+
abTests: init.abTests,
|
|
32
33
|
};
|
|
33
34
|
if ((_g = init.consent) === null || _g === void 0 ? void 0 : _g.static) {
|
|
34
35
|
config.consent = init.consent.static;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
const targetingEventName = "optable-targeting:change";
|
|
2
2
|
function sendTargetingUpdateEvent(config, response) {
|
|
3
|
-
var _a, _b, _c, _d, _e, _f;
|
|
3
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
4
4
|
const matchers = (_c = (_b = (_a = response.ortb2) === null || _a === void 0 ? void 0 : _a.user) === null || _b === void 0 ? void 0 : _b.eids) === null || _c === void 0 ? void 0 : _c.map((x) => x.matcher);
|
|
5
5
|
window.dispatchEvent(new CustomEvent(targetingEventName, {
|
|
6
6
|
detail: {
|
|
7
7
|
instance: config.node || config.host,
|
|
8
8
|
resolved: !!((_f = (_e = (_d = response.ortb2) === null || _d === void 0 ? void 0 : _d.user) === null || _e === void 0 ? void 0 : _e.eids) === null || _f === void 0 ? void 0 : _f.length),
|
|
9
|
+
resolvedIDs: (_g = response.resolved_ids) !== null && _g !== void 0 ? _g : [],
|
|
9
10
|
ortb2: response.ortb2,
|
|
10
11
|
provenance: new Set(matchers),
|
|
11
12
|
},
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { inferRegulation } from "./regulations";
|
|
2
2
|
import * as gpp from "./gpp";
|
|
3
|
+
import * as tcf from "./tcf";
|
|
3
4
|
function applicableReg(defaultReg, cmp) {
|
|
4
5
|
const { gdprApplies, gppSectionIDs, gdprData } = cmp;
|
|
5
6
|
// Handle TCF signaling (preferred over GPP)
|
|
@@ -102,6 +103,8 @@ function computeConsent(defaultReg, cmp, conf = {}) {
|
|
|
102
103
|
}
|
|
103
104
|
function getConsent(defaultReg, conf = {}) {
|
|
104
105
|
const cmp = {};
|
|
106
|
+
tcf.cmpapi.installFrameProxy();
|
|
107
|
+
gpp.cmpapi.installFrameProxy();
|
|
105
108
|
const consent = computeConsent(defaultReg, cmp, conf);
|
|
106
109
|
onTCFChange((data) => {
|
|
107
110
|
cmp.gdprString = data.tcString;
|
|
@@ -43,4 +43,6 @@ type AddEventListener = {
|
|
|
43
43
|
pingData: PingReturn;
|
|
44
44
|
};
|
|
45
45
|
type AddEventListenerCallback = (data: AddEventListener, success: boolean) => void;
|
|
46
|
-
|
|
46
|
+
declare function installFrameProxy(): void;
|
|
47
|
+
export type { PingReturn };
|
|
48
|
+
export { installFrameProxy };
|
|
@@ -1 +1,66 @@
|
|
|
1
1
|
import * as sections from "./sections";
|
|
2
|
+
// installFrameProxy is a helper function that attempts to install
|
|
3
|
+
// a proxy for the CMP API. This is required when the CMP API is installed
|
|
4
|
+
// in a parent frame (eg when the SDK is loaded in an iframe).
|
|
5
|
+
// See https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#using-postmessage
|
|
6
|
+
//
|
|
7
|
+
// To do so, this function looks for a ancestor frame named __gppLocator and communicates
|
|
8
|
+
// with it using postMessage by mocking window.__gpp.
|
|
9
|
+
function installFrameProxy() {
|
|
10
|
+
// Already there, might be installed by ourselves or a CMP script
|
|
11
|
+
if (typeof window.__gpp === "function") {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
let cmpFrame;
|
|
15
|
+
const cmpCallbacks = {};
|
|
16
|
+
let frame = window;
|
|
17
|
+
while (frame) {
|
|
18
|
+
// throws a reference error if no frames exist
|
|
19
|
+
try {
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
if (frame.frames["__gppLocator"]) {
|
|
22
|
+
cmpFrame = frame;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
catch (_a) {
|
|
27
|
+
// ignore
|
|
28
|
+
}
|
|
29
|
+
if (frame === window.top) {
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
// @ts-ignore
|
|
33
|
+
frame = frame.parent;
|
|
34
|
+
}
|
|
35
|
+
// No CMP frame found
|
|
36
|
+
if (!cmpFrame) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Install the API that forwards to the CMP frame
|
|
40
|
+
window.__gpp = function (command, callback) {
|
|
41
|
+
const callId = Math.random() + "";
|
|
42
|
+
cmpCallbacks[callId] = callback;
|
|
43
|
+
cmpFrame.postMessage({ __gppCall: { command, version: "1.1", callId } }, "*");
|
|
44
|
+
};
|
|
45
|
+
// Receive responses
|
|
46
|
+
window.addEventListener("message", (event) => {
|
|
47
|
+
let json = {};
|
|
48
|
+
try {
|
|
49
|
+
json = typeof event.data === "string" ? JSON.parse(event.data) : event.data;
|
|
50
|
+
}
|
|
51
|
+
catch (_a) {
|
|
52
|
+
// ignore
|
|
53
|
+
}
|
|
54
|
+
const payload = json.__gppReturn;
|
|
55
|
+
if (!payload) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (typeof cmpCallbacks[payload.callId] === "function") {
|
|
59
|
+
// Call the callback
|
|
60
|
+
cmpCallbacks[payload.callId](payload.returnValue, payload.success);
|
|
61
|
+
// Remove the callback
|
|
62
|
+
delete cmpCallbacks[payload.callId];
|
|
63
|
+
}
|
|
64
|
+
}, false);
|
|
65
|
+
}
|
|
66
|
+
export { installFrameProxy };
|
|
@@ -1 +1,65 @@
|
|
|
1
|
-
|
|
1
|
+
// installFrameProxy is a helper function that attempts to install
|
|
2
|
+
// a proxy for the CMP API. This is required when the CMP API is installed
|
|
3
|
+
// in a parent frame (eg when the SDK is loaded in an iframe).
|
|
4
|
+
// See https://github.com/InteractiveAdvertisingBureau/GDPR-Transparency-and-Consent-Framework/blob/master/TCFv2/IAB%20Tech%20Lab%20-%20CMP%20API%20v2.md#using-postmessage
|
|
5
|
+
//
|
|
6
|
+
// To do so, this function looks for a ancestor frame named __tcfapiLocator and communicates
|
|
7
|
+
// with it using postMessage by mocking window.__tcfapi.
|
|
8
|
+
function installFrameProxy() {
|
|
9
|
+
// Already there, might be installed by ourselves or a CMP script
|
|
10
|
+
if (typeof window.__tcfapi === "function") {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
let cmpFrame;
|
|
14
|
+
const cmpCallbacks = {};
|
|
15
|
+
let frame = window;
|
|
16
|
+
while (frame) {
|
|
17
|
+
// throws a reference error if no frames exist
|
|
18
|
+
try {
|
|
19
|
+
// @ts-ignore
|
|
20
|
+
if (frame.frames["__tcfapiLocator"]) {
|
|
21
|
+
cmpFrame = frame;
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch (_a) {
|
|
26
|
+
// ignore
|
|
27
|
+
}
|
|
28
|
+
if (frame === window.top) {
|
|
29
|
+
break;
|
|
30
|
+
}
|
|
31
|
+
// @ts-ignore
|
|
32
|
+
frame = frame.parent;
|
|
33
|
+
}
|
|
34
|
+
// No CMP frame found
|
|
35
|
+
if (!cmpFrame) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
// Install the API that forwards to the CMP frame
|
|
39
|
+
window.__tcfapi = function (command, version, callback) {
|
|
40
|
+
const callId = Math.random() + "";
|
|
41
|
+
cmpCallbacks[callId] = callback;
|
|
42
|
+
cmpFrame.postMessage({ __tcfapiCall: { command, version, callId } }, "*");
|
|
43
|
+
};
|
|
44
|
+
// Receive responses
|
|
45
|
+
window.addEventListener("message", (event) => {
|
|
46
|
+
let json = {};
|
|
47
|
+
try {
|
|
48
|
+
json = typeof event.data === "string" ? JSON.parse(event.data) : event.data;
|
|
49
|
+
}
|
|
50
|
+
catch (_a) {
|
|
51
|
+
// ignore
|
|
52
|
+
}
|
|
53
|
+
const payload = json.__tcfapiReturn;
|
|
54
|
+
if (!payload) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (typeof cmpCallbacks[payload.callId] === "function") {
|
|
58
|
+
// Call the callback
|
|
59
|
+
cmpCallbacks[payload.callId](payload.returnValue, payload.success);
|
|
60
|
+
// Remove the callback
|
|
61
|
+
delete cmpCallbacks[payload.callId];
|
|
62
|
+
}
|
|
63
|
+
}, false);
|
|
64
|
+
}
|
|
65
|
+
export { installFrameProxy };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ResolvedConfig } from "../config";
|
|
1
|
+
import type { ResolvedConfig, ABTestConfig, MatcherOverride } from "../config";
|
|
2
2
|
import * as ortb2 from "iab-openrtb/v26";
|
|
3
3
|
type Identifier = {
|
|
4
4
|
id: string;
|
|
@@ -13,14 +13,20 @@ type UserIdentifiers = {
|
|
|
13
13
|
ids: Identifier[];
|
|
14
14
|
provider: string;
|
|
15
15
|
};
|
|
16
|
+
type TargetingRequest = {
|
|
17
|
+
ids: string[];
|
|
18
|
+
hids: string[];
|
|
19
|
+
};
|
|
16
20
|
type TargetingResponse = {
|
|
17
21
|
audience?: AudienceIdentifiers[];
|
|
18
22
|
user?: UserIdentifiers[];
|
|
19
23
|
ortb2: {
|
|
20
24
|
user: ortb2.User;
|
|
21
25
|
};
|
|
26
|
+
resolved_ids?: string[];
|
|
22
27
|
};
|
|
23
|
-
declare function
|
|
28
|
+
declare function determineABTest(abTests?: ABTestConfig[]): ABTestConfig | null;
|
|
29
|
+
declare function Targeting(config: ResolvedConfig, req: TargetingRequest): Promise<TargetingResponse>;
|
|
24
30
|
declare function TargetingFromCache(config: ResolvedConfig): TargetingResponse | null;
|
|
25
31
|
declare function TargetingClearCache(config: ResolvedConfig): void;
|
|
26
32
|
type PrebidORTB2 = {
|
|
@@ -29,6 +35,6 @@ type PrebidORTB2 = {
|
|
|
29
35
|
declare function PrebidORTB2(tdata: TargetingResponse | null): PrebidORTB2;
|
|
30
36
|
type TargetingKeyValues = Record<string, string[]>;
|
|
31
37
|
declare function TargetingKeyValues(tdata: TargetingResponse | null): TargetingKeyValues;
|
|
32
|
-
export { Targeting, TargetingFromCache, TargetingClearCache, PrebidORTB2, TargetingKeyValues };
|
|
38
|
+
export { Targeting, TargetingFromCache, TargetingClearCache, PrebidORTB2, TargetingKeyValues, determineABTest };
|
|
33
39
|
export default Targeting;
|
|
34
|
-
export type { TargetingResponse };
|
|
40
|
+
export type { TargetingResponse, TargetingRequest, ABTestConfig, MatcherOverride };
|
|
@@ -11,9 +11,44 @@ import { fetch } from "../core/network";
|
|
|
11
11
|
import { LocalStorage } from "../core/storage";
|
|
12
12
|
import * as adcom from "iab-adcom";
|
|
13
13
|
import { sendTargetingUpdateEvent } from "../core/events/cache-refresh";
|
|
14
|
-
|
|
14
|
+
// Determine which A/B test (if any) should be used for this request
|
|
15
|
+
function determineABTest(abTests) {
|
|
16
|
+
if (!abTests || abTests.length === 0) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
// Skip A/B testing if traffic percentage sum exceeds 100%
|
|
20
|
+
const totalTrafficPercentage = abTests.reduce((sum, test) => sum + test.trafficPercentage, 0);
|
|
21
|
+
if (totalTrafficPercentage > 100) {
|
|
22
|
+
console.error(`AB Test Config Error: Traffic Percentage Sum Exceeds 100%`);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
// Simple random number 0-99
|
|
26
|
+
const bucket = Math.floor(Math.random() * 100);
|
|
27
|
+
let cumulative = 0;
|
|
28
|
+
for (const test of abTests) {
|
|
29
|
+
cumulative += test.trafficPercentage;
|
|
30
|
+
if (bucket < cumulative) {
|
|
31
|
+
return test;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
function Targeting(config, req) {
|
|
15
37
|
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
-
const searchParams = new URLSearchParams(
|
|
38
|
+
const searchParams = new URLSearchParams();
|
|
39
|
+
req.ids.forEach((id) => searchParams.append("id", id));
|
|
40
|
+
req.hids.forEach((id) => searchParams.append("hid", id));
|
|
41
|
+
const abTest = determineABTest(config.abTests);
|
|
42
|
+
if (abTest) {
|
|
43
|
+
searchParams.append("ab_test_id", abTest.id);
|
|
44
|
+
if (abTest.matcher_override) {
|
|
45
|
+
// Sort by rank to ensure proper order
|
|
46
|
+
const sortedOverrides = [...abTest.matcher_override].sort((a, b) => a.rank - b.rank);
|
|
47
|
+
sortedOverrides.forEach((override) => {
|
|
48
|
+
searchParams.append("matcher_override", override.id);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
17
52
|
const path = "/v2/targeting?" + searchParams.toString();
|
|
18
53
|
const response = yield fetch(path, config, {
|
|
19
54
|
method: "GET",
|
|
@@ -69,5 +104,5 @@ function TargetingKeyValues(tdata) {
|
|
|
69
104
|
}
|
|
70
105
|
return result;
|
|
71
106
|
}
|
|
72
|
-
export { Targeting, TargetingFromCache, TargetingClearCache, PrebidORTB2, TargetingKeyValues };
|
|
107
|
+
export { Targeting, TargetingFromCache, TargetingClearCache, PrebidORTB2, TargetingKeyValues, determineABTest };
|
|
73
108
|
export default Targeting;
|
package/lib/dist/sdk.d.ts
CHANGED
|
@@ -4,11 +4,8 @@ import type { ProfileTraits } from "./edge/profile";
|
|
|
4
4
|
import { Uid2TokenResponse } from "./edge/uid2_token";
|
|
5
5
|
import { ResolveResponse } from "./edge/resolve";
|
|
6
6
|
import { SiteResponse } from "./edge/site";
|
|
7
|
-
import { TargetingKeyValues, TargetingResponse, PrebidORTB2 } from "./edge/targeting";
|
|
7
|
+
import { TargetingKeyValues, TargetingResponse, TargetingRequest, PrebidORTB2 } from "./edge/targeting";
|
|
8
8
|
import { TokenizeResponse } from "./edge/tokenize";
|
|
9
|
-
type TargetingRequest = string | {
|
|
10
|
-
ids?: string[];
|
|
11
|
-
};
|
|
12
9
|
declare class OptableSDK {
|
|
13
10
|
static version: string;
|
|
14
11
|
dcn: ResolvedConfig;
|
|
@@ -17,7 +14,7 @@ declare class OptableSDK {
|
|
|
17
14
|
initialize(): Promise<void>;
|
|
18
15
|
identify(...ids: string[]): Promise<void>;
|
|
19
16
|
uid2Token(id: string): Promise<Uid2TokenResponse>;
|
|
20
|
-
targeting(
|
|
17
|
+
targeting(input?: string | TargetingRequest): Promise<TargetingResponse>;
|
|
21
18
|
targetingFromCache(): TargetingResponse | null;
|
|
22
19
|
site(): Promise<SiteResponse>;
|
|
23
20
|
siteFromCache(): SiteResponse | null;
|
|
@@ -36,6 +33,7 @@ declare class OptableSDK {
|
|
|
36
33
|
static TargetingKeyValues(tdata: TargetingResponse): TargetingKeyValues;
|
|
37
34
|
static PrebidORTB2(tdata: TargetingResponse): PrebidORTB2;
|
|
38
35
|
}
|
|
39
|
-
|
|
36
|
+
declare function normalizeTargetingRequest(input: string | TargetingRequest): TargetingRequest;
|
|
37
|
+
export { OptableSDK, normalizeTargetingRequest };
|
|
40
38
|
export type { InitConfig };
|
|
41
39
|
export default OptableSDK;
|
package/lib/dist/sdk.js
CHANGED
|
@@ -46,13 +46,13 @@ class OptableSDK {
|
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
targeting() {
|
|
49
|
-
return __awaiter(this, arguments, void 0, function* (
|
|
50
|
-
const
|
|
51
|
-
if (ids.length > 1 && !this.dcn.experiments.includes("targeting-cascade")) {
|
|
49
|
+
return __awaiter(this, arguments, void 0, function* (input = "__passport__") {
|
|
50
|
+
const request = normalizeTargetingRequest(input);
|
|
51
|
+
if (request.ids.length > 1 && !this.dcn.experiments.includes("targeting-cascade")) {
|
|
52
52
|
throw "Targeting multiple IDs is only available with the 'targeting-cascade' experiment enabled.";
|
|
53
53
|
}
|
|
54
54
|
yield this.init;
|
|
55
|
-
return Targeting(this.dcn,
|
|
55
|
+
return Targeting(this.dcn, request);
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
targetingFromCache() {
|
|
@@ -138,5 +138,18 @@ class OptableSDK {
|
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
OptableSDK.version = buildInfo.version;
|
|
141
|
-
|
|
141
|
+
function normalizeTargetingRequest(input) {
|
|
142
|
+
var _a, _b;
|
|
143
|
+
if (typeof input === "string") {
|
|
144
|
+
return { ids: [input], hids: [] };
|
|
145
|
+
}
|
|
146
|
+
if (isObject(input)) {
|
|
147
|
+
return { ids: (_a = input === null || input === void 0 ? void 0 : input.ids) !== null && _a !== void 0 ? _a : [], hids: (_b = input === null || input === void 0 ? void 0 : input.hids) !== null && _b !== void 0 ? _b : [] };
|
|
148
|
+
}
|
|
149
|
+
throw "Invalid request type for targeting. Expected string or object.";
|
|
150
|
+
}
|
|
151
|
+
function isObject(val) {
|
|
152
|
+
return val !== null && typeof val === "object" && !Array.isArray(val);
|
|
153
|
+
}
|
|
154
|
+
export { OptableSDK, normalizeTargetingRequest };
|
|
142
155
|
export default OptableSDK;
|
package/package.json
CHANGED